DOM XSS : LAB [8]
DATE : 2024/1/15
Last updated
DATE : 2024/1/15
Last updated
이번 LAB에는 댓글에 XSS 취약점이 존재한다고 한다! 😯
LAB으로 접속해 블로그를 하나 선택해주면 하단에 위치해있는 댓글 작성 form을 볼 수 있는데
여기가 바로 이번 LAB을 풀기 위한 공격 포인트 되시겠다.
XSS 취약점이 존재한다는 정보 말고는 아는 게 없기 때문에 정보 수집을 위해 스크립트를 적어보았다.
이 타이밍에 잠시 packet을 확인해보도록 하자.
위의 코드는 블로그를 하나 요청했을 때, 서버가 보내준 응답 속에 포함된 코드이다.
사용자들이 달았던 댓글이 출력될 위치에 이 코드만 적혀져있었다.
대강 코드를 보고 내용을 유추해보자면 "/post/comment 경로에 있는 데이터를 가져다가 페이지에
로드해!" 라는 느낌인 거 같은데
실제로 어떤 결과를 받게 되는 지 packet을 확인해보면
/post/comment에 블로그 아이디를 전달하면 해당 블로그에 작성된 댓글 정보를 json 형태로
전달 받다는 걸 알 수 있다.
이때 위에서 작성했던 댓글 정보를 확인해보면
<script> tag에 사용한 slash에 back slash가 붙어 escape 되고 있다..! 🙀
이를 바탕으로 슬래쉬를 사용하는 닫힘 태그는 사용하지 않는 게 좋다고 판단했다.
그런데 뭔가 이상하게,, 브라우저 상에서 결과를 확인해봤더니 angle brackets을 사용한
첫 번째 태그(<script>)는 화면에 나오는데 두 번째 태그(</ script>)는 보이지 않는다.
슬래쉬는 escape 됐다고 해도 태그는 화면에 나올 법도 한데 뭔가 이상하다.
그렇다면 이번엔 슬래쉬를 포함하지 않는 <img> tag를 작성해보자.
위와 같이 새로운 댓글을 작성한 뒤 블로그에 다시 접속하면
별 다른 문제 없이 태그가 출력 되는 걸 볼 수 있다.
이때 태그가 출력 된다는 건,
아마 HTML entity 처리되어 HTML tag가 아닌 문자열로 취급되고 있음을 뜻한다.
첫 번째 댓글과 결과를 비교해보면 하나의 angle brackets으로 이루어진 경우에는
잘리는 내용 없이 댓글이 모두 출력 되는 걸 확인한 셈이다.
그렇다면 angle brackets을 두 개 이상 사용하는 게 문제인 걸까??
확인해보기 위해 < > 기호를 두 개 포함하는 댓글을 달아보았다.
브라우저에서 댓글을 확인해보니..!
첫 번째 angle brackets은 화면에 출력 되는 데 두 번째 angle brackets은 흔적도 없이 사라져버렸다.
이로써 확실해진 사실..!
현재 댓글 기능에서는 첫 번째 angle brackets만을 HTML entity 처리하고
두 번째부터는 이를 적용하지 않고 있다.
그렇다면 우리는 의미 없는 angle brackets을 하나 붙이고 두 번째 태그에
스크립트를 작성해 넣으면 된다.
<img> tag에 alert()를 작성한 스크립트를 Comment에 삽입해준다.
댓글을 등록한 다음, 다시 블로그로 돌아오면
(1) 사용자가 입력한 댓글을 가져와 Response에 넣는 과정에서 스크립트가 등장하게 되고
(2) 스크립트를 발견한 브라우저가 alert()를 실행하면서
팝업 창이 뜨는 걸 확인할 수 있을 것이다! 👍