远程命令执行与反序列化之——反序列化原理介绍与漏洞产生原因分析

反序列化原理介绍与漏洞产生原因分析

什么是反序列化

就是把一个对象变成可以传输的字符串,目的就是为了方便传输。
假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。

当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串,当你要用的时候再放他出来就好了。

在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。

反序列化漏洞产生的原理

序列化和反序列化本身没有什么问题,但是如果反序列化的内容是用户可以控制的,切后台不正当使用了PHP魔法函数,就会出现问题——这也就是反序列化漏洞产生的两个重要条件,缺一不可!
两个条件,php比较少,Java中出现的很多
常见魔法函数
__construct() 当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep()在对象在被序列化之前运行
__wakeup将在序列化之后立刻被调用
具体代码请参照pikachu

PHP反序列化漏洞实战

在线反序列化工具:https://www.w3cschool.cn/tools/index?name=unserialize

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} 

->在php里是调用对象方法很或者属性的运算符。在一个类中,类的函数需要调用自身的方法或者属性需要用$this->来调用,而在类的实例中,也是通过->来调用的,只是前面的变量不是$this

怎么构造payload呢

通过更改序列化之后的变量值,之后将payload写入一个接受序列化数据的API中就可以了

小结

回看整个过程就是 对象通过序列化变为字符串,我们对字符串做手脚,再交给有漏洞的地方进行反序列化

发布了117 篇原创文章 · 获赞 11 · 访问量 6461

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105476972
今日推荐