跳转至

nginx_parsing_vulnerability(Nginx解析漏洞)

漏洞描述

当Nginx存在一些配置不当时,就会出现漏洞,该漏洞为Nginx配置不当导致的解析漏洞

影响版本

该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞

环境配置

  • Vulhub项目
  • Docker-compose启动

漏洞复现

Vulhub官方提供了一个恶意文件,这里我们直接用该文件测试

CSS
http://192.168.40.129/uploadfiles/nginx.png

可以看到nginx.png内含phpinfo的恶意payload

CSS
http://192.168.40.129/uploadfiles/nginx.png/.php

在其后添加/.php,成功解析php代码

漏洞原理

cgi.fix_pathinfo配置项

该选项位于配置文件php.ini中,默认值为1,表示开启。当php遇到文件路径/test.png/x.php时,若/test.png/x.php不存在,则会去掉最后的/x.php,然后判断/test.png是否存在,若存在,则把/test.png当做文件/test.png/x.php解析,如若test.png还不存在如果在其前面还有后缀,继续前面的步骤,以此类推。若是关闭该选项,访问/test.jpg/x.php 只会返回找不到文件。

Bash
cat /usr/local/etc/php/php.ini-development | grep cgi.fix_pathinfo

security.limit_extensions配置项

在我的配置文件中,它位于/etc/php-fpm.d/www.conf中

这个选项开始是被注释了的也就是默认只允许执行php文件,可以在后面添加其它后缀,比如security.limit_extensions .jpg .php

像这样添加.jpg之后,.jpg文件也能以php格式来执行修改了后需要service php-fpm restart重启php

Vulhub官方这里是直接为空

触发逻辑分析

由于nginx做了如上配置,如果碰到.php后缀的就交给fastcgi来解析,因此我们可构造/test.jpg/.php(此处的.php必须是服务器端目录下不存在的如x.php等),这里的test.jpg就是我们上传的图片木马

当fastcgi处理x.php时,发现文件不存在,这里php.ini配置文件中的cgi.fix_pathinfo=1就发挥了作用,如果当前路径不存在,就返回上层路径即test.jpg,此时fastcig就将test.jpg格式文件当php来解析了

但是,在php-fpm.conf配置文件中的security.limit_extensions配置项限制了fastcgi要解析的文件类型(如果该选项未开启,默认只解析.php)

查看配置文件发现这里未限制fastcgi要解析的格式,故造成nginx因错误配置不当发现解析漏洞

img

修改配置文件

img

此时再去添加/x.php访问我们上传的图片木马时,提示access denied 该漏洞修复。

img

修复建议

  1. 在php版本比较低时,将php.ini文件中的cgi.fix_pathinfp的值设置为0,即关闭cgi解析
  2. php-fpm.conf中的 security.limit_extensions =.php,即仅支持.php后缀解析