WEB hacking/DVWA

[DVWA] - Command Injection Low 단계

Roronoa 2022. 10. 10. 21:23
반응형

Command Injection

커멘트 인젝션(Command Injection)이란 명령어를 삽인한다는 뜻으로, 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 샐행하도록 하는 공격이다.

[그림 1] 커멘트 인젝션 페이지

input 박스에 ip 주소를 입력하면 해당 ip주소로 ping명령어를 실행한 후 그 결과를 리턴해 주는 페이지이다.

일단 로컬 ip주소(127.0.0.1)을 입력하고 실행해 보겠다.

 

[그림 2] 로컬호스트로 ping

그림 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] ;(세미콜론) 사용

그림 3 처럼 세미콜론을 이용하여 원격 호스트를 대상으로 시스템 명령어를 사용할 수 있다.

 

[그림 4] ;ls 사용

주소를 입력하지 않고 ;ls를 사용하면 디렉터리의 내용만 출력된다. 왜냐하면 ping -c 4 뒤에 주소가 없어서 오류를 출력하여 결과를 표시하지 않고 세미콜론 뒤에 ls명령어만 실행되기 때문이다.

 

[그림 5] cat /etc/passwd

그림 5 처럼 /etc/passwd 파일의 내용 또한 읽을 수 있다.

마지막으로 id명령어를 이용하여 사용자의 정보를 출력해 보겠다.

 

[그림 6] 사용자 정보 확인

www-data의 권한으로 실행되고 있음을 알 수 있다.

만약 root 사용자의 권한으로 실행된다면, 공격자는 커멘드 인젝션 공격을 통해 루트 권한으로 모든 명령어를 실행할 수 있게되어 시스템을 완전히 장악하게 된다.

반응형