KillaBoi/StealMyBitcoin-PoC
安全一个针对特定 CTF 挑战、可完整复现的 PHP 内存耗尽漏洞利用,供学习内存破坏技术的人研读。
如果你想完整看懂一个 PHP 内存破坏利用是如何一步步复现的,值得一读;它是绑定某一个具体挑战的教学产物,而不是通用攻击工具。
解决什么问题
Steal My Bitcoin 挑战要求解题者从一个普通的 HTTP 接口一路走到在 PHP worker 上执行代码。光看 write-up 会漏掉难啃的部分:一个线上体积约 250 KiB 的请求为何能触发 128 MiB 的内存上限致命错误、worker 里遗留的会话状态为何能被复用、泄漏出来的字节如何变成一个堆基址和一个函数指针。这个 PoC 用单个 Python 文件把这些阶段从头跑到尾,你能看到每个值是由哪次请求和响应产生的,而不只是最终结论。结果就是一个自带实验环境的流程,逐次泄漏是否被接受一目了然。
有什么不同
核心机制是在 PHP 上传进度解析期间强制触发内存上限失败。PHP 会在随后被复用的 worker 里留下状态,PoC 再精心构造后续请求,让带指针特征的字节经由 PHPSESSID cookie 返回。只有当至少四个候选值落在同一个 2 MiB 对齐的 Zend 堆区域时,它才接受这个堆基址,并且要求流水线并发的多个 consumer 只给出唯一一个一致基址(各阶段细节)。代码指针阶段同样把页内偏移 0x112930 当作指纹来校验,由 zval_ptr_dtor 推出 zif_system,再放置伪造的 HashTable,让清理路径调用 zif_system(请求流程说明)。
实际好处是严格:形状不对就早早中止,而不是给出一个看着像、其实错的地址。代价是这些校验写死在某一种二进制布局上。README 明确说,Debian 的 php:8.4.26-fpm 堆栈虽然版本号相同,但二进制布局不同,运行会在代码泄漏阶段中止;偏移量是按内置 CLI 服务器、四 worker 的 Alpine PHP 8.4.26 校准的(实验环境要求)。每次运行还会在校验之前先把原始 HTTP 字节写到磁盘,失败尝试因而可以复查,但反过来说,中途中止的运行也会留下请求和响应文件。
谁值得试
适合想在受控实验环境里看清 PHP 堆操作和 worker 复用机理的安全学习者或 CTF 选手,并且愿意维护偏移量所针对的那个精确 Alpine 镜像。不适合想找通用 PHP 漏洞利用、扫描器,或想拿它去打生产服务的人;README 把它限定在 nginx 之后、走 loopback 的挑战实验环境里(项目说明)。也不适合无法复现指定构建的人,因为版本相同但构建方式不同的 PHP 镜像过不了指纹校验。
使用条件与边界
脚本本身只需要 Python 3.11 及以上加标准库,客户端几乎没有准备成本(上手步骤)。真正的限制在服务端:目标必须是内置 CLI 服务器、四 worker 的 Alpine PHP 8.4.26,与校准偏移量时使用的布局一致。版本号相同但用 Debian FPM 镜像的部署会在代码泄漏阶段失败。该 PoC 也未声明许可证,如果你想复用其代码而不只是阅读,这一点需要留意。
日常维护更多是围绕构建而不是脚本:泄漏校验基于指纹,不同的 PHP 补丁版本或基础镜像都可能让被接受的偏移量失效。堆检查还依赖时序和 worker 复用,README 的接受规则意味着一轮运行可能在半途就中止。输出目录带时间戳,文档给出的做法是用 --output-dir 指向一个新目录。
HotRepo 点评
HotRepo 记录该项目在 2026-10-26 的新项目榜(并非总榜)全语言榜单上排第 22,共 333 颗星。榜单只有一个记录日期,因此这只是一个快照而非增长序列,无法据此判断热度能否持续。当天的 HN 帖子获得 69 分、13 条评论,其中一位评论者认为该挑战通过 nginx 代理到 PHP 开发服务器,而不是常见的 FPM 或 mod_php 方式(评论)。在依赖这个 PoC 之前,值得确认目标镜像确实符合文档中的 Alpine 构建,而不只是 PHP 版本号一致。
Hacker News 讨论
本文由 AI 根据项目 README 生成,更新于 2026年10月26日,以项目官方文档为准。