nginx解析漏洞、编码绕过漏洞,配置加固要点
Nginx解析漏洞和编码绕过漏洞是两类常见的 Web 服务器安全风险,可能导致恶意脚本执行或文件被错误解析。
本文先说明漏洞成因,再给出可直接执行的配置加固步骤,并附上验证方法,适合使用 Nginx 的站长和运维新手操作。
漏洞是怎么产生的
解析漏洞通常与 PHP 的 CGI 配置有关。
当 Nginx 通过 fastcgi_pass 将请求转发给 PHP-FPM 时,如果请求路径为 xxx.jpg/xxx.php 或 xxx.jpg%00.php,Nginx 可能因为路径解析的差异,把图片文件当作 PHP 脚本交给 FastCGI 处理。
攻击者只要在图片中嵌入 PHP 代码,就能让服务器执行恶意指令,从而实现入侵。
编码绕过漏洞则利用 Nginx 对 URL 编码的解析规则。
例如 %00(空字节)、%0a(换行)、%20(空格)等字符在某些场景下可以被用来绕过访问控制或匹配规则,导致敏感文件被读取或脚本被执行。
加固前先检查现状
在修改配置之前,先确认当前 Nginx 版本和已启用模块。
登录服务器,执行:
nginx -v
nginx -V 2>&1 | grep -E 'http|fastcgi'
查看站点配置中哪些 server 块包含 fastcgi_pass 或 proxy_pass,把这些位置记录下来,后续需要重点调整。
核心加固步骤
1. 隔离 PHP 解析位置
编辑 Nginx 配置文件(如 /etc/nginx/nginx.conf 或站点 conf 文件),确保只有明确的 .php 请求才会交给 PHP-FPM。
在 server 块中找到或添加如下配置:
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
同时给静态资源目录增加白名单约束,例如图片目录:
location ~* \.(jpg|jpeg|png|gif|bmp|swf)$ {
expires 30d;
access_log off;
# 禁止图片文件被当作 PHP 解析
try_files $uri =404;
}
这样即使攻击者构造 test.jpg/xxx.php,Nginx 也会因为 try_files 检查而返回 404,不会进入 PHP 处理逻辑。
2. 过滤非法编码字符
在 http 块或 server 块中加入 URL 过滤规则,拦截包含空字节、换行等危险编码的请求:
if ($request_uri ~* (\%00|\%0a|\%0d|\%20|\%2f|\%5c)) {
return 403;
}
注意 %2f 是斜杠的编码,%5c 是反斜杠的编码,这些都可能被用来绕过路径匹配。
如果你的业务确实需要这类字符,请单独放行,不要直接删除该规则。
3. 禁止上传目录执行脚本
如果网站存在文件上传功能,必须给上传目录单独禁用 PHP 执行权限。
在站点配置中加入:
location /upload/ {
location ~ \.php$ { return 403; }
try_files $uri $uri/ =404;
}
这样即使上传了带 PHP 代码的图片,访问 upload/图片名.php 也会被拒绝。
避坑指南
不要直接删除 fastcgi_pass 配置,否则会导致整个站点的 PHP 无法运行。
改配置前先备份所有有改动的文件:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
修改后一定要验证语法并重载服务:
nginx -t
systemctl reload nginx
有些安全组件或 CDN 会自动拦截 %00,但服务器本身的加固不能省。
另外 Nginx 的 if 指令只能在 location 或 server 上下文使用,不要写在 http 块里,否则会报错。
效果验证
在网站根目录创建测试文件 test.jpg,内容写入 ,然后尝试访问下面的地址:
php phpinfo();?
>
/test.jpg/.php
/test.jpg%00.php
/upload/test.jpg/xxx.php
如果返回 403 或 404,说明解析漏洞已经堵住。
如果返回 PHP 信息页面,说明配置仍有遗漏,请检查 location 匹配顺序和 try_files 是否生效。
最后再访问一个正常的 index.php 页面,确认 PHP 功能没有受影响。
完成以上步骤后,你的 Nginx 已经能有效抵御解析漏洞和常见的编码绕过攻击。
如果你正在处理 Nginx 解析漏洞、编码绕过漏洞的配置加固要点,建议先按本文步骤完整执行,再根据自己环境微调;
遇到异常时优先回看避坑说明。