홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#OWASP WebGoat #웹해킹 실습 #명령어삽입 취약점 #Command Injection #운영체제명령어삽입 #owasp-zap #HTTP 프록시 #경로조작 #HTML 삽입 #A1-Injection #A3-Cross-Site Scripting (XSS)

WebGoat 명령어삽입 (Command Injection) 실습설명서

이 문서는 WebGoat 7.0.1의 "Injection Flaws" > "Command Injection"의 실습 설명서이다. 웹브라우저가 전달하는 사용자의 입력값을 서버가 검증하지 않고 exec()와 같이 운영체제 명령어를 호출하는 함수에 전달할 때 발생할 수 있는 문제점을 배울 수 있다.

WH-WebGoat-7.0.1 웹해킹 훈련장을 구동한다. 구동에 관해서는 WH-WebGoat-7.0.1 라이브 ISO 문서를 참조한다. 여기서 WebGoat 훈련장의 IP주소는 192.168.189.238이다.

WebGoat 실행이 완료되면 파이어폭스(FireFox) 웹브라우저로 훈련장에 접속한다. 훈련장 URL은 http://192.168.189.238:8080/WebGoat/이다. 그리고 OWASP ZAP을 실행한다.

firefox http://192.168.189.238:8080/WebGoat/
owasp-zap 2&> /dev/null

Firefox의 Preference > Adanaced > Network > Settings...에서 HTTP 프록시를 OWASP-ZAP의 프록시 포트인 127.0.0.1:8080에 연결한다.

Injection Flaws: Command Injection 공략 (수동점검)

운영체제 명령어 삽입(OS Command Injection) 취약점은 명령어를 전달하는 변수 값에 명령어를 연결하여 실행하도록 조작하는 것이다. 점검에서는 대부분의 운영체제가 지원하는 앰퍼샌드(&) 문자를 이용하여 연결형 명령어가 작동하는 지 점검한다.

Firefox 웹 브라우저로 WebGoat의 Command Injection 실습문제에 접속해보자.

WebGoat Command Injection: 홈페이지
[ WebGoat Command Injeciton: 첫 화면 ]

AccessControlMatrix.help 따위의 파일을 열람하는 기능이다. 그런데 홈페이지에 서비스가 어떻게 구현되었는 지를 보여준다.

ExecResults for '[/bin/sh, -c, cat "/root/.extract/webapps/WebGoat/plugin_extracted/plugin/CommandInjection/resources/AccessControlMatrix.html"]'

이 전달문을 보면 /bin/sh -c cat 파일이름과 같이 cat 명령어를 이용하고 있다는 것을 파악할 수 있다. 실제 취약점점검 현장에서도, 서버 설정이 부주의한 경우에, 오류 표시에서 이러한 중요정보를 접속자에게 노출시키기는 경우를 종종 발견하게 된다. cat 명령어 실행방식을 보면, 대상 파일이름을 큰따옴표(") + 지정된 디렉토리 + 사용자가 선택한 파일이름 + 큰따옴표(")와 같이 만드는 것을 알 수 있다.

위와 같은 관찰로부터 파일이름" & 명령어 & "와 같은 명령어 삽입을 시도할 수 있다. 이러한 시도는 서버에서는

/bin/sh -c cat "/디렉토리/파일이름" & 명령어 & ""

