nginx php pathinfo 修复

本文介绍了一个影响数百万Nginx服务器的PHP Pathinfo漏洞。该漏洞允许攻击者通过伪装文件扩展名绕过上传限制,执行恶意PHP代码。文章详细解释了漏洞原理,并提供了在生产环境中防止此漏洞的推荐配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx php pathinfo文件类型解析漏洞,已经有数百万台服务器被发现存在此漏洞。
这个漏洞一旦被利用后果严重,这里简短说明这个漏洞的原理,同时列出在生产环境中推荐的配置。
假设php.ini中cgi.fix_pathinfo=1(默认就是1),同时存在以下nginx的配置:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}

假设存在一个文件test.jpg,提交URL : /test.jpg/index.php
则这个 test.jpg将会被当成PHP脚本执行!!

那么,如果网站允许上传图片,攻击者只要将php木马文件后缀名修改为.jpg, 上传(因为PHP上传类型检测是通过后缀名检查的,.jpg将认为是图片,于是上传成功),并构造上述形式URL, 将成功运行木马!!! 造成网站被黑。

这个漏洞仅适用于nginx,不适用用apache, iis

1. 如果php项目没有使用pathinfo模式的URL,则设置php.ini中cgi.fix_pathinfo=0即可,无须其它特殊设置。

2. 若项目中使用了pathinfo模式的URL, 比如CI框架,则需要设置以下步骤(缺一不可)
A. php.ini中设置cgi.fix_pathinfo=1 , 否则会提示找不到文件
B. nginx中关于fastcgi配置部分应该调整为

location ~ “\.php” {
fastcgi_pass 127.0.0.1:9000;
#其它指令

if ( $request_uri ~ ‘\..*/.*\.php’ ) {
return 403;
}
}

或者

if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}

是不被推荐的,因为php-fpm.conf中配置的
pm.status_path = /php-status.php

是一个虚拟URL, 会被上述规则屏蔽,故不推荐。

<think>好的,我需要帮助用户了解Nginx解析漏洞的原因及修复方法。首先,我要回忆相关的知识,并查看用户提供的引用内容。用户给出的四个引用都提到了Nginx解析漏洞与配置错误有关,特别是php.ini和php-fpm的配置问题。 首先,漏洞的原因。根据引用[1],漏洞是因为Nginx的错误配置导致文件以错误格式执行。引用[2]提到,漏洞是由于cgi.fix_pathinfophp-fpm配置共同导致的,与NginxPHP版本无关,属于配置问题。引用[3]指出Nginx默认配置会将.php文件交给fastcgi处理,而引用[4]也提到配置不当是主要原因。因此,我需要将这些点整理出来,说明漏洞的主要原因是配置不当,特别是php-fpm的安全设置不足。 接下来是修复方案。引用[2]建议在php-fpm中设置security.limit_extensions为.php,并重启服务。此外,可能还需要检查Nginx的配置,确保正确的文件路径处理,避免解析其他后缀为PHP。可能需要关闭cgi.fix_pathinfo,或者修改Nginx的配置,避免将非PHP文件交给PHP处理。 然后,生成相关问题。用户示例中的相关问题涉及原因、修复、其他配置漏洞、与PHP版本的关系,以及如何检测漏洞存在。根据这些,我需要设计类似的问题,比如漏洞的根本原因是什么,如何修复,其他配置错误漏洞,漏洞是否与版本有关,检测方法等。 需要确保回答结构清晰,分点说明原因和修复方案,并正确引用提供的资料。同时,所有数学公式或代码要用正确的格式,不过这里可能不需要数学公式,但代码部分如果有配置示例的话需要使用代码块。 最后,检查是否符合用户的要求:中文回答,正确引用标识,结构清晰,真实可靠。</think>### Nginx解析漏洞的原因及修复方案 #### 一、漏洞原因 1. **配置不当导致文件解析错误** Nginx默认配置中可能存在以下问题: - 当请求的URL路径包含`.php`但文件不存在时,Nginx会将路径中最后一个后缀(如`/test.jpg/test.php`)解析为PHP文件并转交给FastCGI处理[^1][^3]。 - `php-fpm`的`security.limit_extensions`未严格限制可执行后缀,默认允许`.php`以外的文件(如`.jpg`)被当作PHP解析[^2]。 2. **PHP配置的协同问题** - `php.ini`中`cgi.fix_pathinfo=1`(默认值)会导致PHP解析器尝试修正路径,将非PHP文件(如含恶意代码的图片)作为PHP执行[^4]。 #### 二、修复方案 1. **修改php-fpm配置** 在`php-fpm.conf`中限制可执行文件后缀: ```nginx security.limit_extensions = .php ``` 重启php-fpm服务使配置生效。 2. **调整Nginx配置规则** 避免将非PHP文件交给FastCGI处理,例如: ```nginx location ~ \.php$ { # 添加文件存在性检查 if (!-f $document_root$fastcgi_script_name) { return 404; } # 其他FastCGI配置... } ``` 3. **关闭PHP的路径修正功能** 修改`php.ini`文件: ```ini cgi.fix_pathinfo = 0 ``` 此操作需重启PHP服务[^2][^4]。 #### 三、验证修复效果 - 上传包含PHP代码的图片文件(如`test.jpg`),尝试通过`http://example.com/test.jpg/.php`访问,若返回404或拒绝执行,则修复成功。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值