码迷,mamicode.com
首页 > 其他好文 > 详细

反序列化漏洞学习

时间:2021-03-02 12:14:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:position   name   eid   lazy   视频   pre   https   tar   let   

学习视频:https://www.bilibili.com/video/BV1bJ411C7xv?from=search&seid=10080987211475773831

先明白什么是序列化?

为了方便存储对象,就把对象转化为字符串,这种过程就叫序列化过程。

那反序列化自然就是 字符串转换 为对象

技术图片

 

 

 技术图片

 

 

 查看上述代码,首先是定义了一个类,然后定义了 一个 getname () 方法,第37行这个 serialize()函数,就是序列化函数,  print_r 一下序列后的内容

技术图片

 

 

 O:代表  object 说明这是一个对象

 7 :代表这个对象名字( Student )的长度 

 Student : 对象名

1: 一个成员变量

S:string (字符串)

4 :字符串(name) 长度    在代码第六行已经声明了

 

反序列化,顾名思义,就是把这个字符串转换成 对象

技术图片

 

执行之后显示:

 

 技术图片

 

 

 都了解了之后重点来 了!!!!

问题就出现在第13行 _wakeup()函数中 ,先解释下  _wakeUP()这个函数

与之相反,`unserialize()` 会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。

作用:

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

unserialize() (这个函数就是反序列化所用到的函数)调用之前,会检查是否存在一个 _wakeup() 方法,如果存在,则会先调用  _wakeup() 方法

问题就出在这个_wakeup() 函数有时候开发人员的安全意识不够强

前面说过,如果用 unserialize() 这个函数的时候,会先调用 _wakeup()函数,

在第13行的时候开始调用_wakeup()函数,17行开始 将name下面的变量值直接写到 shell.php 中

如果name变量是由  get获取过来的,就可传入任何值,造成反序列化漏洞

下面来看一个经典的反序列化漏洞的代码:

文章链接 : https://www.cnblogs.com/lcxblogs/p/13539535.html

借鉴了大佬的一个经典案例来说明,经典永流传     (文件起名为1.php,   PHP中var关键字在类内部等同于public)

<?php 
 class Test{
     var $test = "123";
     function __wakeup(){
         $fp = fopen("test.php", ‘w‘);
         fwrite($fp, $this -> test);
         fclose($fp);
     }
 }
 
 $test1 = $_GET[‘test‘];                     //这里就直接获取传入的数据,没有进行任何过滤
print_r($test1);
 echo "<br />";
 $seri = unserialize($test1);                //先执行 _wakeup()

 require "test.php";

 ?>

 构造payload

O:4:"Test":1:{s:4:"test";s:18:"<?php%20phpinfo();?>";}

1.php?test=O:4:"Test":1:{s:4:"test";s:18:"<?php%20phpinfo();?>";}

 

传了Test类有一个test参数 test="<?php phpinfo();?>";

技术图片

O:4:"Test":1:{s:4:"test";s:18:"<?php%20phpinfo();?>";}

如图所示

 

$test1是我可控的没有任何过滤,我传了一个Test类,里面有一个test参数等于"<?php phpinfo();?>"

由于代码中写了__wakeup()

上文提到,有__wakeup(),在反序列化之前一定会调用此方法,创建了一个test.php文件,并把Test类中的test变量的值即"<?php phpinfo();?>" 写进了test.php文件,require进行文件包含

这就是一个非常典型的反序列化漏洞

 

想起来一个事,关于__wakeup(),以前遇到CTF的一个题用到了这个知识点

有当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行,即:

O:4:"Test":2:{s:4:"test";s:18:"<?php%20phpinfo();?>";}这种  你就会绕过__wakeup(),__wakeup()内部全都不会执行啦 不信你可以试试

 

常见的反序列化漏洞有

            shiro反序列化:    当看到关键字rememberMe=deleteMe;,你是否就会想起Shiro反序列化漏洞
                
            fastjson反序列化:   java的一个库,可以把java对象转换为json格式

            weblogic反序列化:  Weblogic反序列化漏洞是一个经典的漏洞系列,根源在于Weblogic(及其他很多java服务器应用)在通信过程中传输数据对象,涉及到序列化和反序列化操作,

            struts2:  一个java  web应用框架

            tomcat等等

 

具体的漏洞细节等过几天在补充学习!

 

这里需要补充一下,用 unserialize()这个反序列化函数的时候,会提前用到 _wakeup()函数,

同理,用serialize()这个序列话函数的时候,会提前用到sleep()函数,此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

 

 

 

 

 

 

反,`unserialize()` 会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。
反,`unserialize()` 会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。

反序列化漏洞学习

标签:position   name   eid   lazy   视频   pre   https   tar   let   

原文地址:https://www.cnblogs.com/zhangqianxi/p/14465268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!