와 같은 명령어로 전환된다. 참고로 마지막 큰따옴표(")도 반드시 삽입해주어야 한다. 입력하지 않으면 서버에 전달된 문자열에서 &로 구분되는 마지막 명령어는 큰따옴표(") 하나만으로 구성된다. 이는 쉘스크립트 해석기에서 문법 오류(syntax error)를 발생시킨다. 문법오류가 발생하면 쉘은 명령어를 실행하지 못한다. 한 개의 큰따옴표(")는 문법 오류지만 두 개의 큰따옴표("")는 - 명령어가 널(null)이므로 실행을 시킬 수는 없겠지만 - 문법적인 오류는 아니기 때문에 이전 명령어들을 정상적으로 실행된다.

이제 Firefox에 연결시킨 OWASP-ZAP의 멈춤(가로채기) 기능 이용하여 서버로 전달되는 값을 조작해보자. 상단의 동그란 녹색 단추를 누르면 된다.

WebGoat Command Injection: OWASP-ZAP break
[ WebGoat Command Injeciton: HTTP 프록시에서 가로채기 ]

FireFox가 WebGoat 서버로 전달하려던 HTTP 요청은 다음과 같았다.

GET http://192.168.189.238:8080/WebGoat/attack?Screen=288&menu=1100&HelpFile=AccessControlMatrix.help&SUBMIT=View HTTP/1.1
Host: 192.168.189.238:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Referer: http://192.168.189.238:8080/WebGoat/start.mvc
Cookie: JSESSIONID=C8248ABD080623DF6BC1E1B5C3D1C6B9
Connection: keep-alive

OWASP ZAP에서 GET으로 전달되는 HelpFile 변수값을 HelpFile=AccessControlMatrix.help%22%26id%26%22와 같이 조작한다. HTTP 요청에서 변수 값은 이런 식으로 URL 인코딩해서 보내는 것이 좋다. 예를 들어 &의 경우에는 HTTP 요청에서 URL 변수 구분자이므로 입력에서 인코딩하지 않은 &는 잘못된 데이타를 전달하게 될 것이다. URL 인코딩을 벗기고 보면 HelpFile=AccessControlMatrix.help"&id&"이다.

WebGoat Command Injection: id 명령어 실행
[ WebGoat Command Injeciton: id 명령어 삽입에 성공한 모습 ]

HelpFile=AccessControlMatrix.help%22%26id%26%22로 조작했을 때 id 명령어 실행결과도 포함되어 있는 것을 확인할 수 있다. (root 권한이다!!!) 이제 공격자는 다양한 명령어를 입력하여 웹 브라우저만으로도 root 권한으로 웹서버를 불법 점유할 수 있게 된다.

Injection Flaws: Command Injection 공략 (OWASP ZAP의 자동점검)

일반적으로 명령어삽입 취약점은 웹취약점 스캐너들이 매우 잘 탐지하는 편이다. OWASP ZAP의 이력(History) 탭에서 다음 URL 접속에 대한 HTTP요청을 찾아서 공격을 해보자.

http://192.168.189.238:8080/WebGoat/attack?Screen=288&menu=1100&HelpFile=AccessControlMatrix.help&SUBMIT=View

WebGoat Command Injection: OWASP ZAP Active Scan
[ WebGoat Command Injeciton: OWASP ZAP에서 Active Scan 시작 ]

단일 HTTP 요청을 대상으로 자동점검을 실행하려면 해당 요청을 선택하고 오른쪽 마우스 단추를 눌러서 공격 -> Active Scan...을 선택한다. 다음 화면에서 Start를 누른다.

WebGoat Command Injection: OWASP ZAP Active Scan Result
[ WebGoat Command Injeciton: OWASP ZAP의 Active Scan 결과 ]

그 결과는 위와 같다. 명령어 삽입 취약점 이외에도 경로조작(Path Traversal), 반사형 XSS(Reflected Cross-site Scripting) 등의 공격도 가능함을 알 수 있다. OWASP ZAP이 접근한 URL과 취약점 점검에 사용한 변수 값은 다음과 같다.

- Cross-site Scripting (Reflected)

http://192.168.189.238:8080/WebGoat/attack?Screen=288&menu=1100&HelpFile=%3C%2Fb%3E%3Cscript%3Ealert%281%29%3B%3C%2Fscript%3E%3Cb%3E&SUBMIT=View

HelpFile 변수 입력값: </b><script>alert(1);</script><b>

- Path Traversal

http://192.168.189.238:8080/WebGoat/attack?Screen=288&menu=1100&HelpFile=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd&SUBMIT=View

HelpFile 변수 입력값: ../../../../../../../../../../../../../../../../etc/passwd

- Remote OS Command Injection

http://192.168.189.238:8080/WebGoat/attack?Screen=288&menu=1100&HelpFile=AccessControlMatrix.help%22%26cat+%2Fetc%2Fpasswd%26%22&SUBMIT=View

HelpFile 변수 입력값: AccessControlMatrix.html"&cat /etc/passwd&"

[처음 작성한 날: 2016.12.15]    [마지막으로 고친 날: 2016.12.15] 


< 이전 글 : WebGoat XSS: Phishing with XSS (2016.12.11)

> 다음 글 : WebGoat: Numeric SQL Injection (2016.12.16)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문