PHP反序列化漏洞
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。
序列化与反序列化
seriallization 序列化:将对象转化为便于传输的格式,常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。
deseriallization 反序列化: 将序列化的数据恢复为对象的过程
序列化的需求:
以图书管理系统为例,
针对不同的老师,学生,有不同的权限,学生登记学号借书,原本可以借三本书,加入某些社团后,可以加到借五本书,不同的身份又有不同的权限
假设只有两种身份:1、学生;2、加入社团的学生;
学生加入社团后,需要借书,后台代码需要给加入社团的学生戴上一个标识,增加权限;后期的维护,如果学生有一些其他的操作,像退出了社团之类的,那需要把证明这个人身份的代码拿出来,找到证明他社团身份的代码后删掉,这只是单个人的管理,明显不合理。
以这个系统为例,放在PHP中需要创建数组来保存一个人的信息,放在其他的编程语言里,一个数组不能存放不同类型,由此需要类和对象
序列化
对象转换成字符串
方便传输
PHP反序列化
serialize(); 将对象序列化成字符串
unserialize(); 将字符串反序列化回对象
类与对象与序列化
往往通过一个对象来标识某一个人的身份
个人信息用数组格式保存的话,过于繁琐,不适合用来传输数据;对象更适合用来表示某一个人或事物,数据在互联网传输的时候会把对象的格式打乱。
为了方便数据在网络上传输,提出了一种新的格式,可以把代码或一些对格式要求特别严格的数据,转换为一种通用的数据
查看序列化后的数据格式
反序列化漏洞点:将数据反序列化出来后,无论对数据进行什么操作,都只是对当前的对象进行的操作,只能根据类内限制有的内容进行操作,如果类内没有漏洞的话,即使能改序列化的字符串,危害也不大;但是如果类内有存在一些恶意的东西的话,如PHP内的能够在特定情况下自动调用的一些魔术方法{__construct() 在创建对象时自动调用;__destruct() 在销毁对象时自动调用;__wakeup() unserialize()时会自动调用这个函数;__sleep() serialize()时会自动调用这个函数}
就可能发生一些意想不到的事情。
魔术方法的作用:为了方便程序的开发,提前定义一些函数,如创建对象后预定义一些初始化信息。
举例:__sleep函数在没有被调用的时候自动进行了调用
PHP魔术方法调用
所以反序列化漏洞没有黑盒挖出来的,往往是通过代码审计出来的。
shiro漏洞:
shiro作为一个登录框,公司用到登录框的地方比较多,shiro框架序列化后的字符串使用对称加密算法加密,如果密钥泄露的话,信息就会泄露,但是存在默认的密钥,官方提供了默认密钥,运维人员在使用的时候如果疏忽没有修改默认密钥,攻击者可以尝试默认密钥获取信息
链式调用:
在正常的PHP框架中
序列化和反序列化本身没有问题,但是在执行序列化和反序列化的过程中,往往为了使格式更加美观,或者提前给数据进行了过滤处理,定义了大量代码,这些代码最终造成了恶意函数的执行
修改序列化后的数据目的:
为了满足一定的条件以后实现链式调用
标签:PHP,对象,调用,字符串,格式,序列化 From: https://www.cnblogs.com/2210z/p/17509933.html