pikachu靶场___反序列化漏洞教程

pikachu靶场___反序列化漏洞教程

  • 1、靶场环境搭建使用
  • 2、基础知识讲解
    • 2.1 什么是反序列化
    • 2.2 为什么会产生这个漏洞?
    • 2.3 漏洞原理分析
    • 2.4 漏洞演示

1、靶场环境搭建使用

详见 https://blog.csdn.net/qq_41584172/article/details/103020109

2、基础知识讲解

2.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:变量值

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

$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

2.2 为什么会产生这个漏洞?

这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发不用我们手动调用:

__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用

这些就是我们要关注的几个魔术方法了,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞了。

   **漏洞举例**
    class S{
        var $test = "pikachu";
        function __destruct(){
            echo $this->test;
        }
    }
    $s = $_GET['test'];
    @$unser = unserialize($a);

    payload:O:1:"S":1:{s:4:"test";s:29:"";}

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

2.3 漏洞原理分析

造成漏洞主要有两个问题:应用代码问题、底层PHP漏洞。

(一)应用代码反序列化漏洞产生条件
1、反序列化函数,传入参数可控,如上面那道CTF题目$file就是可控的;
2、__destruct()方法可利用,如CTF题目就是利用__destruct()方法中的show_source(),从而暴露源码;
3、以上两点没有对传参进行过滤,否则无法构成目的Payload。

(二)底层PHP漏洞
简单来说,如果对象属性检查异常。

2.4 漏洞演示

pikachu靶场___反序列化漏洞教程_第1张图片
构造payload:O:1:“S”:1:{s:4:“test”;s:29:“”;}
输入api框中:
pikachu靶场___反序列化漏洞教程_第2张图片
成功得到下图:
pikachu靶场___反序列化漏洞教程_第3张图片

你可能感兴趣的:(靶场学习,反序列化漏洞)