HCTF 2018 - Web - admin

AI-摘要
Microsoft Xiaoice's GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
HCTF 2018 - Web - admin
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | HCTF 2018 |
| 方向 | Web |
| 难度 | Easy |
| 环境 | 授权靶场(已脱敏) |
| 考点 | Flask session 伪造(SECRET_KEY 泄漏 / 硬编码) |
信息收集
一个 Flask 应用,包含注册、登录、修改密码等功能。首页提示 <!-- you are not admin -->,目标是以 admin 身份登录,在 /index 页面获得 flag。
主要路由:
| 路由 | 功能 |
|---|---|
/、/index |
主页(提示 you are not admin) |
/register |
注册(需验证码 verify_code) |
/login |
登录 |
/change |
修改密码(需登录) |
/code |
验证码图片 |
session cookie 为 Flask 格式,可 base64 解码(压缩的需先 zlib 解压)。
漏洞分析
验证码绕过
注册需要 verify_code。访问 /code 时,服务端会在 session 中写入 image 字段(验证码答案的 base64):
1 | GET /code |
解码 image 字段即可获得验证码答案(bTlLZA== → m9Kd),从而绕过验证码。
登录后的 session 结构
注册一个普通用户(如 abcdef / abcdef123)并登录:
1 | { |
name:用户名(经strlower处理,即 nodeprep / NFKC + casefold)。user_id:用户 ID。- 判断 admin 的逻辑为
session['name'] == 'admin'。
SECRET_KEY 发现
尝试注册 admin 报错 The username has been registered(admin 已存在)。直接注册 Unicode 变体(如 admİn)虽然成功,但 name 字段变为 admi̇n(带组合点),不等于 admin。
由于无法通过注册绕过,转向 Flask session 伪造:用一个真实的登录 session,对候选 SECRET_KEY 验签,发现 SECRET_KEY 为硬编码的 ckj123(HCTF 2018 原题即为此值)。
利用过程
- 访问
/code解码 sessionimage字段拿到验证码,注册普通用户并登录。 - 观察登录后的 session 结构,确认
name字段决定管理员身份。 - 用真实 session 验签,确认硬编码密钥
ckj123。 - 用
SecureCookieSessionInterface以ckj123伪造name=admin、user_id=1的 session。 - 携带伪造的 session 访问
/index,获得 flag。
完整 EXP
伪造 admin session(Python):
1 | from flask.sessions import SecureCookieSessionInterface |
携带伪造 cookie 请求:
1 | GET /index |
Flag
flag{xxxx}(已脱敏)
踩坑与总结
- Flask session 结构可通过 base64 解码(压缩的需先 zlib 解压)。
- 验证码答案存储在 session 的
image字段中,可解码绕过。 - SECRET_KEY 硬编码为
ckj123,导致 session 可被任意伪造。 - 伪造
name=admin的 session 即可成为管理员;strlower会把 Unicode 变体归一化,注册变体这条路走不通。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果







