2021-05-29 09:11:52
文件包含漏洞是因代码中文件路径作为可变参数且未严格过滤,导致攻击者可控制被包含文件路径,进而执行恶意代码或读取敏感信息的漏洞。以下从基础概念、漏洞成因、高危函数、漏洞类型及利用方法展开分析:
一、文件包含的基础概念文件包含的核心目的是实现代码复用,通过函数将外部文件内容嵌入当前脚本,避免重复编写相同功能代码。例如,将数据库连接、公共函数等封装在独立文件中,通过包含函数调用。
二、漏洞成因与危害本地文件包含(LFI):读取服务器本地敏感文件(如/etc/passwd、数据库配置文件config.php),泄露系统信息或数据库凭证。
远程文件包含(RFI):若服务器配置允许(allow_url_fopen=On且allow_url_include=On),攻击者可引入远程恶意脚本(如Web Shell),直接控制服务器。
PHP中以下函数可能引发文件包含漏洞,且无论文件类型如何均会作为PHP代码解析:
核心区别:
本地文件包含(LFI):
条件:被包含文件位于服务器本地,且攻击者可通过路径遍历(如../../)访问非预期文件。
典型场景:读取/etc/passwd、/var/log/apache/access.log(结合日志注入),或包含上传的恶意文件(需配合文件上传漏洞)。
远程文件包含(RFI):
条件:服务器配置允许远程文件包含(allow_url_fopen=On且allow_url_include=On),且攻击者可控制包含的URL。
典型场景:引入攻击者控制的远程PHP脚本(如
核心差异:
读取敏感文件:
通过路径遍历读取系统文件(如?file=../../../../etc/passwd)。
读取应用配置文件(如?file=../../../config/db.php),获取数据库凭证。
配合Web Shell提权:
若存在文件上传漏洞,上传包含恶意代码的文件(如shell.php),再通过文件包含执行(如?file=../../../uploads/shell.php)。
PHP伪协议利用:
php://input:通过POST数据传入恶意代码,绕过文件扩展名限制。
?file=php://input&content=<?php system('id'); ?>data://:直接嵌入Base64编码的PHP代码。
?file=data://text/plain,<?php system('id'); ?>file://:读取本地文件(LFI场景)。
?file=file:///etc/passwd关闭allow_url_fopen和allow_url_include(防止RFI)。
设置open_basedir限制PHP可访问的目录范围。