WAR GAME

[Dreamhack] xss-1

StudyOwl 2023. 3. 30. 21:14

바로 문제 페이지 부터 보겠습니다

3개의 링크가 있습니다 하나씩 확인해보겠습니다

vuln(xss)page를 누르면 script가 실행됩니다

이 페이지를 통해 xss script를 넣을 수 있을거 같습니다

memo를 클릭하면 hello가 출력되는걸 볼 수 있습니다 아마 이 페이지를 통해 플래그 값을 얻어오는것 같습니다

마지막으로 flag를 눌러보면 굉장히 친절하게 xss할 수 있도록 vuln페이지로 script를 바로 입력할 수 있게 해둔 모습입니다

 

이제 익스플로잇 코드를 짜야하는 소스코드를  보지않고 flag페이지만 보더라도 vuln페이지의 파라미터로 script를 넣어줘서 vuln페이지에서 script를 실행해 memo에 플래그 값을 띄워야한다는 시나리오가 생각이 듭니다

 

하지만 어떤 script를 넣어줘야 할지 모르기 때문에 소스코드를 확인해보겠습니다

#!/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():
    param = request.args.get("param", "")
    return param


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

 

코드에서 check_xss라는 함수가 보이는데 파라미터와 cookie 값을 받습니다

그리고 /flag의 POST 메소드 코드를 보면 if not check_xss를 통해 파라미터와 cookie값을 검사하는데

{"name":"flag", "value":FLAG.strip()} 을 통해 cookie 이름이 flag이고 값이 FLAG값 그러니까 답인걸 확인할 수 있습니다

이를 통해 저희는 cookie값을 얻어야 한다는걸 알 수 있습니다

 

이제 익스플로잇 코드 즉 script를 짜야합니다

이때 location.href를 사용해 memo페이지에서 flag값을 출력할 수 있도록 해주겠습니다

 

<script>location.href="/memo?memo="+document.cookie;</script>

 

이 script는 memo가 받은 파라미터 값을 render_template를 통해 memo페이지에 출력하는걸 이용하여

cookie값을 받아 출력하도록 합니다

 

그래서 위 코드를 flag페이지의 빈칸에 넣어주면 플래그를 얻을 수 있습니다

 

'WAR GAME' 카테고리의 다른 글

[Dreamhack] csrf-2  (0) 2023.04.03
[Dreamhack] xss-2  (0) 2023.03.30
[Dreamhack] cookie  (0) 2023.03.30
[Dreamhack] session-basic  (0) 2023.03.29
HACKTHEBOX - Meow ( STARTING POINT )  (0) 2023.03.06