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

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:"<script>alert('xss')</script>";}

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

2.3 漏洞原理分析

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

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

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

2.4 漏洞演示

在这里插入图片描述
构造payload:O:1:“S”:1:{s:4:“test”;s:29:“”;}
输入api框中:
在这里插入图片描述
成功得到下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值