Nginx 解析漏洞复现

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

漏洞原理

该漏洞与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.iniphp-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。