Web漏洞之文件包含漏洞
字数 1826 2025-08-10 19:49:05
文件包含漏洞全面解析与防御指南
一、文件包含漏洞概述
文件包含漏洞(File Inclusion)是指对文件操作的函数未经过有效过滤,运行了恶意传入的非预期文件路径,导致敏感信息泄露或代码执行的安全问题。
核心特征
- 无论文件后缀类型,包含的文件内容都会被解析执行
- 主要出现在PHP语言中,但也存在于JSP/Servlet和ASP等其他Web语言
- 分为本地文件包含(LFI)和远程文件包含(RFI)两种类型
漏洞成因
- 开发人员为增加代码灵活性,将被包含文件设置为变量进行动态调用
- 用户可控制该变量且服务端未做合理校验或校验被绕过
二、文件包含类型详解
1. 本地文件包含(LFI)
能打开并包含本地文件的漏洞,测试用例如下:
<?php
$filename = $_GET['filename'];
if(isset($filename)){
include("$filename");
}else{
echo "file not found!";
}
?>
2. 远程文件包含(RFI)
能包含远程服务器上的文件并执行,危害性更大。需要满足以下PHP配置:
allow_url_fopen=Onallow_url_include=On(PHP5.2后默认为Off)
三、PHP文件包含函数
PHP提供了四个主要的文件包含函数:
| 函数 | 特点 |
|---|---|
include() |
执行到该函数时才包含文件,错误时只警告并继续执行 |
include_once() |
功能同include(),但重复调用同一文件时只调用一次 |
require() |
错误时会终止脚本运行 |
require_once() |
功能同require(),但重复调用同一文件时只调用一次 |
其他相关函数:
highlight_file()、show_source():语法高亮显示文件源代码readfile()、file_get_contents():读取文件并写入输出缓冲fopen():打开文件或URL
四、攻击利用手法详解
1. php://input协议
- 原理:访问请求原始数据的只读流,将POST数据作为PHP代码执行
- 前提:
allow_url_include=On - EXP:
http://127.0.0.1/index.php?file=php://input POST Data: <?php phpinfo();?>
2. php://filter协议
- 原理:获取指定文件源码,常配合编码使用以避免执行
- 前提:只需
allow_url_fopen=On - EXP:
http://127.0.0.1/index.php?file=php://filter/resource=xxx.php http://127.0.0.1/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
3. zip://伪协议
- 原理:访问压缩包中的文件
- 前提:PHP≥5.3.0,需使用绝对路径,#需编码为%23
- EXP:
http://127.0.0.1/index.php?file=zip://test.zip%23shell.php
4. phar://伪协议
- 原理:类似zip://但使用/分隔路径和文件名
- 前提:PHP≥5.3.0
- EXP:
http://127.0.0.1/index.php?file=phar://test.phar/shell.php
5. data:text/plain
- 原理:执行任意代码
- 前提:PHP≥5.2,且
allow_url_fopen和allow_url_include都开启 - EXP:
http://127.0.0.1/index.php?file=data:text/plain,<?php phpinfo();?> http://127.0.0.1/index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
6. file://伪协议
- 原理:访问本地文件系统
- 前提:需文件绝对路径
- EXP:
http://127.0.0.1/index.php?file=file:///etc/passwd
五、漏洞组合利用技巧
1. LFI+日志文件getshell
- 将恶意代码写入日志文件(如access.log/error.log)
- 通过LFI包含日志文件执行代码
- 默认日志路径:
/var/log/apache2/
2. 配合文件上传漏洞
- 上传恶意文件后通过文件包含执行
3. 配合路径遍历漏洞
- 直接包含目标文件:
../../etc/passwd
4. 配合session文件
- 利用session文件保存路径(可在phpinfo中查看)
- 常见路径:
/var/lib/php/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID
5. 配合SSH日志
- 注入恶意代码到SSH日志:
ssh -p端口 '<?php phpinfo(); ?>'@IP - 默认日志路径:
/var/log/auth.log
6. 配合运行环境
- 当PHP以CGI方式运行时,可包含environ文件:
/proc/self/environ - 通过修改User-Agent注入代码
六、常见敏感文件路径
Windows系统
c:\boot.ini // 查看系统版本
c:\windows\repair\sam // 存储初次安装密码
c:\windows\win.ini // 系统配置文件
Linux系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
七、防御与修复方案
1. 访问路径限制
- 使用
open_basedir配置限制文件访问范围
2. 输入过滤
- 过滤特殊字符:
.、/、\ - 禁止目录跳转字符:
../
3. 配置安全
- 关闭高危配置:
allow_url_include = Off allow_url_fopen = Off
4. 白名单机制
- 对包含文件设置白名单验证
5. 避免动态包含
- 尽量使用固定文件包含,避免动态变量包含
八、总结
文件包含漏洞危害严重,可导致信息泄露和远程代码执行。防御需从配置安全、输入过滤、访问控制等多方面入手,同时保持PHP等环境的最新版本以修复已知漏洞。开发时应遵循最小权限原则,避免不必要的动态文件包含操作。