4. 운영체제 명령 실행

O 적절한 검증절차를 거치지 않고 운영체제 명령어의 일부 또는 전부로 구성된 사용자 입력 값이 실행되어 권한 탈취 및 시스템에 대해 악영향이 발생할 수 있는 취약점


O 근거 자료

주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 (p.659)


O 판단 기준

양호임의의 명령어 입력에 대한 검증이 이루어지는 경우
취약임의의 명령어 입력에 대해 명령이 실행되는 경우


O 점검 방법

- 웹 어플리케이션 인수 값에 시스템 명령어 전달 시 입력 값에 대한 검증 없이 운영체제 명령어가 실행되는지 확인


O 조치 방법

- 운영체제로부터 명령어를 직접적으로 호출하지 않도록 구현

- 외부 입력에 따라 명령어 생성 및 선택이 필요한 경우 명령어 생성에 필요한 값들을 미리 지정하여 외부 입력에 따라 선택 사용

- 불가피하게 필요할 경우 입력 값에 대한 필터링 처리

: 입력 값에 대한 "&", "|", ";", "`" 문자에 대한 필터링 처리

# 필터링 문자 설명

&윈도우 명령어 해석기에서 첫번째 명령이 성공했을 경우만 두번째 명령어 실행
|첫번째 명령어가 성공하는지에 상관없이 두번째 명령어 실행
`쉘 해석기가 명령어를 해석 중 역 작은따옴표(`)내 명령어 먼저 실행


O 시큐어 코딩(Secure Coding) 예시

# JAVA (에러 처리) 
.....
String idx = request.getParameter("idx");
String cmd = "";

// 특정 값에 따른 시스템 명령어 실행 로직
if (idx == "1") {
    cmd = "시스템명령어1";
} else if (idx == "2") {
    cmd = "시스템명령어2";
} else if (idx == "3") {
    cmd = "시스템명령어3";
} else {
    /* 에러처리 로직 */
}

Process process = null;
Runtime runtime = Runtime.getRuntime();
process = runtime.exec(cmd);

.....


# JAVA (특수문자 필터링) 
String date = request.getParameter("date");
String command = new String("cmd.exe /c backuplog.bat");

// 외부로부터 입력 받은 값을 필터링을 통해 우회문자를 제거하여 사용한다. 
date = date.replaceAll("|","");
date = date.replaceAll(";","");
date = date.replaceAll("&","");
date = date.replaceAll(":","");
date = date.replaceAll(">",""); 

Runtime.getRuntime().exec(command + date);


# ASP (에러처리) 
// 특정 값에 따른 시스템 명령어 실행 로직
Select Case idx
    Case 1:
        cmd = "시스템 명령어1"
    Case 2:
        cmd = "시스템 명령어2"
    Case Else:
        /* 에러처리 로직 */
End Select
.....


# ASP (특수문자 필터링) 
.....
cmd = Request("cmd")

// 주요 특수문자 제거 로직
cmd = replace(cmd, "|", "")
cmd = replace(cmd, "&", "")
cmd = replace(cmd, ";", "")

.....


# PHP (에러처리) 
.....
$idx = $_GET["idx"];

// 특정 값에 따른 시스템 명령어 실행 로직
if ($idx == 1) {
    cmd = "시스템 명령어1";
} else if($idx == 2) {
    cmd = "시스템 명령어2";
} else if($idx == 3) {
    cmd = "시스템 명령어3";
} else {
    /* 에러처리 로직 */
}
.....


# PHP (특수문자 필터링) 
.....
$cmd = $_GET["cmd"];

// 주요 특수문자 제거 로직
$cmd = str_replace($cmd, ";", "");
$cmd = str_replace($cmd, "&", "");
$cmd = str_replace($cmd, "|", "");
.....