Portswigger-Reflected XSS into HTML context with all tags blocked except custom ones
풀이
이 문제에서는 커스텀 태그를 제외한 모든 태그의 입력을 막는다. XSS를 이용해 alert 함수로 document.cookie 값을 출력해야 한다.

접속하면 검색 창이 있다.

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

<img 와 같은 입력을 넣으면 에러 메시지가 돌아온다.

<test> 라는 커스텀 태그를 입력하면 잘 반사된다.

페이로드를 짜기 위해서는 먼저 타겟의 브라우저 종류를 알아야한다. 익스플로잇 서버에서 Deliver exploit to victim 버튼을 눌러 타겟의 정보를 수집한다. 타겟이 서버에 접근한 후 Access log에서 User-agent를 확인해 브라우저의 종류를 알아낸다. 위 로그를 보아 크롬으로 추정된다.
XSS cheat sheet 에서 커스텀 태그에 사용 가능한 핸들러와 이를 이용해 작성한 페이로드 예시가 있다. 타겟의 브라우저에서 실행 가능한 핸들러를 선택하여 페이로드를 짠다.

사용자 인터렉션 없이 자동으로 XSS를 트리거하기 위해 onfocus 핸들러가 안성맞춤이다. 커스텀 태그에 focus가 가능하게 하려면 tabindex 속성을 붙여야한다. tabindex 참고
또한 접속 시 자동으로 포커스를 맞추어 onfocus 핸들러를 트리거해야 한다. 해당 태그에 id 속성을 붙이고, URL 마지막에 #아이디을 붙이면 접속과 동시에 포커스를 맞추게 할 수 있다.

(세션 초기화로 주소 변경됨)
<iframe src="https://aca01f311f7fb72c80c5763a00e4001b.web-security-academy.net/?search=%3Cxss%20id%3Dx%20onfocus%3Dalert%28document.cookie%29%20tabindex=1%3E#x">페이로드만 빼서 보면 다음과 같다. <xss id=x onfocus=alert(document.cookie) tabindex=1>#x

Deliver exploit to victim 버튼을 눌러 타겟이 XSS 페이로드가 담긴 페이지에 접근하게 하면 성공한다.
이 취약점은 사용자가 입력한 값을 검증할 때 예외를 두어 발생하였다.
tags: writeup, xss, reflected xss, wstg-inpv-01, web hacking