Web安全之PHP的伪协议漏洞利用,以及伪协议漏洞防护方法

一、背景

今天介绍一个比较冷门的知识,只有在PHP环境中存在的伪协议漏洞,那么什么是PHP伪协议呢?PHP伪协议事实上就是支持的协议与封装协议。可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。ctf中的文件包含、文件读取的绕过、正则的绕过等等会需要用到。

二、伪协议的原理

PHP伪协议是一种在PHP处理数据时,通过替换数据报的头部信息来欺骗网络协议的方式来提高性能的技术。该技术可以让PHP在读取数据时直接读取内存中的数据,而不需要解析数据报。
PHP伪协议的原理是,在数据报的头部中添加一个特殊的标志位,用于指示该数据报是伪协议数据报。当PHP读取数据报时,它会检查该标志位是否为0.如果标志位为0,则它将直接读取内存中的数据;如果标志位为1,则它将会解析数据报,并根据数据报的头部信息来执行相应的操作。
PHP伪协议的主要应用场景是缓存和压缩数据。通过数据报的头部添加特殊标志位,PHP可以在读取数据时直接读取缓存中的数据,而不需要进行解析。这对于提高缓存命中率和压缩数据非常有用。
需要注意的是,由于PHP伪协议是通过替换数据报的头部信息来实现的,一次它可能会对网络协议的完整性产生冲突。如果网络协议的头部信息被PHP伪协议替换了,可能会导致网络协议的完整性被破坏,从而导致通信中断。因此,在进行网络通信时,需要特别小心使用PHP伪协议技术。

三、伪协议的利用

PHP伪协议共有12种,具体如下:

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
     php://stdin, php://stdout 和 php://stderr
     php://input
     php://output
     php://memory 和 php://temp
     php://filter
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

接下来我们选取几个特例用来演示伪协议的使用技巧

3.1 file:// 协议

--------本地文件传输协议
file:// 用于访问本地文件系统,比如:在CTF中通常用来读取本地文件的且不受配置文件中allow_url_fopen与allow_url_include的影响。
格式:

www.xxx.com?cmd.php=file://[文件的绝对路径和文件名]

通过这个格式就可以读取到部署www.xxx.com服务器指定目录的文件了

3.2 php://协议

重头戏了属于是,php:// 是ctf的常客,所以关于它的故事很多。
使用条件(php.ini配置):

allow_url_fopenallow_url_include
php://inputon/offon
php://stdinon/offon
php://memoryon/offon
php://tempon/offon
php://filteron/offon/off

看着确实挺多的,有点迷糊,但是只需要记住php://input 以及 php://filter 就行了,就这俩常用
php://filter

名称描述
resource<—>要过滤的数据流这是个必要参数。它指定了你需要筛选过滤的数据流(简单来说就是你的数据来源)
read<—>读链的筛选列表这个参数可选。可以设定一个或多个过滤器名称。以管道符(/)分隔
write<—>读链的筛选列表这个参数可选。可以设定一个或多个过滤器名称。以管道符(/)分隔

举个例子,就以靶场http://buuoj.cn 这个上面的提为例:
在这里插入图片描述
题目给了提示,文件包含,所以这个p盲猜是include内的参数,所以直接输入flag试试
在这里插入图片描述
这样读取并未获取到想要的信息,此时,我们考虑使用伪协议间接读取它的源码
在这里插入图片描述
通过在url后面添加了伪协议读取方式,我们就将它的源码以base64的编码格式读取出来了,通过这个例子,我们通过php://filter伪协议将服务器中的flag.php文件源码读取出来了,说明这个伪协议可能造成源码或者服务器敏感信息泄露。

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter读取源码可以使用以下的一些命令:

读:php://filter/resource=文件名
php://filter/read=convert.base64-encode/resource=文件名
写:php://filter/resource=文件名&txt=文件内容
php://filter/write=convert.base64-encode/resource=文件名&txt=文件内容

3.3 zip://,bzip2://,zlib://协议

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名
在这里插入图片描述
zip://协议
格式:

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

例如: zip://archive.zip#dir/file.txt
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

更多过滤器使用可参考

四、伪协议的防护

PHP这门语言,凭借其上手快,轻量级,以往在建站的时候被广泛使用,现实使用较少了,虽然使用少了但我们还是要对其存在的漏洞有所了解,掌握其中原理,以及了解其漏洞的基本利用方法。以下提供几种防御伪协议的方法:

