getimagesize() 堆内存泄漏仅限授权的渗透测试和安全研究使用。
| 字段 | 值 |
|---|---|
| CVE | CVE-2025-14177 |
| CWE | CWE-524 (使用未初始化的资源) |
| 严重性 | 中危 — CVSS 6.3 |
| 根本原因 | php_read_stream_all_chunks() 将连续的数据块写入 buffer[0],覆盖之前的数据,导致未初始化的堆内存泄漏 |
getimagesize("php://filter/.../resource=malicious.jpg", $info)
└─ php_read_stream_all_chunks()
├─ Chunk 1 (8KB) → memcpy(buffer+0, chunk1, 8192)
├─ Chunk 2 (8KB) → memcpy(buffer+0, chunk2, 8192) ← overwrites!
└─ $info['APP1'] = chunk2 + uninitialized heap garbage
恶意 JPEG 包含一个超大的 APP1 标记(16KB),以强制触发多块读取路径。返回的 APP1 字段会泄漏堆内存,其中可能包含凭据、令牌、会话数据或 ASLR 指针。
[1] RECON Find PHP app exposing getimagesize() output (APP1 field)
[2] PREP Craft malicious.jpg (APP1 = 16KB)
[3] EXPLOIT Upload → trigger getimagesize($file, $info)
[4] EXTRACT Parse $info['APP1'] for leaked heap data
[5] IMPACT Credential theft / token extraction / ASLR bypass
python3 CVE-2025-14177.py [mode]
./exploit_output/)exploit_output/
├── malicious.jpg # crafted JPEG payload (APP1 = 16KB)
├── exploit_standalone.php # deployable PHP exploit
├── exploit_report.json # full analysis report
└── test_cases.json # 3 test scenarios
| 案例 | 攻击向量 |
|---|---|
| 1 | 直接上传 → getimagesize($_FILES[...], $info) |
| 2 | 流过滤器 + LFI (php://filter/read=.../resource=...) |
| 3 | 远程图片 URL (/preview.php?url=attacker.com/malicious.jpg) |
$info 数组中的异常内存模式php://filter 包装器的 getimagesize() 调用升级 PHP 到已修补版本。没有变通方案 — 需要补丁。
php -v # verify version
如果升级受阻:在返回给客户端之前从 $info 中移除 APP1,或者在 allow_url_fopen 中禁用 php://filter。
此工具仅用于授权的安全测试。未经授权对您不拥有或未经明确书面许可的系统进行测试是违法的。
| 模式 | 操作 |
|---|
demo | 完整漏洞演示(默认) |
gen | 生成恶意 JPEG + PHP 漏洞利用代码 |
test | 生成测试用例 JSON |
analyze | 生成 JPEG + 模拟 + 分析泄漏 |
flow | 打印攻击流程图 |