본문 바로가기

보안 이론/웹 보안

Command Injection - DVWA를 이용한 실습

반응형

command injection에 대해 알아보고 필터링을 우회하여 백도어로 연결하는 실습을 진행한다.


Command Injection

명령어를 삽입한다는 뜻으로 웹 페이지에서의 사용자 요청이 웹 서버 시스템 명령어를 실행하는 취약점이다.

사용자 입력에 대해 적절한 검증을 하지 않으면 서버 내부의 민감한 정보가 유출될 뿐만 아니라 백도어를 연결하는 등 악의적인 행위가 가능해 위험하다.

 

커맨드 다중 명령 실행

리눅스 커맨드 창에서 시스템 명령을 한 줄에 두 개 이상 실행할 수 있는 방법은 여러가지가 있다.

기호 사용 예 설명
; ping 127.0.0.1 ; ls -al 주어진 명령어를 성공, 실패 상관없이 전부 실행
| ping 127.0.0.1 | ls -al 파이프, 앞 명령어의 결과를 뒷 명령어의 입력으로 이용
관계 없을 시 뒷 명령어만 출력된다.
& ping 127.0.0.1 & ls -al 앞 명령어를 백그라운드에서 실행하고 뒷 명령어 병렬 실행
|| ping 127.0.0.1 || ls -al 앞에서부터 실행하며 앞 명령어가 실패하면 뒷 명령어 실행
&& ping 127.0.0.1 && ls -al 앞에서부터 실행하며 앞 명령어가 성공하면 뒷 명령어 실행

 

DVWA) Command Injection

다음과 같은 페이지에 IP를 입력하면 Ping을 보내준다는 듯한 폼이 구성되어있다.

 

127.0.0.1 을 입력한 결과 페이지

아이피를 넣어서 실행하면 잠시 뒤 위와 같이 결과를 페이지에 출력한다.

 

어떤 식으로 코드가 구성되어있을 지 예측해보자.

ping [ 입력값 ]

사실 생각해 볼 것도 없이 간단하다. 

우리는 ping을 실행해주는 코드에서 다른 시스템 명령을 내려야한다.

 

Level : Low

다중 실행 명령어를 이용하여 루트 디렉토리를 확인해보자

ping [ ; ls / ]

앞 명령어는 IP주소를 받지 않아 실패하고 뒷 명령어만 성공하여 루트 디렉토리가 출력되었다.

 

Level : Medium

난이도를 높이면 위의 입력값이 통하지 않는다. 소스코드를 한번 확인해보자.

난이도가 오르면서 새로운 필터링이 생겼으며 &&과 ;은 사용할 수 없어졌다.

그렇다면 이번엔 '|'를 이용해서 필터링을 우회하고 /etc/passwd를 출력해본다.

ping [ | cat /etc/passwd ]

성공적으로 출력됨을 확인할 수 있다.

 

Level : High

난이도가 오르니 또 이전 입력값은 통하지 않았다.

다시한번 소스코드를 확인해보자.

필터링이 엄청나게 늘었으며 우리가 알고 있는 명령어는 다 막힌듯 하다.

그러나 자세히보면 '|'의 필터링이 '| '로 파이프와 띄어쓰기가 함께 적용되어있음을 볼 수 있다.

이 허점을 이용하여 이번에는 로그폴더 /var/log를 확인해보겠다.

ping [ |ls /var/log ]

로그 폴더 내부를 확인할 수 있다.

 

이렇듯 취약점에 대해 문자 하나씩 필터링하는 것은 우회할 수 있는 방법이 무수하기 때문에 안전하지 않다.

반응형


Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Visits
Today
Yesterday