目录
文件包含漏洞原理
当通过某些 PHP 函数通过 URL 动态引入文件时,传入的文件名没有得到正确的验证,并且操作了非预期的文件,这可能会导致意外的文件泄漏甚至恶意代码注入。 文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞。 包含的文件可以是各种文件格式。 当文件中包含恶意代码时,就会出现远程命令执行或文件上传漏洞。
公共文件包含函数
(1)include():包含并运行指定文件。仅生成警告,脚本继续执行
(2) require():包含并运行指定的文件。如果出错,则生成错误并终止脚本。
(3) include_once():在脚本执行过程中包含并运行配方文件。 与include的区别:检查是否已包含,如果已包含则不再包含。
(4) require_once():在脚本执行期间包含并运行配方文件。 与require的区别:检查是否已包含,如果已包含则不再包含。
PHP伪合约文件://
使用前提:该协议在双断条件下也能正常使用;
allow_url_fopen:off/on(指定是否允许从远程服务器或网站检索数据)
allowed_url_include: off/on (指定是否允许包含/需要远程文件)
1、准备一个文件包含漏洞的php文件和一句话木马的txt文件
2. 访问存在文件包含漏洞的文件
文件包含成功。
PHP://过滤器
阅读源码并进行base64编码输出。 使用前提:双断情况下也能正常使用;
allowed_url_fopen :关闭/打开
allowed_url_include:关闭/打开
1.查看php文件源代码
php://输入
您可以访问请求原始数据的只读流,并将 post 请求中的数据作为 PHP 代码执行。
allowed_url_fopen :关闭/打开
允许 url_include: 开启
1.使用burpsuite抓包并重放
为什么图中抓的是GET包,而我们传的是post参数呢?
解压合约 zip://protocol
用法:zip://[压缩文件的绝对路径]#[压缩文件内的子文件名]
1.准备压缩包
2. 测试
没有执行成功的原因是什么? # 数字未编码
zlib://协议
用法:compress.zlib://[压缩文件的绝对路径]
数据://协议
允许 url_fopen:打开
允许 url_include: 开启
1.直接在网址栏前面添加木马语句
2.可以使用base64编码绕过
总结
协议
允许 url_fopen
允许 url_include
用法
文件://
关/开
关/开
?file=文件://路径/文件名.txt
PHP://过滤器
关/开
关/开
?file=php://filter/read=convert.base64-encode/resource=file
php://输入
关/开
在
?file=php://input 一句话木马
压缩://
关/开
关/开
?file=zip://压缩包路径%23压缩煎饼文件
压缩.bzip2://
关/开
关/开
?file=compress.bzip2://压缩包路径
压缩.zlib://
关/开
关/开
?file=compress.zlib://压缩包路径
数据://
在
在
?file=data://text/plain,一句话木马
?file=data://text/plain,base64,base64编码的句子木马
案例1:php://输入
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";
include($file);
}else{
echo 'click go baidu';
}
?>
1、使用php://input传递post流,burpsuite抓包写入一句木马
2、使用命令查看文件目录:dir并找到flag.txt
3、查看flag.txt文件内容:输入
4.检查flag.txt的内容php 获取文件列表,确保查询正确
PS:dos下的基本命令
命令
命令解释
目录
显示目录中的文件和子目录的列表以及有关文件的其他详细信息,包括文件大小、创建日期和时间等。
dir [驱动器:驱动器名称][path 目录路径] [/p] [/w] [/o] [/s]
[/p] 表示分页显示目录内容。 要查看下一个屏幕,请按任意键。
[/w] 表示以宽列表格式显示当前目录下的文件名
[/o] 表示按排序顺序显示文件
[/s]表示显示当前目录及其子目录下的所有文件列表。
复制
将一个或多个文件复制到另一位置。
copy [要复制的文件名] [要复制到的路径或文件夹]
移动
用于将文件或目录从一个位置移动到另一位置。 复制和连接之间的区别在于移动命令会从源位置删除文件。
move [要连接的文件的名称] [文件移动到的路径或文件夹]
md/mkdir
创建新目录
md [path代表要创建的目录的路径] [directoryname代表所有创建的目录的名称,该参数为必填项]
光盘
更改当前目录
cd [某盘d:c:等]
cd [] 进入根目录
cd [..] 进入上一级目录
任
重命名文件或文件夹
ren [oldfilename 旧名称] [newfilename 新名称]
德尔
用于删除目录中的文件。 要删除其他驱动器或目录中的文件,必须指定路径。
del [filename代表要删除的文件名]
rd/rmdir
用于删除文件夹
rd [directoryname代表要删除的文件夹名称]
CLS
清晰的屏幕
类型
显示文件内容
输入文件名.扩展名
回声
创建文件并填写内容
echo 内容>文件名.格式后缀
情况2:php://输入
<?php
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "successn";
echo $flag;
}
1.上传a的值进行测试
2.使用抓包传递值
案例3:php://过滤器
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo 'tips';
}
?>
PHP伪合约有过滤功能。 我们使用 php://filter 来获取base64编码的内容。
情况 4:zip://
<?php
error_reporting(0);
$file = $_GET["file"];
if (!$file) echo 'upload?';
if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){
echo "hack?";
exit();
}else{
include($file);
}
?>
1.输入上传文件
2、使用zip上传压缩包文件,获取当前路径。
3、取出绝对路径并执行一句话木马,找到flag.txt文件。
4、重新上传文件php 获取文件列表,修改txt文件内容,获取flag.txt文件内容。
案例5:文件包含apache日志---Windows
文件包含漏洞可以包含apache日志文件=文件路径必须已知+文件包含漏洞
日志按天数划分,查询速度快,且易于分类保存。
1.找到日志文件路径(如果日志文件太大,可能包含故障)
2.如果随意上传一句话木马,就会被写入日志。
3、查看日志文件,看看木马是否写了一句话
4、可以看出日志中写的一句话木马是经过编码的。 我们可以使用burp suite进行抓包,改掉一句木马。
5、访问日志的绝对路径,查看是否成功包含。
聚苯乙烯