风炫安全Web安全学习第三十九节课 反序列化漏洞基础知识
风炫安全Web安全学习第三十九节课 反序列化漏洞基础知识
反序列化漏洞
0x01 序列化相关基础知识
0x01 01 序列化演示
序列化就是把本来不能直接存储的数据转换成可存储的数据,并且不会丢掉数据格式
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。 以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。
<?php
class test{private $flag = 'Inactice';protected $test = 'test';public $test1 = "test1";public function set_flag($flag){$this->flag = $flag;} public function get_flag($flag){return $this->flag;}}$object = new test();
$object->set_flag('Active');
$data = serialize($object);
echo $data;
?>
那么这种将原本的数据通过某种手段进行“压缩”,并且按照一定的格式存储的过程就可以称之为"序列化"
O:4:"test":3:{s:10:"testflag";s:6:"Active";s:7:"*test";s:4:"test";s:5:"test1";s:5:"test1";}
对象类型:长度:"类名":类中变量的个数:{类型:长度:"值";类型:长度:"值";......}
a - array b - boolean
d - double i - integer
o - common object r - reference
s - string C - custom object
O - class N - null
R - pointer reference U - unicode string
0x01 02 php魔法方法
PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法
这里就不得不介绍几个我们必须知道的魔法方法了
__construct 当一个对象创建时被调用,
__destruct 当一个对象销毁时被调用,
__toString 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__invoke() 当脚本尝试将对象调用为函数时触发
其中我想特别说明一下第四点:
这个 __toString 触发的条件比较多,也因为这个原因容易被忽略,常见的触发条件有下面几种
(1)echo (
$obj
) / print($obj
) 打印时会触发(2)反序列化对象与字符串连接时
(3)反序列化对象参与格式化字符串时
(4)反序列化对象与字符串进行比较时(PHP进行比较的时候会转换参数类型)
(5)反序列化对象参与格式化SQL语句,绑定参数时
(6)反序列化对象在经过php字符串函数,如 strlen()、addslashes()时
(7)在in_array()方法中,第一个参数是反序列化对象,第二个参数的数组中有toString返回的字符串的时候toString会被调用
<?php
class test{public $varr1="abc";public $varr2="123";public function echoP(){echo $this->varr1."<br>";}public function __construct(){echo "__construct<br>";}public function __destruct(){echo "__destruct<br>";}public function __toString(){return "__toString<br>";}public function __sleep(){echo "__sleep<br>";return array('varr1','varr2');}public function __wakeup(){echo "__wakeup<br>";}}$obj = new test(); //实例化对象,调用__construct()方法,输出__construct
// $obj->echoP(); //调用echoP()方法,输出"abc"
// echo $obj; //obj对象被当做字符串输出,调用__toString()方法,输出__toString
$s =serialize($obj); //obj对象被序列化,调用__sleep()方法,输出__sleep
echo unserialize($s); //$s首先会被反序列化,会调用__wake()方法,被反序列化出来的对象又被当做字符串,就会调用_toString()方法。
// 脚本结束又会调用__destruct()方法,输出__destruct
?>
参考:
http://blog.evalshell.com/2020/12/26/风炫安全web安全学习第三十九节课-反序列化漏洞基/
风炫安全Web安全学习第三十九节课 反序列化漏洞基础知识相关推荐
- 风炫安全WEB安全学习第四十四节课 敏感信息泄漏
第四十四节课 敏感信息泄漏 敏感信息泄漏 0x01 漏洞简介 敏感数据包括但不限于:口令.密钥.证书.会话标识.License.隐私数据(如短消息的内容).授权凭据.个人数据(如姓名.住址.电话等)等 ...
- 风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示
风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示 0x02 反序列化漏洞利用 反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,从上面的例子看,这个函数的参数是一个 ...
- 风炫安全Web安全学习第四十三节课 路径遍历漏洞
风炫安全Web安全学习第四十三节课 路径遍历漏洞 路径遍历 0x01 漏洞概述 路径遍历攻击(也称作目录遍历)的目标是访问web根目录外存储的文件和目录.通过操纵使用"点-斜线(-/)&qu ...
- 风炫安全web安全学习第二十八节课 CSRF攻击原理
风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...
- 风炫安全web安全学习第二十九节课 CSRF防御措施
风炫安全web安全学习第二十九节课 CSRF防御措施 CSRF防御措施 增加token验证 对关键操作增加token验证,token值必须随机,每次都不一样 关于安全的会话管理(SESSION) 不要 ...
- javaweb学习总结(三十九)——数据库连接池
javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...
- 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...
- JavaScript学习(三十九)—对象中内容的操作
JavaScript学习(三十九)-对象中内容的操作 一.对象中内容的操作:增.删.改.查 (一).增:给对象添加属性或者方法 1)方式1:对象名称.属性名=属性值: 2)方式2:对象名称['属性名' ...
- Python编程基础:第三十九节 面向对象编程Object Oriented Programming
第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...
最新文章
- 大脑构造图与功能解析_施工技术特辑 | 全套脚手架三维构造图解析
- 关于IsolatedStorageFile存取文件的问题
- Id.exe和ld.exe: cannot open output file … : Permission denied问题。
- AGG第二课 代码框架以及命名规则
- 【震惊】史上最牛的市场推广/营销
- ANE的开发需求一般太少,这个静态库如何包含第三方
- Swift5.x的UITableView纯代码演练
- Do not use built-in or reserved HTML elements as component id等等vue warn问题
- CentOS7.5安装MySql8.0
- 生成随机不重复数列表(C#)
- 高级商务办公软件应用【3】
- .docx勒索病毒删除 .docx勒索病毒还原文件
- 开源漫画服务器Mango
- Scrapy入门-爬取需要登录后才能访问的数据
- 白衣观音大士灵感神咒
- 外卖订单量预测异常报警模型实践
- 曲线行驶最后什么时候回正_曲线行驶出弯时什么时候回正方向
- KubeEdge+Fabedge集成环境搭建教程
- XManager5连接CentOS7
- 群晖NAS加AD域时提示用户名或密码错误,但域管理员帐号和密码是对的,并且在电脑上可以正常加域。