gtxyzz

解决Nginx文件类型错误解析漏洞的方法

gtxyzz linux 2023-01-25 428浏览 0

Nginx文件类型错误解析漏洞这个是老生常谈的问题了,只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。其实此漏洞并不是Nginx的漏洞,而是PHP PATH_INFO的漏洞。例如用户上传了一张照片,访问地址为test.jpg,而test.jpg文件内的内容实际上是PHP代码时,通过test.jpg/abc.php就能够执行该文件内的PHP代码。
网上提供的临时解决方法有:

  方法①、修改php.ini,设置cgi.fix_pathinfo = 0;然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用,例如我以前博文的URL:http://www.domain.com/read.php/348.htm 就不能访问了。

  方法②、在nginx的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}。该匹配会影响类似 http://www.domain.com/software/5.0/test.php(5.0为目录),http://www.domain.com/goto.php/phpwind 的URL访问。

  方法③、对于存储图片的location{…},或虚拟主机server{…},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛、SNS上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态PHP配置。各大网站几乎全部进行了图片服务器分离,因此Nginx的此次漏洞对大型网站影响不大。

修改nginx.conf配置文件的临时解决方法,兼容“http://blog.s135.com/demo/0day/phpinfo.php/test”的PATH_INFO伪静态,拒绝“/zb_users/upload/2023/01/10/20221229051106-63ad216a1ffb4.jpg/test.php”的漏洞攻击:
location ~ \.php$ {
{
      if ($request_filename ~* (.*)\.php) {
            set $php_url $1;
      }
      if (!-e $php_url.php) {
            return 403;
      }

      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include   fastcgi.conf;;
}

也可将以下内容添加到fastcgi.conf文件中,便于多个虚拟主机引用:

try_files $fastcgi_script_name =404;

然后多个虚拟主机再调用
location ~ \.php$ {
{
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include   fastcgi.conf;;
}

继续浏览有关 LINUX技术 的文章
发表评论