反序列化漏洞
1.概述
百度百科上序列化是这样当以的将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
简单的说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信
PHP 中序列化与反序列化
PHP 反序列化漏洞也叫PHP 对象注入,是一个常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常威胁的后果。漏洞的形成的根本原因是程序员没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell 等一系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存在于Java、Python 等语言之中但其原理基本相通。
PHP中的序列化与反序列化,基本都是围绕serialize()和 unserialize() 两个函数展开的。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的串行,以下下面是一个对象:
S级{
公开的$ test =“ pikachu”;
}
$ s = new S(); //创建一个对象
序列化($ s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:“ S”:1:{s:4:“ test”; s:7:“ pikachu”;}
O:代表对象
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
测试:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
反序列化unserialize()
就是把被序列化的串行还原为对象,然后在随后的代码中继续使用。
$ u = unserialize(“ O:1:” S“:1:{s:4:” test“; s:7:” pikachu“;}”));
回声$ u-> test; //得到的结果为pikachu
常见的几个魔法函数
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被视为一个字符串使用
__sleep()在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
进攻体现:
S级{
var $ test =“皮卡丘”;
函数__destruct(){
回声$ this-> test;
}
}
$ s = $ _GET ['test'];
@ $ unser =反序列化($ a);
有效负载:O:1:“ S”:1:{s:4:“ test”; s:29:“ <script> alert('xss')</ script>”;}