Portswigger-Reflected XSS with event handlers and href attributes blocked
풀이
허용된 몇가지 태그로 XSS가 가능하지만, 이벤트 핸들러와 anchor의 href 속성이 막혀있다. XSS를 이용하여 클릭 시 alert하게 하라. 문제 해결을 위해 사용자가 벡터를 클릭하도록 유도하려면 “클릭”이라는 단어로 벡터에 레이블을 지정해야 한다. (ex. <a href="">Click me</a>)

검색 입력란이 있다.

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


모든 태그를 필터링하는 것인지 확인하기 위해 <> 사이에 태그 이름을 넣어 보내본다. 필요와 기능에 따라 어떤 태그는 예외적으로 필터링을 우회하도록 처리될 수도 있다.
XSS cheat sheet 에서 태그 목록을 복사할 수 있다.
a, animate, discard, image, svg, title 태그가 우회 가능했다. 우회 가능한 태그별로 XSS에 쓸만한 속성이 있는지 찾아본다.
portswigger 연구지 SVG animate XSS vector에서 svg 태그를 이용해 XSS를 하는 새로운 방법에 대해 발표했다. svg → animate 태그에서, values 속성은 attributeName 속성을 이용해 지정한 속성의 값을 지정한다. 즉, 속성을 직접 지정하지 않고 간접적으로 지정할 수 있다. 이를 활용하면 a 태그에 href 속성을 설정하는 것을 대신할 수 있다.

다음과 같은 페이로드를 이용하면 XSS라는 글씨에 링크가 걸리고, href는 javascript:alert(1)로 설정된다.
<svg>
<a>
<animate attributeName=href values="javascript:alert(1)"/>
<text x=20 y=20>Click me</text>
</a>
</svg>이를 정리하여 ?search=<svg><a><animate%20attributeName=href%20values="javascript:alert(1)"/><text%20x=20%20y=20>Click%20me</text></a></svg> 페이로드를 보낸다.

이 취약점은 사용자가 입력한 값을 검증할 때 예외를 두어 발생하였다. SVG 태그를 이용하여 href 속성 필터링을 우회할 수 있었다.
tags: writeup, xss, reflected xss, wstg-inpv-01, animation-tag, web hacking