본문 바로가기

웹해킹

드림핵 csrf-2 롸업

<문제>

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

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

 

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

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}')

 

flag를 얻으려면 username을 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", "")
        session_id = os.urandom(16).hex()
        session_storage[session_id] = 'admin'
        if not check_csrf(param, {"name":"sessionid", "value": session_id}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'

flag링크에 특이한 부분이 있는데 session_storage[session_id] = 'admin'이 있다.

이 session_id를 담아서 read_url 함수가 실행되면 cookie에 추가가 된다.

@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 링크로 change_password 링크로 접속하면 session_storage[session_id]가 admin이 되고

username이 admin이 된다. 따라서 admin 계정의 password를 마음대로 바꿀 수 있다.

 

<img src="/change_password?pw=admin" /> 를 flag 링크에서 넣어주면

admin계정의 password가 admin이 된다.

바꾼 비밀번호로 로그인을 하면

이렇게 flag가 나온다.

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

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