漏洞原理
该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。主要是由于下面两个配置的错误:
cgi.fix_pathinfo=1,
该配置项的作用是如果访问的.php
文件不存在,则采用上层路径,例如访问/test.png/.php
,一般情况下.php
文件是不存在的就会将/test.png
解析。这个配置在php.ini 中可以修改,默认是开启的
security.limit_extensions
配置项默认为空,该文件规定了什么后缀名当做php
代码执行,这个配置在php-fpm
的配置文件中:
通常在nginx.conf
的配置文件或者include
包含的其他配置文件下有以下信息
location ~ \.php$ {
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_pass php:9000;
}
上述代可以理解为:Nginx解析到.php
后缀的文件会交给FastCGI(类似Python解释器)处理。而构成Nginx解析漏洞,需关注php.ini
和php-fpm
配置。php.ini
中的cgi.fix_pathinfo=1
配置项,若访问的.php
文件不存在,会尝试上层路径解析,如/test.png/.php
可能解析为/test.png
。而php-fpm
配置中的security.limit_extensions
默认为空,这意味着未限制可执行PHP代码的文件扩展名。
漏洞环境
复制vulhub-master\nginx\nginx_parsing_vulnerability\www下的文件复制到phpstady的www目录下
phpStudy <= 8.1.0.7 (Windows版)的nginx存在该漏洞
我所使用phpstady8.1.1.3,做了一下修复,注释掉就可以了
漏洞复现,打开刚才复制进去页面
上传一张图片马
然后去访问可以看到是正常的一张图片
在最后加入/.php
或者任意一个不存在的文件名例如:/a.php,就会被解析为php
修复方法
1.将php.ini文件中的cgi.fix_pathinfo的值设为0。这样php在解析1.jpg/a.php这样的目录时,只要a.php不存在就会显示404。
2.将php-fpm
配置中security.limit _extensions后面的值设为.php。