结核性蛛网膜炎

注册

 

发新话题 回复该主题

熊海CMSV10代码审计与漏洞分析及 [复制链接]

1#
记得点击蓝字
  ".."表示当前目录的上一级目录
  "./"表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
  "../"表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定

“实例1”:如下图所示,这时候传参数"r",值是文件名"hy",没带后缀,因为第五行代码会拼接PHP后缀,想去包含同目录下的"hy.php"执行里面的phpinfo();内容,结果失败了,通过第一行报错可以看出来,因为第五行代码拼接了前缀"files/",导致路径出错,找不到该文件,包含失败。

那么正确姿势如下图所示,利用"../"来跳出限制的"/files"目录,这时候第五行代码包含的文件便是当前路径下的“hy.php”文件,成功包含。

二、截断后面的PHP后缀名。

这里其实有学弟当时不理解为什么非要截断后面的PHP,网上很多教程都是演示的在根目录新建个xxx.php,内容是phpinfo();然后直接r=../xxx去包含验证漏洞存在就完事了,那么怎么去利用最终没有说,因此也就困惑于为什么要去截断后面的后缀。

其实很好想通,利用文件包含漏洞,最想达到目的是为了拿webshell,那么在正常情况下,文件上传在后台的地方,是很少会让你上传一个PHP文件的,大多是图片、文本类型的文件去上传,所以,如果我们传了一个图片是"ssn.jpg",然后想去包含它,结果到这里就因为第五行代码的拼接成了"files/ssn.jpg.php"这样是肯定执行不了图片里面的PHP代码的。

因此我们需要截断后面的.php后缀,这里使用Windows文件名字的特性及Windows文件名的全路径限制进行截断。1.Windows下在文件名字后面加“.”不影响文件。2.Windows的文件名的全路径(FullyQualifiedFileName)的最大长度为字节。但是这个是有利用条件的,在我这几次测试过程中,发现必须同时满足“php版本=5.2.17、VirtualDirectorySupport=enable(在phpinfo信息里面可以查看是否开启,“坑二”会详细介绍这一选项)”

另外有一点,就是文件包含这里,不论你文件的后缀是什么,他包含的时候是只管你文件的内容的,因此你不论是弄成文本还是图片,只要里面内容是可以执行的PHP代码,就可以包含执行利用成功,因此这也是文件包含利用的一个要点,通过实例2来说明。“实例2”:如下图所示,这里还是在test.php同级目录下新建"ssn.jpg",内容为phpinfo();,在通过实例1的办法跳出了前缀"/files"目录限制后,但是由于第五行代码的拼接".php"后缀,导致包含失败。

那么正确的姿势如下图所示,先用python语句生成个"."用以突破Windows全路径长度限制,然后粘贴到hackbar的输入框内,点"Execute"执行,可以看得报错显示“路径被截断为以内”,那么也就是成功的把后缀".php"截断了,因此最终也就包含成功执行了"ssn.jpg"里面的phpinfo代码。

“坑二”:截断失败在我实际第一次操作过程中,和实例2一样的payload却并没有包含成功,如下图所示,当时就很纳闷,一开始以为是操作系统的问题,换了win7,同样也不行,又以为是PHP版本问题,换了5.4、5.2.17和其他版本也不行。

然后联系了下其中一篇审计复现成功文件包含的文章作者,对比发现是我当时用的是phpstudy_pro,他复现的时候用的是phpstudy,最终经过一系列的探究,初步估计是是这个VirtualDirectorySupport选项没开启的差别。

然后也通过几次实验,发现VirtualDirectorySupport选项,phpstudy、phpstudy默认开启,phpstudy_pro默认关闭。那么这个选项到底是什么东西呢,翻阅相关资料可以找到说明:

提问:我在phpinfo.php中看到“虚拟目录支持”已禁用,如何启用它?phpvirtual-directory

回答:简而言之:你不容易。而且你不应该。更长的故事:PHP应该提供无共享的环境。在这种情况下,这意味着如果两个脚本并行运行,则它们不应相互干扰。在大多数情况下,这没有问题,因为不同的脚本使用不同的进程。(带有modprefork,FastCGI,fpm等的Apache模块)但是在某些情况下,人们在线程环境中将PHP用作模块。(MicrosoftIIS模块,Apachemodmpm模块等。)如果是这种情况,PHP不能依靠操作系统来分隔上下文,而必须自己执行。一个相关区域是当前工作目录。您提到的选项与此有关,名称令人误解:它不是“虚拟目录支持”,而是“虚拟当前工作目录支持”。它是文件系统操作的抽象。因此,当两个PHP请求位于不同的线程和类似include"./foo.php";的代码中时,您希望该代码相对于请求的主脚本而不是环境的全局状态。VCWD支持可以做到这一点。因为仅与线程环境相关,所以启用/禁用绑定到PHP是否构建线程安全的设置,该设置在编译时完成。除非您需要,否则此功能已关闭。作为用户,您不必关心它-它与使用流或PHP脚本中的内容的能力无关。

回答的链接

分享 转发
TOP
发新话题 回复该主题