最简单有效的防御手段是在nginx配置中拦截含%00的请求,通过if($request_uri ~ "%00"){return 403;}全局阻断,并限制上传目录php执行、禁用cgi.fix_pathinfo、升级nginx至1.20+或启用modsecurity。

直接在 Nginx 配置中拦截含 %00 的请求,是最简单有效的防御手段。该漏洞本质是攻击者利用 URL 中的空字节绕过文件类型校验,让非 PHP 文件(如上传的图片)被当作 PHP 执行。Nginx 本身不解析 PHP,但与 FastCGI 协作时若未提前阻断,就会触发解析不一致问题。
用 location + 正则匹配并拒绝 %00 请求
在 server 或 http 块中添加如下配置,可全局拦截所有含 %00 的 URI:
- 使用
location ~ \.php.*%00匹配形如/a.jpg%00.php的恶意路径 - 更稳妥的做法是匹配任意位置出现
%00的请求:if ($request_uri ~ "%00") { return 403; } - 注意:if 在 location 外使用是安全的,但避免在 location 内嵌套多个 if,易引发意外行为
限制用户上传目录禁止执行 PHP
即使请求未带 %00,上传目录若允许执行 PHP,仍是高危面。应明确禁止动态执行:
- 对上传目录(如
/uploads/)单独设置 location 块 - 内部禁用 PHP 解析:
location ~ ^/uploads/.*\.php$ { deny all; } - 同时关闭 autoindex 和脚本执行:
fastcgi_pass off;或直接不配置 fastcgi_pass
配合 try_files 和后端校验增强健壮性
单靠拦截 %00 不够,需叠加逻辑校验:
- 在 PHP 处理 location 中加入
try_files $uri =404;,确保只处理真实存在的 PHP 文件 - 禁用 PHP 的
cgi.fix_pathinfo=0(在 php.ini 中),避免 FastCGI 自行补全路径导致二次解析 - 检查上传文件时,在应用层验证 MIME 类型和文件头,不只依赖后缀
升级与替代方案建议
拦截是临时防线,根本解决仍需升级或加固:
- Nginx 0.8.37 之后版本已修复该漏洞,建议升级至 1.20+ 稳定版
- 如无法升级,可启用 ModSecurity 规则集(如 OWASP CRS),内置规则能识别 %00 注入模式
- 云 WAF(如腾讯云、阿里云)也普遍支持空字节特征检测,适合快速补位











