본문 바로가기

Wargame(hacking)/Dreamhack

Level1 : csrf-2

< 문제 >

 

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

 

csrf-2

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. CSRF 취약점을 이용해 플래그를 획득하세요. 문제 수정 내역 2023.07.18 css, html 제공 및 read_url() 코드 일부가 변경되었습니다. Referen

dreamhack.io

 

username = 'admin'으로 로그인 해 FLAG를 획득하는 문제이다 . 

 

< 풀이 >

 

@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

 

xss 공격을 유발하는 문자들은 필터링되고 있지만, csrf를 유발하는 < , > 등은 필터링 되지 않는다.

 

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

 

 

1. session_id = os.urandom(16).hex()  : 임의의 세션 아이디 생성

2. session_storage[session_id] = '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'

 

/change_password?pw="변경할 값" admin의 pw 가 입력한 값으로 정해지게 된다. 

 

 

 

< 참고 >

 

 

https://wikidocs.net/78535

 

01-5 get과 post 분기 생성

# 요청 메소드 확인 - 다음처럼 GET과 POST요청 분기를 만들 수 있습니다. - 겸사겸사 render_template도 정리해줍니다. - 추가로 flask 패키지의 requ…

wikidocs.net