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

news2024/9/21 18:47:22

一、背景

今天介绍一个比较冷门的知识,只有在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.coloradmin.cn/o/1202598.html

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

相关文章

sqlmap requires ‘python-pymysql‘ third-party library

使用sqlmap进行udf提权报错&#xff1a; [14:06:04] [CRITICAL] sqlmap requires python-pymysql third-party library in order to directly connect to the DBMS MySQL. You can download it from https://github.com/PyMySQL/PyMySQL. Alternative is to use a package pyt…

[WSL] 安装MySQL8

安装版本 mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))安装步骤 sudo apt-get update sudo apt-get upgradesudo apt-get install mysql-server apt install mysql-client apt install libmysqlclient-devsudo usermod -d /var/lib/m…

excel中通过ROW函数返回引用的行号

例如&#xff0c;想引用B3的行号&#xff08;行号应该是3&#xff09;&#xff1a; 鼠标点在想输入函数的单元格&#xff1a; 插入-》函数&#xff1a; 选择ROW函数&#xff1a; 点击“继续”&#xff0c;然后点击红框圈出来的按钮&#xff1a; 鼠标点击B3单元格&…

亚马逊鲲鹏系统能注册哪些国家的买家号

亚马逊鲲鹏系统全面支持12个站点&#xff1a;美国站点、加拿大站点、德国站点、英国站点、法国站点、意大利站点、西班牙站点、日本站点、印度站点、新加坡站点、澳大利亚站点、荷兰站点。 对于注册可以用手机号或者用邮箱进行注册&#xff0c;注册时自动模拟真人点击输入账号、…

VB.net TCP服务端监听端口接收客户端RFID网络读卡器上传的读卡数据

本 示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) Imports System.Threading Imports System.Net Imports System.Net.Sockets Public Class Form1Dim ListenSocket As SocketDim Dict As New Dictionary(Of…

vscode 内置扩展找不到? 设置之后不知道怎么还原?

搜索上面框起来的就是内置扩展 vscode这一招太恶心。。。

自动化测试项目:浅谈分层设计的思路

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造发起请求&a…

3种方法,教你用Pytest更改自动化测试用例执行顺序!

前言 在自动化测试中&#xff0c;自动化测试用例设计原则就是&#xff1a;执行过程时不能存在依赖顺序。那么如果测试用例需要按照指定顺序执行&#xff0c;这个时候应该怎么做呢&#xff1f; 目前单元测试框架中UnitTest没有办法改变测试用例的执行顺序&#xff0c;但是另一…

1688商品采集api接口1688代购商品采集API商品详情数据获取

做小程序商城时&#xff0c;最崩溃的瞬间是什么&#xff1f; 一定是当你有几百件商品&#xff0c;却要一件一件编辑商品名称、规格、上传图片吧…… 为了帮助商家快速上货开店&#xff0c;特意提供了1688的获取商品详情数据的接口&#xff0c;方便商家一键采集淘宝、天猫、京…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用电脑模拟产生一个三维的虚拟世界&#xff0c;提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步&#xff0c;VR已经被广泛应用到许多领域&#xff0c;包括游戏、教育、医疗、房…

Outlook如何恢复已删除邮件

Outlook如何恢复已删除邮件 操作指引&#xff1a; Outlook客户端恢复最近7天删除的邮件&#xff1a; Outlook客户端要求最新版本&#xff0c;如没有如下选项&#xff0c;建议联机更新windows update 网页邮箱恢复最近7天删除的邮件&#xff1a;

极智芯 | GPU架构与计算能力

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文分享一下 GPU架构与计算能力。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https:…

黑客技术(网络安全)—高效自学

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

subprocess 模块用法

如果你只关心命令的标准输出&#xff0c;并且希望在命令执行失败时引发异常&#xff0c;可以使用 check_output。如果你需要更多的控制&#xff0c;例如与正在运行的进程进行交互&#xff0c;可以使用 Popen。如果你希望获取标准输出和命令的状态码&#xff0c;可以使用 getsta…

数据结构-数型查找

二叉排序树&#xff08;BST&#xff09; 二叉排序树&#xff0c;又称二叉查找树&#xff08;BST&#xff0c;Binary Search Tree&#xff09; 一颗二叉树或者是空二叉树&#xff0c;或者是具有如下性质的二叉树&#xff1a; 左子树上所有结点的关键字均小于根结点的关键字&…

LeetCode(9)跳跃游戏【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 55. 跳跃游戏 1.题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回…

在Linux系统下微调Llama2(MetaAI)大模型教程—Qlora

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法

有时候因业务需要&#xff0c;paint函数在界面上绘制了成百上千个图形项Items&#xff0c;导致操作界面的时候有明显的卡顿感&#xff0c;下文会提供一种比较好的解决办法&#xff0c;先来了解下QGraphicsItem的缓存方式。 &#xff08;1&#xff09;setCacheMode(QGraphicsIt…

0基础学习PyFlink——水位线(watermark)触发计算

在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》和《0基础学习PyFlink——个数滑动窗口&#xff08;Sliding Count Windows&#xff09;》中&#xff0c;我们发现如果窗口中元素个数没有把窗口填满&#xff0c;则不会触发计算。 为了解决长期不计算的问题&a…

日志及其框架

日志技术的概述 日志 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记录程序运行过程中的信息&#xff0c;并可以进行永久存储。 以前记录日志的方式&#xff08;输出语句&#…