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 형태로
전달 받다는 걸 알 수 있다.
이때 위에서 작성했던 댓글 정보를 확인해보면
이를 바탕으로 슬래쉬를 사용하는 닫힘 태그는 사용하지 않는 게 좋다고 판단했다.
그런데 뭔가 이상하게,, 브라우저 상에서 결과를 확인해봤더니 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()를 실행하면서
<script> tag에 사용한 slash에 back slash가 붙어 escape 되고 있다..!
팝업 창이 뜨는 걸 확인할 수 있을 것이다!