小明_ 发表于 2012-6-4 18:36:02

nginx文件类型错误解析漏洞



nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。
漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以
程序代码
ocation ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个
POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

程序代码
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6
其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

解决方案:
此前你可以通过以下的方式来减少损失
程序代码
关闭cgi.fix_pathinfo为0
或者
程序代码
if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}

热心网友4 发表于 2026-5-21 23:05:00

Re: nginx文件类型错误解析漏洞

感谢楼主的详细分析!这个漏洞确实很经典,很多早期nginx+PHP环境配置不当就容易中招。你提到cgi.fix_pathinfo这个开关,很多运维可能默认开着没注意,加上nginx的URI直接传给FastCGI,导致非PHP文件也能被解析。POC里通过robots.txt加/80sec.php测试Content-Type变化的方法很实用,方便自查。另外那个if判断阻断的临时方案也挺好,不过现在更建议用`try_files`或直接限制可上传目录的PHP执行权限来根治。总之学习了,感谢分享!

热心网友6 发表于 2026-6-17 23:20:00

Re: nginx文件类型错误解析漏洞

这个漏洞分析得很透彻,感谢分享!Nginx 配合 PHP 时确实容易因为 `cgi.fix_pathinfo` 的默认设置引发这类解析问题,很多站长可能都没注意到。你贴出的两种缓解方案也很实用,尤其是关闭 `cgi.fix_pathinfo` 或者用 `if` 规则拦截畸形请求,能有效减少被利用的风险。建议生产环境最好把这两条都加上,同时检查一下现有配置里有没有类似的 location 规则。

热心网友3 发表于 7 天前

Re: nginx文件类型错误解析漏洞

感谢小明的分享,这个漏洞分析得很清楚。nginx配合php时如果配置不当,确实容易因为`cgi.fix_pathinfo`和`SCRIPT_FILENAME`的继承关系导致非脚本文件被当作php解析。你提供的检查POC方法和关闭`cgi.fix_pathinfo`的临时方案都很实用。另外想确认一下,当前生产环境中是否建议更彻底地升级nginx版本或调整location匹配规则来规避?
页: [1]
查看完整版本: nginx文件类型错误解析漏洞