用的是phpstudy部署的,昨天看到那篇文章了,就用我的服务器测试了一下。

 

5f51934db69dc.png

 

新建一个内容为<?php phpinfo();?>的

记事本,重命名保存为1.jpg

 

5f51936968a60.png

 

直接访问内网地址

 

5f51941623372.png

 

然后加入/.php

 

5f51939788e97.png

 

 

成功执行phpinfo();

 

漏洞分析

这是我的生产环境,根据漏洞特性,大概率就是fastcgi的问题。

查看该站点相关的nginx的配置文件

5f51951b18de6.png

 

可见 这里的正则处理,将文件传递给fastcgi处理,$fastcgi_script_name会被设置为1.png/.php,然后构造成SCRIPT_FILENAME传递给PHP CGI。如果PHP中开启了fix_pathinfo这个选项,PHP会认为SCRIPT_FILENAME是1.png,而.php是PATH_INFO,所以就会将1.jpg作为PHP文件来解析了。

处于好奇心去观察一下php的配置

5f5195aba6389.png

 

可见这里是注释了。我就非常奇怪,既然是注释了为什么还能让这个配置生效为1,不得已思考是否他的默认配置就是为1。

后记

查阅资料后可知,他的默认值就是1,无论是否添加了注释。

 

5f51988cb96b6.png

https://www.php.net/manual/zh/ini.core.php#ini.cgi.fix-pathinfo

 

修复方式是强制设置为0。并且需要对nginx的location规则进行设置。加一个判断是否以此类路径进行访问。如果是就返回403

    if ( $fastcgi_script_name ~ \..*\/.*php ){
              return 403;      
        }

 

5f5197449d355.png

转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/7248.html