Portswigger-Reflected XSS into HTML context with most tags and attributes blocked
풀이
Reflected XSS가 있지만 WAF가 있어 흔한 XSS 벡터를 방어한다. XSS를 이용해 alert 함수로 document.cookie 값을 출력해야 한다. 참고로 alert을 트리거하기 위해 사용자 상호작용이 필요 없어야 문제가 풀린다.

접속하면 검색 창이 있다.

검색한 값은 h1 태그의 텍스트값으로 반사된다. 검색값은 search라는 이름의 URL 쿼리로 들어간다.

< 문자를 입력하면 필터링된다. “Tag is not allowed” 라는 에러 메시지가 돌아온다.


모든 태그를 필터링하는 것인지 확인하기 위해 <> 사이에 태그 이름을 넣어 보내본다. 필요와 기능에 따라 어떤 태그는 예외적으로 필터링을 우회하도록 처리될 수도 있다.
XSS cheat sheet 에서 태그 목록을 복사할 수 있다.

body 태그는 태그 필터링을 우회했다. body 태그를 이용하여 XSS 페이로드를 짠다.

body 태그에 핸들러를 설정하려 하면 또 필터링이 된다. 필터링을 우회하는 핸들러를 찾아 동일한 방법으로 찾는다. XSS cheat sheet 에서 body 태그에 사용 가능한 핸들러 목록을 복사할 수 있다.

onresize 핸들러는 필터링을 통과한다. XSS cheat sheet 에서 찾아보니 이 핸들러는 사용자 인터렉션이 필요하지 않다고 한다. (실제로는 윈도우 사이즈가 바뀌면 트리거되지만, 이는 XSS를 뿌릴 때 트리거 하도록 유도하면 된다.)

익스플로잇 서버에 이 XSS를 트리거하는(iframe 등으로 이 XSS 페이로드 링크를 열게 하는) 페이지를 만들고, 이 페이지에 타겟이 접근하게 한다.

iframe으로 XSS 페이로드가 포함된 링크를 열게 하고, onload에서 사이즈를 변경해 페이로드의 onresize를 트리거한다.
<iframe src="https://ac4b1f441e5874cb8037419f0035008d.web-security-academy.net/?search=%3Cbody%20onresize=alert(document.cookie)%3E" onload=this.style.width='100px'>
View exploit으로 확인해볼 수 있다.

Deliver exploit to victim 버튼을 눌러 타겟이 exploit 서버에 접속하게 하고 XSS를 트리거하게 하면 성공한다.
이 취약점은 사용자가 입력한 값을 검증할 때 예외를 두어 발생하였다.
tags: writeup, xss, reflected xss, wstg-inpv-01, web hacking, event handler