风炫安全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安全学习第三十九节课 反序列化漏洞基础知识相关推荐

  1. 风炫安全WEB安全学习第四十四节课 敏感信息泄漏

    第四十四节课 敏感信息泄漏 敏感信息泄漏 0x01 漏洞简介 敏感数据包括但不限于:口令.密钥.证书.会话标识.License.隐私数据(如短消息的内容).授权凭据.个人数据(如姓名.住址.电话等)等 ...

  2. 风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示

    风炫安全Web安全学习第四十节课 反序列化漏洞攻击利用演示 0x02 反序列化漏洞利用 反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,从上面的例子看,这个函数的参数是一个 ...

  3. 风炫安全Web安全学习第四十三节课 路径遍历漏洞

    风炫安全Web安全学习第四十三节课 路径遍历漏洞 路径遍历 0x01 漏洞概述 路径遍历攻击(也称作目录遍历)的目标是访问web根目录外存储的文件和目录.通过操纵使用"点-斜线(-/)&qu ...

  4. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

  5. 风炫安全web安全学习第二十九节课 CSRF防御措施

    风炫安全web安全学习第二十九节课 CSRF防御措施 CSRF防御措施 增加token验证 对关键操作增加token验证,token值必须随机,每次都不一样 关于安全的会话管理(SESSION) 不要 ...

  6. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

  7. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点   用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...

  8. JavaScript学习(三十九)—对象中内容的操作

    JavaScript学习(三十九)-对象中内容的操作 一.对象中内容的操作:增.删.改.查 (一).增:给对象添加属性或者方法 1)方式1:对象名称.属性名=属性值: 2)方式2:对象名称['属性名' ...

  9. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

最新文章

  1. 大脑构造图与功能解析_施工技术特辑 | 全套脚手架三维构造图解析
  2. 关于IsolatedStorageFile存取文件的问题
  3. Id.exe和ld.exe: cannot open output file … : Permission denied问题。
  4. AGG第二课 代码框架以及命名规则
  5. 【震惊】史上最牛的市场推广/营销
  6. ANE的开发需求一般太少,这个静态库如何包含第三方
  7. Swift5.x的UITableView纯代码演练
  8. Do not use built-in or reserved HTML elements as component id等等vue warn问题
  9. CentOS7.5安装MySql8.0
  10. 生成随机不重复数列表(C#)
  11. 高级商务办公软件应用【3】
  12. .docx勒索病毒删除 .docx勒索病毒还原文件
  13. 开源漫画服务器Mango
  14. Scrapy入门-爬取需要登录后才能访问的数据
  15. 白衣观音大士灵感神咒
  16. 外卖订单量预测异常报警模型实践
  17. 曲线行驶最后什么时候回正_曲线行驶出弯时什么时候回正方向
  18. KubeEdge+Fabedge集成环境搭建教程
  19. XManager5连接CentOS7
  20. 群晖NAS加AD域时提示用户名或密码错误,但域管理员帐号和密码是对的,并且在电脑上可以正常加域。

热门文章

  1. android 4.4 hifi,LHDC让安卓也能享受空间音频:部分 HiFi 设备已经获得支持
  2. 优雅的使用Validated
  3. php 抽奖 不忘初芯,你的“热爱”还在吗?不忘初芯,不负热爱!
  4. 2013 编程之美挑战赛 仙剑5前传之璇光殿
  5. 一张图带你掌握InputReader事件读取流程
  6. Windbg 分析内存泄漏
  7. JavaScript日期加减,Juqery日期加减计算并赋值给input框
  8. 常用Electron App打包工具
  9. 高德地图JSAPI的使用注意项
  10. 抖音如何打造热门直播间,新手必知直播干货丨国仁网络