标签: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()函数,
在第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()函数,此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
标签:position name eid lazy 视频 pre https tar let
原文地址:https://www.cnblogs.com/zhangqianxi/p/14465268.html