PHP 5.4 默认不存在空字节(%00)截断导致的文件包含漏洞,因自5.3.4起已移除该支持;但LFI仍可通过路径穿越、php://filter、日志注入等方式利用。

PHP 5.4 默认不存在空字节(%00)截断导致的文件包含漏洞。
原因很明确:PHP 自 5.3.4 版本起已移除对 URL 和文件路径中空字节(%00 或 \x00)的截断支持。这意味着在 PHP 5.4 及之后所有版本中,include($_GET['file']) 这类代码即使接收了形如 ../../etc/passwd%00.php 的参数,底层函数也不会将 %00 视为字符串截断符,而是原样传递给文件系统——而操作系统层面通常拒绝以空字节结尾的路径,最终导致包含失败或报错(如 failed to open stream: No such file or directory),无法绕过扩展名校验。
不过要注意几个关键前提:
- ✅ PHP 配置未被降级兼容:某些老旧环境可能通过自定义补丁、Suhosin 扩展(已废弃)或非标准编译选项重新启用了空字节处理,但这是异常情况,不属于 PHP 5.4 官方行为。
- ✅ Web 服务器不参与截断:Apache、Nginx 等本身不会对请求参数做
%00截断;漏洞本质是 PHP 解析层的行为,不是中间件问题。 - ⚠️ 空字节失效 ≠ 文件包含安全:即便
%00不再起作用,攻击者仍可利用其他手法绕过,例如:- 路径穿越(
../../../)配合日志文件、Session 文件、临时文件等可预测路径 -
php://filter读取源码(无需截断) -
data://或php://input(需allow_url_include=On) -
phar://协议触发反序列化(与截断无关)
- 路径穿越(
所以结论是:
PHP 5.4 中空字节截断已被彻底修复,不能用于绕过 .php 后缀限制。但这只是移除了一个老式绕过手段,文件包含漏洞本身是否存在,仍取决于你是否对用户输入做了白名单校验、路径规范化和上下文隔离。
立即学习“PHP免费学习笔记(深入)”;
重点不是“PHP 5.4 还有没有 %00 漏洞”,而是“你的 include 是否还接收用户可控路径”。



















