DVWA에서 Command Injection 실습하기 (Low)

맑음·2025년 5월 14일
post-thumbnail

Command Injection?

Command Injection은 취약한 애플리케이션을 실행 중인 서버에서 임의의 운영체제(OS) 명령을 실행하도록 하는 공격 기법입니다
더 많은 내용이 궁금하시면 Command Injection에 대해 알아보기를 봐주시면 감사하겠습니다

DVWA 환경에서 Command Injection 공격 실습하기

이번에는 Command Injection 공격을 진행해보고자 합니다

본 실습은 DVWA 환경을 구축한 후 가장 취약한 환경인 Low 레벨에서 진행되었습니다!

파일 내용 출력

DVWA에서 Command Injection에 들어가봅시다
이번에는 Ping a device가 떴네요
아무래도 ip 주소를 입력해서 ping 명령어를 실행하는 것 같습니다
View Source를 통해 코드를 확인해봅시다

<?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>";
}

?>

Low 레벨이라 그런지 바로 문제점이 보이네요!
문제가 되는 부분은 아래와 같습니다

$target = $_REQUEST[ 'ip' ];
...
$cmd = shell_exec( 'ping  -c 4 ' . $target );

바로 사용자가 입력한 ip 값을 검증 없이 shell_exec()으로 직접 넘기고 있습니다
이는 공격자가 쉘 명령어를 주입할 수 있다는 뜻이죠

그럼 한번 해보겠습니다
아래와 같이 Submit 해보겠습니다

127.0.0.1; ls

입력을 했더니 그대로 쉘에 옮겨져서 명령이 실행되었습니다!
ls 명령어를 통해 3개의 파일이 존재하는 것을 확인 할 수 있네요

그럼 이번에는 디렉토리 구조를 확인해봅시다
아래를 입력해봅시다

127.0.0.1; ls ../

이번에는 상위 디렉토리에 존재하는 파일들을 확인할 수 있네요
Low 레벨이라 그런지 간단한 코드로 바로 확인이 가능하네요!

/etc/passwd 파일은 사용자 ID나 Shell 등의 사용자 계정 정보를 저장하는 중요한 파일인데 이걸 한번 확인해보겠습니다
그리고 앞의 명령어의 결과는 필요없으니 ip는 제외하고 바로 ;부터 입력해보겠습니다

; cat /etc/passwd

이렇게 다양한 정보가 뜨는 것을 확인할 수 있네요!

필드 구조를 살펴보면 아래와 같습니다

필드설명
1. 사용자명root, www-data, user1 등 로그인 ID
2. 암호 정보예전에는 암호 해시 (x 또는 * 로 대체됨)
3. 사용자 ID (UID)0은 루트 권한. 일반 사용자: 1000+
4. 그룹 ID (GID)기본 그룹 ID
5. 사용자 정보일반적으로 사용자 설명. 비워질 수 있음
6. 홈 디렉토리/home/user1, /root
7. 로그인 쉘/bin/bash, /usr/sbin/nologin

우리는 이 정보들을 볼 수 있으니 해킹에 성공했네요!

실습 후기

이번에는 SQL Injection보다 더 간단하게 완료한 것 같습니다
간단한 명령어로 쉽게 해킹이 가능한 것을 보고 정말 악용이 쉽겠다고 생각했으며 왜 OWASP Top 10에 드는지 알 것 같았습니다

추가적으로 Reverse Shell을 시도하려 했으나 가상머신에서 Kali를 돌리면서 docker로 dvwa를 돌리다보니 네트워크 연결이 제대로 되지 않은 것 같아 계속 실패를 해서 다음에 다시 시도를 해보겠습니다....

하지만 역시 실습이 재미있는 것 같습니다ㅎㅎ

profile
내일도 맑음

2개의 댓글

comment-user-thumbnail
2025년 5월 15일

리버스 쉘은 로컬에서 실습하는 것보다 워게임 환경에서 실습하는 것이 더 좋을 것 같습니다. 말씀하신 이유도 있겠지만, 워게임 가상 머신에서 로컬 컴퓨터로 쉘을 받아오기 위해 포트 포워딩이 필요할 수 있는데, 이 과정을 통해 다양한 방면에서 학습할 수 있다고 생각합니다. 관련문제 찾으면 공유드리겠습니다.

1개의 답글