De1CTF 2019 - Web - SSRF Me

AI-摘要
Microsoft Xiaoice's GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
De1CTF 2019 - Web - SSRF Me
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | De1CTF 2019 |
| 方向 | Web |
| 难度 | 中等(代码审计 + 密码学攻击) |
| 环境 | 授权靶场(已脱敏) |
| 漏洞类型 | SSRF + MD5 长度扩展攻击 + hash 校验绕过 |
信息收集
访问首页得到 Python 源码(Flask 应用),核心逻辑:
1 |
|
源码里 echo $FLAG > /app/flag.txt 说明 flag 写在 /app/flag.txt。
漏洞分析
关键点:
- flag 位置:
/app/flag.txt。 /geneSign只生成action="scan"的签名:getSign("scan", param)。/De1ta校验md5(param, 'goku-like') == sign且action同时含scan和read,才能触发file://读文件。- waf 拦截
file、gopher等开头。
核心矛盾
sign只能通过/geneSign生成,但它固定action="scan",签名只覆盖"scan" + param。- 我们需要
action同时含scan和read(如"scan|read"),但md5("scan|read" + param)与/geneSign给的md5("scan" + param)不一致。
绕过:MD5 长度扩展攻击
getSign 的实现:
1 | def getSign(action, param): |
签名实际是 md5(secret + param + action)。利用 MD5 长度扩展攻击:
- 先通过
/geneSign?param=拿到md5(secret + "" + "scan")的签名(即md5(secret + "scan"))。 - 已知该签名,可推算
md5(secret + "scan" + padding + 附加数据),从而构造param = "scan" + padding + 附加数据,附加数据包含read,使最终param + action同时含scan和read且签名正确。
利用过程
param里塞入file:///app/flag.txt(param经过 padding 后拼上read与文件名,绕过 waf 对file开头的拦截)。- 手写
hash_ext.py实现 MD5 长度扩展,构造出同时满足scan+read的 param 与 sign,最终action为"scan" + padding + "read"。 - 携带构造好的
sign、actioncookie 与param请求/De1ta,触发文件读取。
完整 EXP
MD5 长度扩展攻击实现(本地 hash_ext.py 思路):
1 | import hashlib, urllib.parse, requests |
说明:
hash_ext.py是本地 MD5 长度扩展实现,负责生成 glue padding 与续算 md5;上面的md5_extend为其调用占位,完整实现以本地脚本为准。
Flag
flag{xxxx}(已脱敏,来自 /app/flag.txt)
踩坑与总结
- 源码泄漏 flag 路径
/app/flag.txt。 sign = md5(secret + param + action),/geneSign固定action="scan"。- 通过 MD5 长度扩展攻击 让
action同时含scan与read,绕过签名校验并触发文件读取。 - waf 拦截
file/gopher开头,用param内 padding 拼接方式绕过。
参考
- 本地脚本:
_ssrfme/hash_ext.py(MD5 长度扩展攻击实现)
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果








