pikachu
pikachu => 备份地址
PHP反序列化
概述
php中的serialize()
和unserialize()
函数,可以将一个对象转变成可传输的字符串,以及从字符串
转换回对象。类似于javascript
中的JSON.stringify(obj)
和JSON.parse(str)
函数的功能。
PHP中的serialize
规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class S{ public $paramA = "valueA"; public $paramB = "valueB";
function funA(){ echo "function A"; }
function __destruct(){ echo $this->paramA; } }
$obj = new S(); $objStr = serialize($obj); echo $objStr;
|
unserialize
就是serialize
的反向操作。
unserialize
和serialize
本身没什么问题,但是当反序列化的内容受用户控制时,可能会造成
不正当使用,特别是后台使用了一些魔法函数时。
常见魔法函数如下:
__construct()
对象被创建时被调用
__destruct()
对象被销毁时被调用
__toString()
当一个对象被当作一个字符串使用时被调用
__sleep()
对象在被序列化之前被调用
__wakeup()
当一个对象在被序列化之后被调用
例如上述class S{}
,可以构造对应payload使其具有恶意行为。
1 2 3 4 5 6
|
$objStr = 'O:1:"S":2:{s:30:"<script>alert(\'bad\');</script>";s:6:"valueA";s:6:"paramB";i:2;}'; $obj = unserialize($objStr);
|
PHP反序列化漏洞
构造对应对象字符串
: