什么是 LFI攻击?
LFI(Local File Inclusion)攻击是一种通过漏洞将服务器本地文件包含进应用程序的恶意手段。攻击者利用不安全的文件包含函数(如 include、require、readfile 等),将任意本地文件的路径注入到参数中,从而实现代码执行、敏感信息泄露甚至系统控制。相较于远程文件包含(RFI),LFI 更依赖于目标服务器的文件结构和权限,但其危害同样不容小觑。
LFI攻击的工作原理
1. 参数注入
大多数 LFI 漏洞出现在对用户输入未进行严格过滤的页面。例如:
<?php $page = $_GET['page']; include($page . ".php");?>如果 page 参数直接拼接进 include,攻击者只需构造 ?page=../../../../etc/passwd%00 即可尝试读取系统密码文件。
2. 路径遍历(Directory Traversal)
路径遍历是 LFI 的核心技术。通过使用 ../(或 ..\)向上跳转目录,攻击者可以突破根目录限制,访问任意层级的文件。现代系统常通过 realpath、basename 等函数进行路径规范化,但若实现不当仍会留下可利用的空间。
3. 文件包装(File Wrappers)
PHP 支持 php://filter、data://、expect:// 等包装器,攻击者可借助这些特殊协议实现代码执行。例如:
?file=php://filter/convert.base64-en[code](https://basebiance.com/tag/code/)/resource=../../../../etc/passwd通过过滤器将文件内容进行 Base64 编码后返回,进一步规避字符过滤。
LFI攻击的危害
- 敏感信息泄露:如
/etc/passwd、配置文件、日志文件等,攻击者可获取系统用户、数据库凭证等关键数据。 - 代码执行:若成功包含可写入的日志文件或上传的脚本,攻击者可在服务器上执行任意 PHP 代码,实现持久化后门。
- 横向渗透:获取内部网络结构信息后,可进一步发起 SSRF、内部接口探测等攻击。
- 服务中断:通过包含大文件或恶意脚本导致服务器资源耗尽,形成 DoS 效果。
常见的 LFI 攻击场景
| 场景 | 漏洞表现 | 典型利用方式 |
|---|---|---|
| 动态模板加载 | include($_GET['tpl']); | ?tpl=../../../../var/www/html/../config |
| 日志文件读取 | include($logFile); | ?log=../../../../var/log/apache2/access.log |
| 上传文件包含 | include($uploadPath . $file); | 上传 .php 脚本后通过 ?file=upload/malicious.php 包含 |
检测与防御措施
1. 输入过滤与白名单
- 白名单:仅允许预定义的文件名或路径列表。
- 正则过滤:禁止出现
../、