Portswigger-Reflected XSS into a JavaScript string with single quote and backslash escaped

problem link

풀이

검색 쿼리 추적 기능에 취약점이 있다. Javascript 문자열에서 반사가 일어난다. 따옴표와 백슬래시는 이스케이프된다. XSS로 alert를 띄워라.

접속하면 검색 창이 있다.

검색한 값은 h1 태그의 텍스트값으로 반사된다. 또한 script 태그로 감싸진 곳에 javascript 문자열로 하드코딩된다. 그리고 img 태그의 src 값에도 반사된다. 검색값은 search라는 이름의 URL 쿼리로 들어간다.

img 태그는 이 javascript 코드를 통해 생성되었다. URL 인코딩되어 들어가므로 이 코드를 이용해 악의적인 img 태그를 생성하기는 어렵다.

javascript 문자열에서 탈출하기 위해 ' 문자를 입력하면 \' 와 같이 백슬래시가 붙어서 나올 수 없다. 하지만 <> 문자는 필터링하지 않아 </script> 를 넣어 임의로 태그 종료를 종료할 수 있다. 위의 h1 태그에서는 <>가 이스케이프되지만 javascript 문자열에서는 이스케이프되지 않았다.

기존 script 태그를 닫은 후 새로운 script 태그를 열어 스크립트를 실행한다. </script><script>alert(1)</script> 페이로드를 이용했다.

이 취약점은 사용자가 입력한 값을 충분히 검증하지 않고 반사하여 발생하였다. 화면에 띄우는 부분은 이스케이프를 했지만, javascript에 동적으로 하드코딩되는 문자열에는 적절하게 이스케이프하지 않아 문제가 발생했다.


tags: writeup, xss, reflected xss, wstg-inpv-01, web hacking