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을 보내준다는 듯한 폼이 구성되어있다.
아이피를 넣어서 실행하면 잠시 뒤 위와 같이 결과를 페이지에 출력한다.
어떤 식으로 코드가 구성되어있을 지 예측해보자.
ping [ 입력값 ]
사실 생각해 볼 것도 없이 간단하다.
우리는 ping을 실행해주는 코드에서 다른 시스템 명령을 내려야한다.
Level : Low
다중 실행 명령어를 이용하여 루트 디렉토리를 확인해보자
ping [ ; ls / ]
앞 명령어는 IP주소를 받지 않아 실패하고 뒷 명령어만 성공하여 루트 디렉토리가 출력되었다.
Level : Medium
난이도를 높이면 위의 입력값이 통하지 않는다. 소스코드를 한번 확인해보자.
난이도가 오르면서 새로운 필터링이 생겼으며 &&과 ;은 사용할 수 없어졌다.
그렇다면 이번엔 '|'를 이용해서 필터링을 우회하고 /etc/passwd를 출력해본다.
ping [ | cat /etc/passwd ]
성공적으로 출력됨을 확인할 수 있다.
Level : High
난이도가 오르니 또 이전 입력값은 통하지 않았다.
다시한번 소스코드를 확인해보자.
필터링이 엄청나게 늘었으며 우리가 알고 있는 명령어는 다 막힌듯 하다.
그러나 자세히보면 '|'의 필터링이 '| '로 파이프와 띄어쓰기가 함께 적용되어있음을 볼 수 있다.
이 허점을 이용하여 이번에는 로그폴더 /var/log를 확인해보겠다.
ping [ |ls /var/log ]
로그 폴더 내부를 확인할 수 있다.
이렇듯 취약점에 대해 문자 하나씩 필터링하는 것은 우회할 수 있는 방법이 무수하기 때문에 안전하지 않다.
'보안 이론 > 웹 보안' 카테고리의 다른 글
파일 업로드 우회 - File Signature (0) | 2022.09.19 |
---|---|
Blind SQL Injection - DB 데이터 값 추측 (0) | 2022.09.16 |
SQL Injection - 다른 DB 데이터 접근 (0) | 2022.09.14 |
SQL Injection - 오류 페이지를 이용한 공격 (0) | 2022.09.14 |
SQL Injection - 로그인 우회 (0) | 2022.09.14 |