4.1 验证输入数据

对用户输入的数据,采取零信任,无论输入来自url参数、表单数据还是其他途径,都需要进行严格过滤和验证。可以使用过滤器函数(如:filter_var())对输入数据进行验证,确保其符合预期的格式和内容,避免恶意构造的URL导致安全漏洞。

4.2 使用白名单机制

为了防止伪协议被滥用,应该限制可访问的资源范围。可以创建一个白名单,只允许指定的资源可以通过伪协议进行访问。这样可以避免用户通过伪协议访问敏感文件和敏感资源。

4.3 禁用危险的协议

PHP提供了一些危险的伪协议,如:php://input 、php://filter、data://等,它们可能被用于读取、写入或执行恶意代码。为了防止安全漏洞,建议禁用这些危险的伪协议。可以通过修改php.ini文件或在代码中使用ini_set()函数来实现。

4.4 不要动态拼接URL

动态拼接URL可能导致安全风险,特别是包含用户输入的情况下。应该尽量避免将用户输入直接拼接到URL中,而是使用URL编码函数(urlencode())对用户输入进行处理,确保URL的完整性和安全性。

4.5 使用安全的文件访问函数

在使用伪协议访问文件时,应该使用安全的文件访问函数,如file_ get contents0、file_ put contents0等。避免使不安全的函数,如include(、 require0等, 以防止恶意代码执行。

4.6限制文件访问权限

为了避免敏感文件被访问,应该设置合适的文件访问权限。确保只有授权的用户或进程才能访问这些文件。可以使用chmod命令或文件管理I具来设置文件权限。

4.7.定期更新和维护

及时更新PHP版本和相关组件,以获取最新的安全补J和功能改进。同时,定期检查和维护代码,修复可能存在的安全漏洞和错误。

4.8.使用安全的数据库操作

如果使用伪协议访问数据库,应该使用安全的数据库操作函数,如PD0或预处理语句,以防止SQL注入等安全威胁。

4.9.记录和监控日志

为了及时发现和处理安全事件,建议记录和监控伪协议访问的日志。可以使用日志分析工具或安全监控系统来实现。

总结起来,防御PHP伪协议安全威胁的方法包括验证输入数据、使用白名单机制、禁用危险的伪协议、不动态拼接URL、使用安全的文件访问函数、限制文件访问权限、定期更新和维护、使用安全的数据库操作、记录和监控日志等。通过综合使用这些方法,可以有效减少伪协议带来的安全风险,保护系统和用户的数据安全。

五、总结

单纯看伪协议利用与之前的文件包含漏洞及其相似,但是在真实环境中是对用户输入进行了过滤替换的,在使用漏洞就需要不断考虑如何绕过这些过滤条件。只要我们开发过程中对于使用了伪协议这些函数的时候,一定要严格对用户参数进行过滤,避免一时偷懒导致服务器被黑,其实最终难逃其就。如有还不太理解或有其他想法的小伙伴们都可以私信我或评论区打出来哟,如有写的不好的地方也请大家多多包涵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net数字档案管理系统VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net 数字档案管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发。 asp.net数字档案系统1 应用技…

c语言从入门到实战——数组指针与函数指针

数组指针与函数指针 前言1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化? 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移…

electronjs入门-编辑器应用程序

我们将在Electron中创建一个新项目&#xff0c;如我们在第1章中所示&#xff0c;名为“编辑器”&#xff0c;我们将在下一章中使用它来创建编辑器&#xff1b;在index.js中&#xff0c;这是我们的主要过程&#xff1b;请记住为Electron软件包放置必要的依赖项&#xff1a; npm…

vue中一个页面引入多个相同组件重复请求的问题?

⚠️&#xff01;&#xff01;&#xff01;此内容需要了解一下内容&#xff01;&#xff01;&#xff01; 1、会使用promise&#xff1f;&#xff1f;&#xff1f; 2、 promise跟 async 的区别&#xff1f;&#xff1f;&#xff1f; async 会终止后面的执行&#xff0c;后续…

21 Linux 自带的LED驱动

一、Linux 自带 LED 驱动使能 其实 Linux 内核自带 LED 抢夺那个&#xff0c;但在此之前需要配置 Linux 驱动来使能 LED 驱动。 输入以下命令&#xff1a; cd linux/atk-mpl/linux/my_linux/linux-5.4.31 make menuconfig 根据以下路径找到 LED 驱动&#xff1a; → Device D…

【算法】区间(差分约束)

题目 给定 n 个区间 [ai,bi] 和 n 个整数 ci。 你需要构造一个整数集合 Z&#xff0c;使得 ∀i∈[1,n]&#xff0c;Z 中满足 ai≤x≤bi 的整数 x 不少于 ci 个。 求这样的整数集合 Z 最少包含多少个数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个…

LeetCode【560】和为k的子数组

题目&#xff1a; 思路&#xff1a; 转化为前缀和问题&#xff0c;和为k&#xff0c;即为&#xff1a;前缀和差值为k的情况统计&#xff1b; 为什么要转化为前缀和呢&#xff1f;因为和为k的子数组可能有n个元素&#xff0c;但是前缀和差值为k&#xff0c;只有两个元素&#…

Linux 系统编程,Binder 学习,文件访问相关的接口

文章目录 Linux 系统编程&#xff0c;Binder 学习&#xff0c;文件访问相关的接口1.概念2.linux文件结构3.文件描述符4.Linux文件系统的两类常用接口&#xff0c;linux系统内置库函数4.1 open4.2 close4.3 read4.4 write 5.标准I/O库函数5.1 fopen Linux 系统编程&#xff0c;B…

wireshark打开tcpdump抓的包 vwr: Invalid data length runs past the end of the record

tcpdump -i any -n -s0 > t.pcap 使用此命令在Debian系统上抓包&#xff0c;下载到PC&#xff0c;用wireshark打开时报错&#xff1a; 后来发现写入文件时使用 -w 是没问题的&#xff0c;原因还不清楚。 tcpdump -i any -n -s0 -w t.pcap

【腾讯云 HAI域探秘】浅尝一番AI绘画

前言 腾讯云高性能应用服务 HAI 是为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。 我之前也参与锅一个AI绘画的活动&#xff0c;是基于InsCode的&#xff0c;都可以在线训练大模型&#xff0c;开发自己的AI应用程序。 这次腾讯…

八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)

