5주차_Webhacking 과제2 : dreamhack [xss-1]

2023. 11. 5. 11:42SWLUG/web hacking

xss-1 | 워게임 | Dreamhack

 

xss-1

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역

dreamhack.io

 

📌 풀이 

 

2번째 문제이다.

 

 

 

 

서버를 생성하고 파일을 다운받았다.

 

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
XSS 취약점을 이용해 플래그를 획득하세요. 

해당 문제에 대한 설명이다.

 

서버에 들어가니 1번문제랑 비슷한 화면이 떴다. 우선 vuln(xss) page를 눌러봤다.

 

memo를 눌러봤다.

또 hello네..🤣

flag도 눌러봤다.

별다른게 없다.

 

여기서는 얻을 정보를 잘 모르겠어서 잠시 다운한 파일을 확인해봤다.

그런데 내용을 보니까 1번문제랑 거의 ? 아예 ? 똑같은 것 같았다.

 

#!/usr/bin/python3
from flask import Flask, request, render_template
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
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:
        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("/")
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)

 

이걸 봤는데, 내가 얻을 수 있는 정보는 없다.

 

일단 이것저것 시도해봐야겠다.

 

vuln(xss) page를 눌렀을 때 1이 떴는데 url 을 보니까 아래처럼 되어있었다.

 

 

 

그냥 이 방식들을 이해해보고 싶어서 2도 넣어봤더니 2가 출력된다.

근데 영어로도 시도해봤는데 숫자일때만 뜬다.

 

여기서 이것저것해도 신기함만 느낄뿐 더이상 얻을 수 있는 정보가 없어서 다시 코드로 갔다.

그리고 내스스로는 한계가 있기에 찾아보면서 문제를 풀어봐야할 것 같다.

 

 

read_url 함수를 보면 이 함수에서 쿠키가 생성되고 , domain 이 127.0.0.1:8000 이다.

우리가 제공받은 주소와 포트도 달라서 쿠기 값에는 저장되어 있지 않기때문에 127.0.0.1:8000에서 확인해야한다.

 

 

check_xss 함수를 보면 입력한 URL을 참조하는 것을 확인할 수 있다.

 

flag 함수에서 check_xss 함수로 넘어가기때문에 입력란에 아래와 같은 내용을 넣으면 된다.

 

<script>location.href="http://127.0.0.1:8000/memo?memo=hello"+document.cookie;</script>

 

 

 

제출후 memo로 가면 위와 같이 플래그가 나와있는 것을 확인할 수 있다.

 

 

열심히 찾으면서 풀기는 풀었는데, 확실히 다른 웹해킹 주제에 비해서 문제푸는 것도 힘들고 이해하는 것도 많이 어렵다.

이것도 다음 수업 전까지 더 공부해야할 거 같다.

 

 

[ 참고 자료 ]

 

DreamHack 1단계 xss-1 :: 혁준 (tistory.com)

 

DreamHack 1단계 xss-1

DreamHack 1단계 xss-1 문제를 풀어보겠다. 접속을 하면 세 페이지가 나오는데, vuln 함수는 필터링이 없어서 xss 가 가능하다. memo 함수는 flag 에 입력한 값이 성공시 출력되는 페이지이다. 왜냐하면, me

jhyuxxk.tistory.com