사용자가 웹 서버에 요청한 URI의 변수 값에 대해 정상적인 입력 값 외에 추가적으로 시스템 명령을 삽입해 요청하는 경우 웹 서버가 이 요청을 일반 변수로 인식해 시스템 명령이 실행되는 취약점이다.
;exec master..xp_cmdshell 'ipconfig'
;/bin/ls -al
;system("cmd.exe dir c:\")
+|+ dir c:\
1번 구문은 MS-SQL의 확장 프로시저를 이용한 시스템 명령실행이고
2번 구문은 'system' 함수를 이용한 시스템 명령을 값으로 전달해 명령이 실행되게 하는것이다
실제 취약점을 확인하는 방법은 'http://도메인명/파일명?변수명=변수 값' 과 같은 GET 방식으로 구문을 삽입해 시스템 명령이 실행되는지 확인한다.
http://도메인명/download.php?filename=;/bin/ls -al
http://도메인명/download.php?filename=abc.txt;/bin/ls -al
GET 방식이 아닌 POST 방식으로 값을 전달 하는 경우 바디에 값을 삽입 한다.
db=freeboard filename=/bin/ls%20-al
POST 방식으로 값을 전달 하는경우 변수 크기에 제한이 없지만 헤더 부분의 컨텐츠 타입을 맞춰 주어야 한다.
언어 | 사용함수 |
---|---|
PHP | reqire(), include(), eval(), preg_replace()(/e 옵션과 함께 사용), exec(), passthru(), (backticks), system(), popen(), Shell Scrips 등 |
Perl | open(), sysopen(), glob(), system(), "(backticks), eval() 등 |
Java | System. *(특히 system, Runtime) |
소스코드에 운영체제 명령을 실행 할 수 있는 취약한 함수의 사용을 지양해야 하고, 변수 입력 값에 대해 입력 가능한 문자열을 지정한 수 지정한 문자열 이와의 나머지 문자열은 필터링을 해야한다. 또한 "|, ;"와 같이 다중 명령을 실행 할 수 있는 구분자도 필터링 해야한다.