xss-2 풀이

xss-2 풀이

반응형

문제 제목 문제 정보 메인 페이지

#!/usr/bin/python3 from flask import Flask, request, render_template from selenium import webdriver import urllib import os app = Flask(__name__) app.secret_key = os.urandom(32) try: FLAG = open("./flag.txt", "r").read() except: FLAG = "[**FLAG**]" def read_url(url, cookie={"name": "name", "value": "value"}): cookie.update({"domain": "127.0.0.1"}) try: options = webdriver.ChromeOptions() for _ in [ "headless", "window-size=1920x1080", "disable-gpu", "no-sandbox", "disable-dev-shm-usage", ]: options.add_argument(_) driver = webdriver.Chrome("/chromedriver", 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) @app.route("/") def index(): return render_template("index.html") @app.route("/vuln") def vuln(): return render_template("vuln.html") @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 'alert("wrong??");history.go(-1);' return 'alert("good");history.go(-1);' memo_text = "" @app.route("/memo") def memo(): global memo_text text = request.args.get("memo", "") memo_text += text + "

" return render_template("memo.html", memo=memo_text) app.run(host="0.0.0.0", port=8000)

이번 문제는 코드가 너무 길어서 코드 블록으로 첨부하겠습니다.

메인 페이지에서 flag 부분에 script 코드를 넣어서 xss를 발생시키는 형식으로 문제가 풀이될 것 같습니다.

flag 부분

flag() 함수를 보면 GET 방식으로 보냈을 때 flag.html을 return 해줍니다.

그 말인 즉슨, 파라미터를 POST로 방식으로 보내야 한다는 소리입니다.

POST 방식으로 보냈을 경우에 check_xss() 함수를 실행합니다.

그리고 check_xss() 함수에서 read_url() 함수의 리턴 값을 flag() 함수로 리턴하게 됩니다.

여기서 check_xss(), read_url() 함수는 cookie를 생성합니다.

memo() 함수는 그냥 /memo 페이지에 출력을 해주는 함수니까 별다른 분석은 하지 않겠습니다.

vuln() 함수는 직접 페이지에 들어가서 분석을 해보겠습니다.

URL

URL을 보면 alert(1)라고 쿼리에 써져있지만, 실행이 되지 않고 있습니다.

script 태그는 필터링이 되고 있는 것 같습니다.

그러면 script 태그 대신 img 태그를 사용해서 /flag 페이지에 알맞은 값을 입력해보겠습니다.

우선 about:invalid를 사용해서 onerror로 넘어가게 해 줍니다.

그리고 location을 이용해서 /memo?memo= 경로에 쿠키값을 추가해주면 /memo 페이지에 FLAG가 출력되게 됩니다.

사실 저렇게 하지 않고 location.href를 써서 풀려고 했는데 어찌 된 게 안 풀리더라고요....

FLAG 획득 완료 문제 풀이 성공

구글링에 1시간을 쏟았습니다...

반응형

from http://studykty.tistory.com/64 by ccl(A) rewrite - 2021-08-17 19:26:44