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, 会被上述规则屏蔽,故不推荐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值