ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • csrf-1
    web hacking/dreamhack(드림핵) 2023. 4. 5. 22:50

    여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.

    CSRF 취약점을 이용해 플래그를 획득하세요.


    xss-1, xss-2와 똑같은 함수들이 있다. 

    #!/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()
            print(str(e))
            # return str(e)
            return False
        driver.quit()
        return True
    
    
    def check_csrf(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)
    
    # index페이지
    @app.route("/")
    def index():
        return render_template("index.html")
    
    # vuln페이지이다. frame, script, on을 xss로 사용할 수 없다.
    # <link rel="stylesheet" href="/memo?memo=linkHaHa">
    @app.route("/vuln")
    def vuln():
        param = request.args.get("param", "").lower()
        xss_filter = ["frame", "script", "on"]
        for _ in xss_filter:
            param = param.replace(_, "*")
        return param
    
    # webdriver를 이용해 서버가 접속할 페이지를 매개변수로 전달한다.
    # <link rel="stylesheet" href="/admin/notice_flag?userid=admin">
    @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_csrf(param):
                return '<script>alert("wrong??");history.go(-1);</script>'
    
            return '<script>alert("good");history.go(-1);</script>'
    
    
    memo_text = ""
    
    # 메모 페이지. 메모를 append해서 보여준다.
    @app.route("/memo")
    def memo():
        global memo_text
        text = request.args.get("memo", None)
        if text:
            memo_text += text
        return render_template("memo.html", memo=memo_text)
    
    # admin이 해당 페이지를 들어가면 플래그를 메모에 작성한다.
    # userid 파리미터가 admin이어야 한다.
    @app.route("/admin/notice_flag")
    def admin_notice_flag():
        global memo_text
        if request.remote_addr != "127.0.0.1":
            return "Access Denied"
        if request.args.get("userid", "") != "admin":
            return "Access Denied 2"
        memo_text += f"[Notice] flag is {FLAG}\n"
        return "Ok"
    
    
    app.run(host="0.0.0.0", port=8000)

    xss와 다른 점은, flag페이지에서 전달한 patameter url을 서버가 실행시켜 쿠키에 있는 flag를 얻는 것이 아니라,

    서버에에 다른 페이지를 접속하게 하여 csrf를 하는것이다.

     

    "/admin/notice_flag" url은 로컬 호스트에서만 접속 가능하므로 서버가 접속하게 만들어야 하고, userid 매개변수 값을 admin으로 주면 된다.

    'web hacking > dreamhack(드림핵)' 카테고리의 다른 글

    simple_sqli  (0) 2023.04.14
    csrf-2  (0) 2023.04.06
    xss-2  (0) 2023.04.03
    xss-1  (0) 2023.04.02
    session-basic  (0) 2023.03.19
Designed by Tistory.