PHP反序列化漏洞

PHP反序列化漏洞

https://www.cnblogs.com/youyoui/p/8610068.html

一、PHP反序列化漏洞原理

PHP反序列化漏洞:CVE-2016-7124,PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞,执行unserialize()时,先会调用__wakeup()。

当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()函数的执行。

二、反序列化的例子与格式

序列化格式

在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。

序列化函数原型如下:

1
string serialize ( mixed $value )

先看下面的例子:

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
class CC {
public $data;
private $pass;

public function __construct($data, $pass)
{
$this->data = $data;
$this->pass = $pass;
}
}
$number = 34;
$str = 'uusama';
$bool = true;
$null = NULL;
$arr_int = array(1,2);
$arr = array('a' => 1, 'b' => 2);
$cc = new CC('uu', true);

var_dump(serialize($number));
var_dump(serialize($str));
var_dump(serialize($bool));
var_dump(serialize($null));
var_dump(serialize($arr_int));
var_dump(serialize($arr));
var_dump(serialize($cc));

输出结果为:

1
2
3
4
5
6
7
string(5) "i:34;"
string(13) "s:6:"uusama";"
string(4) "b:1;"
string(2) "N;"
string(22) "a:2:{i:0;i:1;i:1;i:2;}"
string(30) "a:2:{s:1:"a";i:1;s:1:"b";i:2;}"
string(52) "O:2:"CC":2:{s:4:"data";s:2:"uu";s:8:" CC pass";b:1;}" #注意private、protect属性序列化之后的字符串开头结尾各有一个空白字符(即%00)

所以序列化对于不同类型得到的字符串格式为:

  • String : s:size:value;
  • Integer : i:value;
  • Boolean : b:value;(保存1或0)
  • Null : N;
  • Array : a:size:{key definition;value definition;(repeated per element)}
  • Object : O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器