【网络安全】反序列化漏洞详细解析

博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门

博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

 一、什么是序列化?

序列化是将变量或对象转换成字符串的过程。

二、反序列化漏洞

1.简介

    就是把一个对象变成可以传输的字符串,目的就是为了方便传输。假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串,当你要用的时候再放他出来就好了。在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。

2、反序列化漏洞产生的原理

serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。

当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的 payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。

 class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化

3.序列化字符含义

序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表对象名字长度为一个字符 (即“S”)
        S:对象的名称
        1:代表对象里面有一个变量
        s:数据类型   (string 字符串)
        4:变量名称的长度
        test:变量名称
        s:数据类型    (pikachu 同样为字符串string)
        7:变量值的长度
        pikachu:变量值

4.序列化后的格式

O:strlen(类名):类名:类的变量个数:{类型:长度:值;类型:长度:值…}

其他类型的数据序列化后的格式为:

String类型 :s:size:value
Integer类型 :i:value
Boolean类型 : b:value (保存1或0)
Null型 :N
Array :a:size:{key definition;value definition}

还有需要注意的点是:分割不同字段}结尾,这对反序列化很重要

5.序列化魔法函数

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题.
  常见的几个魔法函数:     //不同场景下被自动调用
        __construct()当一个对象创建时被调用

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

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

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

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

6.漏洞举例:

  class S{
            var $test = "pikachu";
            function __destruct(){
                echo $this->test;    //一旦S这个类被创建,则将会自动使用魔法函数。当对象被销毁时,则下面的操作会被自动执行} }
        $s = $_GET['test'];
        @$unser = unserialize($a);

      payload【有效攻击负载,是包含在你用于一次漏洞利用(exploit)中的ShellCode中的主要功能代码】:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
反序列化的内容是从用户前端传过来的,若从前端传来的内容中插入了恶意的反序列化的内容,后台检测到会对内容进行反序列化,则通过反序列化的接口造成XSS漏洞。

三,反序列化漏洞的修复

1、安全配置好php相关参数
      通过Php配置文件里面有个disable_functions = 配置,这个禁止某些php函数,
服务器便是用这个来禁止php的执行命令函数。

例如:
disable_functions =system,passthru,shell_exec,exec,popen便禁止了用这些函数来执行系统命令

2、升级中间件

3、严格控制传入变量,严谨使用魔法函数

猜你喜欢

转载自blog.csdn.net/weixin_50481708/article/details/127101222