본문 바로가기
웹 해킹/드림핵

[Dreamhack] xss-1

by L3m0n S0ju 2021. 7. 15.


 

문제에서 XSS 취약점을 이용해 플래그를 획득하라고 요구한다. 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():
    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)


 

 

 

해당 페이지에 접속하면 3개의 링크가 출력된다. vuln(xss) page는 xss 공격에 취약해서 스크립트를 집어넣으면 그대로 실행된다. 하지만 쿠키 값은 비어있기 때문에 출력되지 않는다. memo page는 글을 입력하면 메모장에 글이 입력되지만 스크립트는 동작하지 않는다. 문제의 핵심은 flag page이다.

 

 

 


@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 = ""


위 코드는 flag page인데 check_xss 함수로 flag라는 이름의 어떤 값을 넘겨주는데 이 값이 바로 플래그임을 직감적으로 알 수 있다.

 

 

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)

 

check_xss 함수 코드를 살펴보면 입력받은 URL과 쿠키값을 가지고 해당 URL에 접근하는 것을 유추할 수 있다. 따라서
<script>location.href="/memo?memo="+document.cookie;</script>를 입력하면 memo 장에 쿠키 값을 출력한다.

 

 

플래그

 

'웹 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] proxy-1  (0) 2021.07.16
[Dreamhack] csrf-1  (0) 2021.07.15
[Dreamhack] Carve Party  (0) 2021.04.22
[Dreamhack] web-misconf-1  (0) 2021.03.29
[Dreamhack] command-injection-1  (0) 2021.03.29

댓글