PHP 5.6环境下主要绕过方式是空字节截断(%00),利用C底层字符串终止符处理缺陷,配合Burp Suite将0x20改为0x00,使shell.php%00.jpg被截断为shell.php执行;其次为解析型后缀(如.php5、.phtml)、.htaccess配合、大小写/双写/点空格混淆及MIME伪造等。

PHP 5.6 环境下文件上传漏洞的绕过方式,主要围绕其历史特性、解析机制和常见防御缺陷展开。该版本虽已停止官方支持,但在大量老旧系统(如部分内网平台、教育靶场、遗留CMS)中仍广泛存在,是渗透测试与安全加固的重点目标。
空字节截断(%00 截断)
这是 PHP 5.6.6 及更早版本最典型的绕过手法,源于 C 语言底层函数对字符串终止符 \0 的处理逻辑。当服务端代码使用 move_uploaded_file() 或 file_put_contents() 等函数拼接路径时,若用户可控的文件名或路径参数中含 %00,会导致后续字符被截断,从而绕过扩展名检查。
- 典型场景:后端用
$_POST['filename'] . '.jpg'拼接保存路径,攻击者传shell.php%00.jpg,实际保存为shell.php - 触发条件:PHP
- 实操要点:需配合 Burp Suite HEX 编辑,将空格(0x20)替换为 0x00,且目标服务器需为 Apache 或 Nginx + PHP-FPM 组合(IIS 不适用)
解析型后缀绕过(Apache / Nginx 配置漏洞)
绕过黑名单的关键不在于“上传 .php”,而在于上传一个服务器会当作 PHP 解析的非标准后缀文件。这依赖于 Web 服务器的 AddType 或 AddHandler 配置。
- 常见可执行变体:
.php5、.phtml、.pht、.phar、.php3—— 若 Apache 的httpd.conf中存在AddType application/x-httpd-php .php .php5 .phtml,这些后缀均会被解析 -
.htaccess配合利用:上传内容为SetHandler application/x-httpd-php的 .htaccess 文件,再上传任意后缀图片(如shell.jpg),该目录下所有 jpg 文件都将被当作 PHP 执行 - 注意:Nginx 本身不解析 .htaccess,但若搭配 Apache 回源或配置错误(如未禁用 fastcgi_script_name),仍可能生效
大小写与双写混淆绕过
开发者常以简单字符串匹配做黑名单过滤,却忽略 PHP 和文件系统的大小写敏感性差异及正则替换逻辑缺陷。
- 大小写绕过:
shell.PHP、shElL.pHp—— Windows/IIS 对扩展名不区分大小写,但部分 PHP 代码用in_array(strtolower($ext), $deny)时若未统一转小写,可能漏判 - 双写/嵌套绕过:
shell.phpphp→ 后端用str_replace('php', '', $ext)过滤后变为shell.php;或shell.php.jpg→ 旧版 Apache mod_php 会取最后一个点后的后缀(.jpg),但某些解析器优先识别中间的 .php - 点号与空格干扰:
shell.php.(Windows 自动去除末尾点)、shell.php[空格](Windows 命名时自动裁剪)—— 利用操作系统层面的文件名规范化行为
MIME 与文件头校验绕过
仅依赖 $_FILES['file']['type'] 或简单调用 getimagesize() 是高危做法。PHP 5.6 下这些检测极易失效:
-
$_FILES['file']['type']完全由浏览器提交,可任意伪造(如将 shell.php 的 Content-Type 改为image/jpeg) -
getimagesize()仅验证文件头是否符合图像格式,无法识别“图片马”(在合法 JPG 文件末尾追加) - 真正有效的做法是使用
finfo_open(FILEINFO_MIME_TYPE)读取文件真实二进制头,但仍需配合白名单(如只允许image/jpeg、image/png),且不能单独作为唯一防线
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











