|
吾爱游客
发表于 2021-7-28 19:53
1、申 请 I D : baiheihei
2、个人邮箱: youwen21@yeah.net
3、原创技术文章: 为什么反序列化漏洞在各语言具有普便性?
首先什么是序列化和反序列化。
简单描述如下:
序列化-把对象转换为字符串。
反序列化-把字符串转换为对象。
python, java, c++, php等各语言都支持对象序列化和反序列化, 但各语言采用的序列号协议不一样,所以序列化得到的字符串也不相同。
各语言支持序列化的数据类型都很丰富,如,字典,数组,列表,对象等都支持序列化和反序列化。
要理解各语言都有反序列化漏洞,是因为各语言支持对象的序列化和反序列化。
对象中可能包含socket句柄,或者文件句柄。
如mysql 连接, redis练级, sokcet客户端,打开文件读写等。
这些字段不是普通变量,需要和系统活者其他系统沟通才是一个有效资源。
所以,反序列化对象时,各语言都要调用魔术方法来实列化这部分资源。
各语言的定义:
php:
若被反序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。
python:
调用类的 __reduce__()
java:
调用类的readObject()
其他语言同理, 要支持对象中socket和文件的返序列化执行相方魔术方法!
如何利用反序列化漏洞?
反序列化字符串是通过 api入参获得:如get, post, cookie。
反序列化字符串是通过 redis、mysql等存储系统获得,我们具有update更新相关key的权限。
总之,我们生成新的将要序列化的字符串替换原字符串, 执行反序列时,__wakeup() 或 __reduce__() 或其他魔术方法执行时,就可运行我们注入的代码。
反序列化代码就罗列啦,网上搜一下不少,反弹shell, 获得数据等。
以下是案例中语言反序列化相关文档。
python 反序列化文档:https://docs.python.org/zh-cn/3/library/pickle.html
php 反序列化文档:https://www.php.net/manual/zh/function.unserialize.php
java 反序列化参考: https://paper.seebug.org/312/
以下为引用:
我们注意到 MyObject 类实现了Serializable接口,并且重写了readObject()函数。这里需要注意:只有实现了Serializable接口的类的对象才可以被序列化,Serializable 接口是启用其序列化功能的接口,实现 java.io.Serializable 接口的类才是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。这里的 readObject() 执行了Runtime.getRuntime().exec("open /Applications/Calculator.app/"),而 readObject() 方法的作用正是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,readObject() 是可以重写的,可以定制反序列化的一些行为。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|