상세 컨텐츠

본문 제목

DVWA : Command Injection - Medium level

Vulnerability Assessment/Web Application

by DarkSoul.Story 2024. 12. 29. 18:13

본문

반응형
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요.

 

[ 환경 ]

DVWA v1.9
Burp Suite Community Edition v2024.11.2

1. Source code analysis

[그림 1] Medium level Source code

사용자 입력값 가져오기

$target = $_REQUEST[ 'ip' ];
  • 사용자가 입력한 IP 주소를 $_REQUEST'ip' ]에서 가져온다.
  •  $_REQUEST는 $_GET, $_POST, $_COOKIE 데이터를 모두 포함한다.

블랙리스트 방식으로 입력값 필터링

 $substitutions = array(
        '&&' => '',
        ';'  => '',
    );

    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
  • $substitutions 배열에 제거할 문자열을 정의한다. (제거할 문자열 && : 명령어 연결 연산자, ; : 명령어 구분자)
  • 예를 들어, 사용자가 127.0.0.1 && rm -rf /를 입력하면 &&가 제거된다.
  • str_replace( ) 함수는 $target에서 블랙리스트에 있는 문자열 (&&, ;)을 찾아 제거한다.
  • 예 : 입력값 : 127.0.0.1 && ls ▶ 필터링 결과 : 127.0.0.1 ls

운영체제 확인 및 명령 실행

if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
  $cmd = shell_exec( 'ping  ' . $target );
} else {
  $cmd = shell_exec( 'ping  -c 4 ' . $target );
}
  • php_uname's' )는 현재 서버의 운영체제 정보를 반환하며,  stristr( ) 함수로 운영체제 이름에 Windows NT가 포함되어 있는지 확인한다.
  • Windows 인 경우 ping 명령어에 $target 을 인수로 전달하며, Unix/Linux인 경우 ping 명령어에 -c 4 옵션을 추가하여 4개의 ICMP 패킷만 보낸다.
  • shell_exec(  ) 함수는 명령어 실행 결과를 반환하고, 이를 $cmd에 저장한다.

결과 출력

echo "<pre>{$cmd}</pre>";
  • ping 명령의 실행 결과를 <pre> 태그 안에 출력하여 사용자에게 제공하며, HTML의 <pre> 태그는 줄 바꿈과 공백을 유지한 채 텍스트를 표시한다.

 

2. Practical exercises

소스코드에서 확인하였듯이  $target = $_REQUEST[ 'ip' ]; 로 target 변수에 입력한 IP를 대입하며,  shell_exec( ) 함수는 $target 에서 입력한 IP를 이용해서 Ping 실행한다는 것을 확인하였다. Low level과 다른점은 블랙리스트로 $substitutions 배열에 제거할 문자열을 정의하였다는 것이다. 블랙리스트로 지정한 문자열 이외에 다른 구분자를 사용하면 정상적으로 명령어가 실행되는 것을 확인할 수 있다.

[그림 2] Command Injection 결과

반응형

관련글 더보기