Portswigger-Reflected XSS in canonical link tag
풀이
유저 입력이 canonical link 태그에 들어간다. <>는 이스케이프된다. 홈페이지에 alert를 띄우는 XSS를 해라. 타겟은 alt+shift+x, ctrl+alt+x, alt+x를 누르도록 시뮬레이션 되었으며, 크롬 브라우저를 사용한다.

접속하면 게시물 리스트가 있고, 특별히 입력을 받는 란은 없다.

숨겨진 GET 파라미터가 있는지 Param Miner를 이용해 찾아본다. 특정 파라미터가 있지는 않지만, 파라미터를 포함한 URL이 그대로 반사되는 것을 발견했다. HTML head의 link에서 반사된다.
이 반사되는 <link rel="canonical" href="URL 값"/>는 canonical 태그로, 거의 유사한 페이지의 기본 버전을 정의하는 코드이다. 검색엔진에 잘 인덱싱되기 위해 사용한다. 입력한 href가 canonical 버전 URL이라는 표기이다.

이 태그는 일반적으로 XSS에 쓰기 어렵지만, 한가지 유용한 방법이 있다. 단, 크롬에서만 가능한 듯 하다. XSS in hidden input fields - canonical link 태그를 이용한 XSS
이를 이용해 ?%27accesskey=%27X%27onclick=%27alert(1)%27x=%27 (디코딩하면 ?'accesskey='X'onclick='alert(1)'x=') 페이로드를 이용하면 성공한다. accessKey를 X로 지정했으므로 윈도우에서 alt+shift+x, 맥에서 ctrl+alt+x, 리눅스에서 alt+x를 누르면 트리거된다.

이 취약점은 사용자가 입력한 값을 충분히 검증하지 않고 반사하여 발생하였다.
tags: writeup, xss, reflected xss, wstg-inpv-01, link-tag, web hacking, event handler