WEB hacking/드림핵(dreamhack)

드림핵 csrf-2 (Level1) Write up

Roronoa 2023. 4. 22. 02:40
반응형

문제 설명

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

 

csrf-2

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. CSRF 취약점을 이용해 플래그를 획득하세요. Reference Client-side Basic

dreamhack.io

위 사이트에서 해당 문제를 풀 수 있다.

 

[그림 1] 문제 정보

CSRF 취약점을 이용하여 플래그를 획득하면 된다.

 

[그림 2] CSRF-2 사이트

login 하라고 한다.

먼저 코드를 분석해보자!!

 

users = {
    'guest': 'guest',
    'admin': FLAG
}

user의 id와 password가 주어져있다.

admin의 password는 flag라고 되어있으니 guest로 로그인을 진행한다.

 

[그림 3] guest 로그인

guest로 로그인을 진행하니 admin이 아니라고 한다.

admin으로 로그인을 해야한다.

어떻게 할까? 취약점을 찾아보자.

 

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

app.run(host="0.0.0.0", port=8000)

위 페이지는 change_password 페이지로 pw와 session_id를 매개변수로 받는다. 처음에는 session_id를 변경하여서 접속하려고 했지만 실패하였고 pw를 매개변수로 내가 원하는 값을 넣어 admin의 pw를 내가 원하는 값으로 설정을 하도록 하겠다.

 

@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 page를 보면 frame, script, on 이렇게 3가지를 *으로 필터링을 진행한다.

따라서 필터링이 되지 않는 img 태그를 이용하여 공격을 진행할 수 있다.

 

[그림 4] 스크립트 삽입

아래의 payload를 이용하여 공격을 진행하였다.

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

[그림 5] admin 계정 접속

비밀번호를 내가 설정한 1234로 로그인을 진행하였다.

 

[그림 6] flag 출력

admin으로 접속을 성공하였고 flag를 획득 하였다.

반응형