Ywc

反序列化漏洞

Word count: 703 / Reading time: 2 min
2018/06/03 Share

PHP中的反序列化漏洞

前言:

好长时间没做php反序列化问题,都快忘了,总结一下防止忘记。

原理:

php允许保存一个对象方便以后重用,这个过程被称为序列化.

序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等 函数 : serialize()

反序列化:恢复原先被序列化的变量 函数: unserialize()

序列化:

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$test1 = "hello world"
$test2 = array("hello","world");
$test3 = 123456;
echo serialize($test1); // s:11:"hello world"; 序列化字符串
echo serialize($test2); // a:2:{i:0;s:5:"hello";i:1;s:5:"world";} 序列化数组
echo serialize($test3); // i:123456;
?>
<?php
class hello{
public $test = "hello,world";
}
$test = new hello();
echo serialize($test); // O:5:"hello":1:{s:5:"test4";s:11:"hello,world";
?>

序列化对象时,首字母代表参数类型。

1
2
3
4
5
6
7
8
9
10
11
12
a – array 数组
b – boolean布尔型
d – double双精度型
i – integer(int)
o – common object一般对象
r – reference
s – string
C – custom object 自定义对象
O – class
N – null
R – pointer reference
U – unicode string unicode编码的字符串

参数后面的数字代表参数的长度。

序列化字符串格式: 变量类型:变量长度:变量内容

如果序列化的是一个对象,序列化字符串格式为:

变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}

如上面的O:5:”hello”:1:{s:5:”test4”;s:11:”hello,world”.

反序列化存在的问题

魔术方法:官方文档中介绍

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),
__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
等方法在 PHP 中被称为”魔术方法”(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

问题原因:漏洞的根源在于unserialize()函数的参数可控。如果反序列化对象中存在魔术方法,而且魔术方法中的代码或变量用户可控,就可能产生反序列化漏洞,根据反序列化后不同的代码可以导致各种攻击,如代码注入、SQL注入、目录遍历等等。

反序列化漏洞中常见到有一些魔术方法:__construct():在对象创建时自动被调用; __destruct():在脚本运行结束时自动被调用;__sleep():在对象序列化的时候自动被调用;__wakeup():在反序列化为对象时自动被调用;__toString(): 直接输出对象引用时自动被调用;

魔术方法的使用方法及案列详见官方文档介绍

参考链接:

http://www.freebuf.com/column/151447.html

http://www.lsablog.com/network_security/penetration/php-unserialize-bug-summary/

http://www.freebuf.com/vuls/116705.html

https://www.cnblogs.com/Mrsm1th/p/6835592.html

http://www.5idev.com/p-php_member_overloading.shtml

原文作者: Ywc

原文链接: https://yinwc.github.io/2018/06/03/phpmagic/

发表日期: June 3rd 2018, 3:46:59 pm

版权声明:

CATALOG
  1. 1. PHP中的反序列化漏洞
    1. 1.1. 前言:
    2. 1.2. 原理:
    3. 1.3. 序列化:
    4. 1.4. 反序列化存在的问题