ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DreamHack] xss-1
    2022/Write-Ups 2022. 8. 23. 22:03

     

    1팀 정유진

    Cross Site Scripting(XSS) 란?

    게시판, 웹 메일 등에 삽입된 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 및 기타 개인 정보를 특정 사이트로 전송시키는 공격.

     

    취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다. 

    취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.

    해당 페이지로 이동하면 세 페이지가 나온다.

    param에 들어간 값이 페이지에 그대로 적용이 돼서 Alert가 뜨는 페이지

    (1이 들어갔디에 1이 뜸)

    memo는 flag 에 입력한 값이 성공시 출력되는 페이지

    flag는 스크립트를 기입해 공격하는 페이지

     

     

    전체 코드

    #!/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)

     

    목표는 서버에서 /memo?memo=<flag>의 형식으로 요청을 보내게 해서 memo_text에 플래그가 들어가도록 만드는 것이다. 

    param에 <script>document.location.href='/memo?memo=<flag>'</script>의 형식으로 넣으면 <flag>가 memo_text에 들어가게 된다.

    flag()에서 check_xss()를 호출할 때 쿠키에 플래그를 넣어서 요청을 보내기 때문에 <script>document.location.href='/memo?memo='+document.cookie</script>를 넣으면 된다.

    https://velog.io/@h0meb0dy/DreamHack-xss-1

     

    [DreamHack] xss-1

    XSS

    velog.io

    flag에 스크립트를 넣은 후 페이지 결과 확인하면

    플래그가 뜬다.

     

     

    정보

    https://fascination-euna.tistory.com/entry/Dreamhack-xss-1?category=1074572 

     

    [Dreamhack] xss-1

    xss-1 여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다 * [Dreamhack] Exercise: XSS # 문제 목표 및 기능.

    fascination-euna.tistory.com