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