HITCON 2016 - Web - Leaking

AI-摘要
Microsoft Xiaoice's GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
HITCON 2016 - Web - Leaking
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | HITCON 2016 |
| 方向 | Web |
| 难度 | Easy |
| 环境 | 授权靶场(已脱敏) |
| 漏洞类型 | Node.js vm2 沙箱 + Buffer 内存泄漏(类 Heartbleed) |
信息收集
访问 / 直接返回源码:
1 | ; |
漏洞分析
关键点
- flag 通过
eval("var flag_<64位随机串> = \"hitcon{flag}\";")赋值到随机变量名的全局变量。 - 用户输入
req.query.data(长度 ≤ 12)在 vm2 沙箱中执行。 - vm2 沙箱隔离了
process、require等,无法直接逃逸;变量名随机也无法猜取。
核心思路:Buffer 内存泄漏
旧版 Node.js 的 Buffer 构造函数(Buffer(n))分配内存时不清除之前的内容(类似 OpenSSL Heartbleed 漏洞)。flag 字符串 hitcon{...} 在 eval 时被分配到内存中,随后 vm.run 执行时用 Buffer(大数字) 分配一块大内存,即可「读到」之前 flag 字符串所在的内存。
payload
1 | Buffer(1000) |
Buffer(1000)= 12 字符,恰好满足length <= 12限制。- 用科学计数法可分配更大内存:
Buffer(1e5)(11 字符)= 100000 字节。
多次请求后在返回的未初始化内存中可搜到残留:
1 | flag_oZpOrsEasExUJnLhozst6WW6HraMU1eEu68g8lXrWwqKhL0icdwMCdtmUMWl0VT9 |
利用过程
- 访问
/拿到源码,确认 flag 被放入随机变量名、输入受 12 字符限制并跑在 vm2 沙箱。 - 用
Buffer(1000)作为data参数,触发未初始化内存回显。 - 反复请求,在响应中按
hitcon/CTF/flag/ uuid 大括号等特征搜索可打印字符串。 - 命中
hitcon{...}形式的内容,提取 flag。
完整 EXP
提取脚本:
1 | import urllib.request, urllib.parse, re |
payload 清单(长度 ≤ 12):
1 | Buffer(1000) # 12 字符 |
Flag
flag{xxxx}(已脱敏,内存中为 hitcon{flag{xxxx}} 形式)
踩坑与总结
- 源码泄漏(
/返回__filename),是分析入口。 - flag 被
eval放入 64 位随机变量名的全局变量,无法猜变量名获取。 - 旧版 Node Buffer 不清内存:
Buffer(n)分配的内存包含之前 flag 字符串的内容。 Buffer(1000)(12 字符)恰好满足长度限制;Buffer(1e5)用科学计数法分配更大内存。- 泄漏内容带随机性,需多次请求并用 latin-1 解码 + 可打印字符串正则筛选。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果







