文件包含
1 什么是文件包含漏洞
由于网页包含其他文件而引发的漏洞
1.1 按照原因分类
1.1.1 内容包含
不同的页面包含相同的内容,比如页眉页脚
1.1.2 函数的包含
公共函数,如Utils.php,其他页面可以随时引用
1.2 按照包含方式分类
1.2.1 本地
Local File Inclusion→LFI漏洞
目录遍历漏洞/任意文件访问漏洞
主要是因为使用了include函数
1.2.2 远程
Remote File Inclusion→RFI漏洞
漏洞 | 描述 | 原因 | 后果 |
---|---|---|---|
XXE | XML外部实体注入 | 使用XML传输数据,并且允许解析外部实体 | 导致访问敏感文件、探测端口、执行系统命令 |
SSRF | 服务端请求伪造 | 因为使用了curl_exec()之类的函数 | 导致端口扫描、攻击内网主机、绕过防火墙、获取敏感信息、访问大文件造成内存溢出、操作Redis等等 |
RFI | 远程文件包含 | 使用了include | 导致任意文件访问、包含shell代码 |
-
如果服务器要支持远程文件包含,则必须再配置文件
php.ini
中修改allow_url_fopen=On allow_rul_include=On
2 PHP相关函数和伪协议
函数 | 作用 |
---|---|
include() | include语句包含并运行指定文件 |
include_once() | 只包含一次,不重复包含 |
require() | 和include一样,不过出错时会停止 |
require_once() | 同include_once() |
fopen() | 打开文件或者URL |
readfile | 读取文件并写入到输出缓冲 |
highlight_file | 语法高亮一个文件 |
show_source | 等于highlight_file() |
file_get_contents | 将整个文件读入一个字符串 |
file | 把整个文件读入一个数组中 |
3 DVWA靶场实践
3.1 Low级
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
可见源码只是根据url中page
参数的值来包含文件,而没有经过任何过滤,此处会产生漏洞。只需将page
改为目标服务器中的指定文件即可读取,如Linux中的etc/passwd
,上传的🐎。
注意此处连接shell需要加cookie值。
3.2 Medium级
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
可见源码对url中参数进行了限制,这里可以使用双写方式绕过。
3.3 High级
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
可见源码中只允许file伪协议来读取文件。
3.4 Impossible级
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
此处使用白名单限制了包含的文件,修复了漏洞。
4 挖掘与利用
4.1 URL关键字
- URL参数名字出现了page、file、filename、include等
- URL参数值出现了文件名,比如xxx.php、xxx.html等。
4.2 LFISuite
https://github.com/D35m0nd142/LFISuite
https://gitee.com/goforconquering/my-labrary/blob/master/LFISuite.zip
4.3 常见敏感路径
-
robots.txt
-
sitemap.xml
-
网站的备份数据wwwroot/ xxx.sql xxx.zip
-
后台登录的目录/admin /manage
-
源码
-
上传的目录/upload /upload.php
-
mysql的管理界面phpadmin密码爆破
-
程序的安装路径/install
-
php探针phpinfo 雅黑探针
-
文本编辑器Ueditor kindeditor CKeditor
-
Linux: /etc/passwd /etc/shadow→SHA512 /etc/sudoers→sudo
-
MacOS: .DS_Store
-
编辑器的临时文件 .swp
-
目录穿越(title=利用文件包含):Windows IIS Apache pikachu
-
tomcat的WEB-INF路径下: web.xmlweb应用程序配置文件,描述了serviet和其他应用组件配置及命名规则,database.properties数据库配置文件,classes用来存放Java类文件,lib用来存放打包郝的库,src用来放源代码
-
其他 secret.txt password.txt
5 修复方案
-
PHP配置
修改php.ini中
allow_url_fopen=Off allow_url_include=Off
-
禁用动态包含
文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,从而引发漏洞。
-
过滤协议、目录字符
-
设置文件白名单