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.mfbz.cn/a/138804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE——网络原理(网络层 IP协议与数据链路层)

文章目录 一、详细解释 IP协议二、解释 TCP 和 IP 之间的联系和区别。三、IP协议——地址管理四、数据链路层 一、详细解释 IP协议 注&#xff1a;在这里我向大家描述的 IP协议是 IPv4。 如上图所示&#xff0c;这就是 IP 协议头的格式&#xff0c;下面我会分别解释他们其中每…

分布式数据库Schema 变更 in F1 TiDB

分布式数据库Schema 变更 in F1 & TiDB 【转载】TiDB 源码阅读系列文章&#xff08;十七&#xff09;DDL 源码解析 | PingCAP 上述文章主要叙述了从DDL语句发起到执行的过程&#xff0c;简单介绍了弄一套相同的模式来后台处理数据回填&#xff0c;从而提高DDL的并发度的一…

Leetcode-104 二叉树的最大深度

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

小红书app拉新校园版本地网推项目修改政策了 附一手官签渠道

小红书app拉新深受现在地推作业人员和网推作业人员还有校园推广项目的喜爱&#xff0c;简单价格高 可以通过”聚量推客“申请小红书校园版项目拉新 以下为最新价格政策和介绍&#xff0c;需要7天内活跃&#xff0c;按照活跃天数进行结算

响应式作文新闻资讯博客网站模板源码

模板信息&#xff1a; 模板编号&#xff1a;29081 模板编码&#xff1a;UTF8 模板分类&#xff1a;博客、文章、资讯、其他 适合行业&#xff1a;博客类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVCSS&a…

subprocess 模块用法

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

前后端分离项目为什么很火?有什么优势?

目录 一、什么是前后端分离 二、前后端分离项目的技术栈 三、前后端分离项目有什么优势 一、什么是前后端分离 前后端分离是一种软件架构的设计模式,它将应用程序的前端&#xff08;即用户界面&#xff09;和后端&#xff08;即服务器端&#xff09;进行解耦,使得它们可以独…

Outlook如何删除邮箱账户

Outlook如何删除邮箱账户 说明&#xff1a; 最近有用户询问到“我的Outlook登陆了很多个邮箱账号&#xff0c;不知道怎么退出”接下来将具体操作步骤加以说明 操作指引&#xff1a; 1、首先打开Outlook该软件&#xff0c;然后点击“文件” 2、点击账户设置下拉菜单 3、在下拉…

Vue使用高德地图实现点击获取经纬度以及搜索功能

1. 首先在高德开放平台申请key值 2. 然后会在这个地方显示 3. 在VScode里面安装地图 yarn add amap/amap-jsapi-loader --save 4. 准备一个容器 <div id"maps"></div> <style scoped>#maps {width: 100%;height: 100%;position: relative;z-index…

使用SpringAOP+Redis实现接口处理幂等

文章目录 一、思路分析二、代码实战1、搭建SpringbootAOPRedis环境2、自定义注解3、切面类4、测试一下吧 一、思路分析 在调用后台接口时&#xff0c;由于用户多次点击或者说第三方重试&#xff0c;可能会导致幂等问题。 解决方案无非就是上一次请求没有处理完&#xff0c;第…

瑞吉外卖01-实现管理端登录登出功能

开发前准备 准备数据表 结合页面原型创建数据库reggie,可以使用图形化界面或者MySQL命令运行SQL文件导入表结构(使用命令时sql文件不要放在中文目录中) 创建工程 创建一个SpringBoot的工程(勾选Spring Web&#xff0c;MySQL和MyBatis),配置pom.xml文件导入druid&#xff0c;…

打破时空界限的虚拟线上会议大厅:多人在线互动的未来

引言&#xff1a; 在数字时代&#xff0c;迅猛发展的科技不仅改变了我们的日常生活&#xff0c;也深刻地影响着商务和社交领域。虚拟会议大厅&#xff0c;作为一种创新的交流平台&#xff0c;正以其多人同时在线、音视频通话和直播推流的强大功能&#xff0c;展现着新时代的会…

2023最新整理软件测试常见面试题附答案

包含的模块&#xff1a; 本文分为十九个模块&#xff0c;分别是&#xff1a;软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的点击文末获取&…

海思平台awb标定

文章目录 1、raw图采集2、awb标定3、标定效果优化1、raw图采集 raw图采集标准: 如果raw是12bit,即raw12,那么Block9 块的亮度就是40960.8 = 3276.8左右。 勾上Dump Raw,我这里raw10,即Depth为10bit,那么Block19的亮度应该为10240.8 = 819.2左右,调整曝光Exposure Attr…

深入探讨跨境电商商城源码的多语言、多货币、多商户入驻支持“

随着全球电子商务的飞速发展&#xff0c;跨境电商已成为一股不可忽视的力量。在这个背景下&#xff0c;为跨境电商商城源码提供多语言、多货币、多商户入驻支持显得尤为重要。本文将深入探讨这三大特性的实现方式及其对跨境电商发展的影响。 一、多语言支持 对于跨境电商来说&a…

多数据源切换

多数据源切换 1.jdbcTemplate2.使用切面3.mybatis层次的多数据源4.spring的dynamic自动注入 项目中经常会有多个数据源&#xff0c;那么如何处理呢 有4种方法 准备&#xff1a; 创建两个数据库 CREATE SCHEMA test DEFAULT CHARACTER SET utf8mb4 ; CREATE SCHEMA school DEFA…

【Debug】此语法需要一个导入的帮助程序,但找不到模块“tslib”

报错如下&#xff1a; 代码可以编译运行&#xff0c;但是会有红线和报错。 解决方法&#xff1a;TypeScript error “TS2354: This syntax requires an imported helper but module ‘tslib’ cannot be found” Issue #37991 microsoft/TypeScript GitHub 在tsconfig.jso…

MacOS下VMware Fusion配置静态IP

前言 在虚拟机安装系统后&#xff0c;默认是通过DHCP动态分配的IP&#xff0c;这会导致每次重启虚拟机ip都可能会改变&#xff0c;使用起来会有很多不便。 配置静态IP 查看主机网关地址 cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf 查看主机DNS&#xff0c;m…

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

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

数据结构-数型查找

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