Command Injection
커멘트 인젝션(Command Injection)이란 명령어를 삽인한다는 뜻으로, 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 샐행하도록 하는 공격이다.
input 박스에 ip 주소를 입력하면 해당 ip주소로 ping명령어를 실행한 후 그 결과를 리턴해 주는 페이지이다.
일단 로컬 ip주소(127.0.0.1)을 입력하고 실행해 보겠다.
그림 2와 같이 ping명령어를 실행한 결과를 출력한다.
소스코드를 한번 살펴보겠다.
소스코드
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
소스코드를 살펴 보면 shell_exex()라는 함수가 호출된다. 이 함수는 시스템 명령어를 내리는 함수이다.
ping 뒤에 $target이라는 변수가 오는데, 이 변수는 우리가 입력한 값이다. 하지만 소스코드에는 우리가 입력한 값을 검증을 하는 부분이 없으므로 취약하다.
리눅스에서 ;(세미콜론)을 이용하여 뒤에 다른 명령어를 실행할 수 있다.
예를들어 ping -c 4 127.0.0.1;ls를 실행하면, ping명령어가 실행된 후 ls 명령어가 실행되어 디렉터리의 내용을 출력한다.
그림 3 처럼 세미콜론을 이용하여 원격 호스트를 대상으로 시스템 명령어를 사용할 수 있다.
주소를 입력하지 않고 ;ls를 사용하면 디렉터리의 내용만 출력된다. 왜냐하면 ping -c 4 뒤에 주소가 없어서 오류를 출력하여 결과를 표시하지 않고 세미콜론 뒤에 ls명령어만 실행되기 때문이다.
그림 5 처럼 /etc/passwd 파일의 내용 또한 읽을 수 있다.
마지막으로 id명령어를 이용하여 사용자의 정보를 출력해 보겠다.
www-data의 권한으로 실행되고 있음을 알 수 있다.
만약 root 사용자의 권한으로 실행된다면, 공격자는 커멘드 인젝션 공격을 통해 루트 권한으로 모든 명령어를 실행할 수 있게되어 시스템을 완전히 장악하게 된다.
'WEB hacking > DVWA' 카테고리의 다른 글
[DVWA] - Insecure CAPTCHA 설정 (0) | 2022.10.12 |
---|---|
[DVWA] - Reflected Cross Site Scripting (XSS) Low 단계 (0) | 2022.10.11 |
[DVWA] - SQL Injection(Blind) Low 단계 (0) | 2022.10.09 |
[DVWA] - SQL Injection Low 단계 (4) | 2022.10.08 |
[DVWA] - Brute Force Low 단계 (0) | 2022.10.07 |