https://dreamhack.io/wargame/challenges/266/
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
app.py
에서 위 코드를 보아 guest와 user, admin 계정이 있음을 확인할 수 있고, guest와 user로 로그인해보았다.
guest 계정으로 로그인 했을 때의 화면과
user 계정으로 로그인 했을 때의 화면이다.
if pw == password:
resp = make_response(redirect(url_for('index')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
/login
페이지의 위 코드에서 확인할 수 있듯, sessionid는 임의의 4바이트 수로 결정된다. 16진수이므로 8자리로 표현된다.
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
그리고 main
코드에서 admin의 sessionid는 1바이트 수로 설정됨을 알 수 있다. 즉, 16진수로는 2자리로 표현된다. 00부터 FF까지 총 256가지의 경우의 수를 전체 탐색해보면 되므로 Burp Suite 프로그램의 Intruder 기능을 사용했다.
위 캡쳐본에서 알 수 있듯, sessionid가 73일 때만 length가 다르다.
처음에 00000073으로 입력했더니 출력되지 않아 당황했었다.
직접 sessionid에 73을 입력해보니, flag가 출력되었다. 성공!
DH{73b3a0ebf47fd6f68ce623853c1d4f138ad91712}