• 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、执行下图中的操作。

  • 相关阅读:
    对GDI+绘制圆弧接口的理解
    陈灯可重用代码管理器(插件版最新版本:3.2;桌面版最新版本:2.3)
    Apache OpenJPA 2.1.0 发布
    B3log Solo 0.2.5.1 发布了!
    Apache OpenJPA 2.1.0 发布
    jsoup 1.5.1 发布,超棒的HTML解析器
    程序员阿士顿的故事
    Web 是开源最大的成功
    Web 是开源最大的成功
    Python执行系统命令的方法 os.system(),os.popen(),commands renwofei423的个人空间 开源中国社区
  • 原文地址:https://www.cnblogs.com/Feng-L/p/12371933.html
Copyright © 2020-2023  润新知