pikachu-反序列化漏洞

1、序列化的概念(摘自pikachu平台的介绍)

(1)序列化serialize()

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

 

class S{

public $test="pikachu";

}

$s=new S(); //创建一个对象

serialize($s); //把这个对象进行序列化

序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}

O:代表object

1:代表对象名字长度为一个字符

S:对象的名称

1:代表对象里面有一个变量

s:数据类型

4:变量名称的长度

test:变量名称

s:数据类型

7:变量值的长度

pikachu:变量值

 

(2)反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");

echo $u->test; //得到的结果为pikachu

 

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

 

常见的几个魔法函数:

__construct()当一个对象创建时被调用

 

__destruct()当一个对象销毁时被调用

 

__toString()当一个对象被当作一个字符串使用

 

__sleep() 在对象在被序列化之前运行

 

__wakeup将在序列化之后立即被调用

 

2、反序列化漏洞演示:

1、反序列化漏洞的攻击原理。

(1)一般反序列化漏洞都是通过代码审计而发现,一般的黑盒测试是很难发现的。

(2)例如我们通过代码审计发现了漏洞,我们要测试这个漏洞,那么我可以根据站点后台的逻辑进行payload的生成。

(3)我们将生成的payload(一串序列号的字符串)通过前台接口发送至后台,后台在创建、销毁对象的时候会执行魔法函数,比如取出对象的值,那么如果对象的值是一段恶意的js代码,那么将会被执行。

2、下面开始正式的演示环节。我们先来观察代码:

3、我们根据上边的逻辑进行构建,生成我们的payload。

(1)我们在我们的站点环境根目录下创建一个PHP文件(我这里是test.php),写一段我们的PHP代码如下:

<?php

    class S{

        var $test = "<script>alert('xss')</script>";

    }

    echo '<br>';

    $a = new S();

    echo serialize($a);

?>

(2)我们通过浏览器访问这个文件。

(3)我们查看页面源代码,获得我们的payload。

4、执行下图中的操作。

posted @ 2020-02-27 14:36  WindStream  阅读(1329)  评论(0编辑  收藏  举报