购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.6 任意文件包含

文件包含漏洞利用了PHP语言的一个特性,即当PHP程序使用include()等函数包含其他文件时,如果文件内容中包含PHP标签,该PHP程序就会自动将文件中含有PHP标签的部分当作PHP代码去解析,而忽略文件后缀名是否为.php。假如管理员忽略了文件包含漏洞,黑客依然可以利用任意文件包含漏洞获取WebShell。

1.6.1 常见的利用方式

1.本地文件包含

本地文件包含漏洞是由于开发人员对文件包含功能点的用户可控文件路径过滤不严格而造成的。黑客可以利用该漏洞读取服务器本地敏感文件和包含本地带有WebShell内容的文件,从而达到获取敏感数据甚至控制服务器的目的。

常规本地文件包含漏洞的测试代码如下。

利用效果如图1-168所示。

图1-168 读取Windows系统配置文件system.ini

下面介绍一些在实战中常用的系统敏感文件,表1-6、表1-7分别给出在Windows系统下和在Linux系统下的一些常见敏感文件。

表1-6 Windows系统常见敏感文件

表1-7 Linux系统常见敏感文件

本地文件包含的常见绕过漏洞测试代码如下。

可以看出,相比于上面常规的漏洞代码,这次我们强制在结尾拼接了.txt,目的是让用户只能包含后缀名为txt的文件,这并不是不可绕过的。

%00截断的利用条件是magic_quotes_gpc=Off且php版本小于5.3.4,利用方式如图1-169所示。

图1-169 %00截断读取Windows系统文件

路径长度截断也需要利用条件,Windows系统中点号需要长于256,而Linux系统则长于4096。在上述系统中,超出相应长度的部分会被丢弃,利用方法如图1-170所示。

图1-170 长度截断读取Windows配置文件

2.远程文件包含

如果php.ini配置文件中的allow_url_fopen和allow_url_include配置为ON,利用include()等具有包含功能的函数就可以加载远程服务器上的文件。如果开发人员没有对用户的可控点做严格的过滤,就会导致用户可以执行恶意文件的代码,也就形成了远程文件包含漏洞。

常规远程文件包含就是简单地从其他服务器上获取资源并载入该服务器,最终达到执行PHP代码的目的,如图1-171所示。

其中phpinfo.txt中的内容是<?php phpinfo();?>。

图1-171 远程包含phpinfo.txt并执行

当然,如果像以下代码这样稍加限制,我们依然是可以绕过的,如图1-172、图1-173所示。

图1-172 在结尾使用?绕过

图1-173 在结尾使用#绕过

1.6.2 任意文件包含进阶

1.php伪协议

php带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数。除了这些封装协议,php还能通过stream_wrapper_register()来注册自定义的封装协议。

php可以访问请求的原始数据的只读流。简单来说,就是可以将POST部分的完整内容看作被包含的文件内容。与普通的文件包含不同的是,该方法并不需要本地或外部服务器上存在该文件,因为最终包含的是文件内容,其他的内容并不是非常重要,利用方法如图1-174所示。

图1-174 php://input的使用

php://filter是一种元封装器,用于数据流打开时的筛选过滤。该伪协议通常用来读取PHP源码。因为从上面的各种包含中我们可以看出,当包含的文件存在PHP标签时,PHP代码会被执行。同理我们知道,PHP代码被解析后我们是看不到源码的。因此,我们可以利用该协议,将文件的内容进行编码,如Base64编码,这样<?php ?>标签经过编码就变成了PD9waHAgPz4=。很明显,PHP标签就不会被识别出来了,我们就可以像包含正常文本文件那样将文件内容的Base64编码形式包含进来,然后自行解码,从而得到我们想读取的PHP源码,如图1-175所示。

图1-175 读取info.php源码的Base64编码

2.file伪协议

通过file伪协议可以访问本地文件系统,读取文件的内容,如图1-176所示。

图1-176 file伪协议读取系统配置文件

3.data伪协议

data伪协议的功能与php://input类似,两者最大的区别在于,如果使用了php://input伪协议,POST的位置就会被文件内容占用,我们就无法再POST操作其他参数了。data伪协议可以用作数据流封装器,内容直接跟在协议后面,为我们节省了POST的位置,利用方法如图1-177所示。

图1-177 data伪协议获取phpinfo

其中,PD9waHAgcGhwaW5mbygpOz8+是<?php phpinfo();?>的Base64编码形式。

4.phar伪协议

phar伪协议是PHP解压缩包的一个函数,不管后缀是什么,都会被当作压缩包来解压。用法为?file=phar://压缩包/内部文件。注意,PHP版本大于或等于5.3.0的压缩包需要ZIP协议压缩,不能使用RAR协议压缩。将木马文件压缩后,改为其他任意格式的文件就可以正常使用了。

利用方法就是先写一个一句话木马文件shell.php,然后用ZIP协议压缩为shell.zip,最后将后缀改为.png或其他格式,结果如图1-178所示。

图1-178 phar伪协议获取压缩包内WebShell

5.ZIP伪协议

ZIP伪协议和phar伪协议类似,只是用法不同,ZIP伪协议将代码后面的/替换成了#,例如?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名],如图1-179所示。

图1-179 ZIP伪协议获取压缩包内WebShell P0MvCwQ5rVNx/Ovu4InAQe1xbJOUa7JRSdN4uHMb94kSHmJ14uwhCq67pnFrVruY

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开