Portswigger-Reflected XSS with event handlers and href attributes blocked

problem link

풀이

허용된 몇가지 태그로 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