在微博上看到博主发的&#xff0c;觉得总结很好&#xff0c;在此摘录&#xff1a;

labview实现仪器的控制visa

*IDN? 是识别大多数仪器的查询指令。仪器会回应一个用于描述仪器的识别字符串。如果仪器不接受该指令&#xff0c;请在仪器手册中查询仪器能识别的指令列表。 如下图所示&#xff1a; 程序如下&#xff1a;

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据…

正则匹配去除HTMl标签

正则匹配去除HTMl标签 案例&#xff1a;如在textarea中去除标签 操作方法 val.replace(/<[^>]>/g, ‘’))

第3章:搜索与图论【AcWing】

文章目录 图的概念图的概念图的分类有向图和无向图 连通性连通块重边和自环稠密图和稀疏图参考资料 图的存储方式邻接表代码 邻接矩阵 DFS全排列问题题目描述思路回溯标记剪枝代码时间复杂度 [N 皇后问题](https://www.luogu.com.cn/problem/P1219)题目描述全排列思路 O ( n ! …

聚观早报 |英伟达发布H200;夸克发布自研大模型

【聚观365】11月15日消息 英伟达发布H200 夸克发布自研大模型 iQOO 12系列开启销售 红魔9 Pro配置细节 禾赛科技第三季度营收4.5亿元 英伟达发布H200 全球市值最高的芯片制造商英伟达公司&#xff0c;正在升级其H100人工智能处理器&#xff0c;为这款产品增加更多功能&am…

操作符——C语言初阶

一.算数操作符&#xff1a; - * / % 、-、*、/这四个运算符均可用于整数及浮点数的运算。 当使用/运算符时&#xff0c;如果两个操作数均为整型&#xff0c;那么执行整数除法&#xff0c;运算结果也为整型&#xff1b;如果两个操作数至少一个为浮…

macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导

导读Asahi Linux 是一个致力于为 Apple Silicon 设备带来 Linux 支持的项目&#xff0c;日前有用户反馈称&#xff0c;若在相关设备上安装了 macOS 13.6-14&#xff0c;再安装 Asahi Linux &#xff0c;就会导致系统引导失败&#xff0c;出现“黑屏”情况。 目前 Asahi Linux 项…

单片机实验(一)

前言 实验一&#xff1a;用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号&#xff1b; 实验二&#xff1a;用单片机控制LED1616点阵交替正序、逆序显示自己的中文姓名。 参考链接&#xff1a; LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff0…

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…