something about Pikachu - PHP serialize
pikachu
PHP反序列化
概述
php中的serialize()
和unserialize()
函数,可以将一个对象转变成可传输的字符串,以及从字符串
转换回对象。类似于javascript
中的JSON.stringify(obj)
和JSON.parse(str)
函数的功能。
PHP中的serialize
规则:
1 | // 有以下类: |
unserialize
就是serialize
的反向操作。
unserialize
和serialize
本身没什么问题,但是当反序列化的内容受用户控制时,可能会造成
不正当使用,特别是后台使用了一些魔法函数时。
常见魔法函数如下:
__construct()
对象被创建时被调用
__destruct()
对象被销毁时被调用
__toString()
当一个对象被当作一个字符串使用时被调用
__sleep()
对象在被序列化之前被调用
__wakeup()
当一个对象在被序列化之后被调用
例如上述class S{}
,可以构造对应payload使其具有恶意行为。
1 | // 此时转义符号 |
PHP反序列化漏洞
构造对应对象字符串
:
1 | // payload 为 O:1:"S":1:{s:4:"test";s:30:"<script>alert('bad');</script>";} |
something about Pikachu - PHP serialize
https://cyhfvg.github.io/something-about-Pikachu-PHP-serialize/