我的编程空间,编程开发者的网络收藏夹
学习永远不晚

反序列化漏洞详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

反序列化漏洞详解

目录

一、什么是序列化和反序列化

二、什么是反序列化漏洞

三、序列化函数(serialize)

四、反序列化(unserialize)

​五、什么是PHP魔术方法

六、一些常见的魔术方法

七、魔术方法的利用

 八、反序列化漏洞的利用

1.__destruct()函数

2.__wakeup()

3.toString()

​九、反序列化漏洞的防御


一、什么是序列化和反序列化

序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用。在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。

二、什么是反序列化漏洞

当程序在进行反序列化时,会自动调用一些函数,例如__wakeup(),__destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。

三、序列化函数(serialize)

当我们在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,用于保存对象的值方便之后的传递与使用。

测试代码

";print_r($stu);//进行序列化$stus = serialize($stu);print_r($stus);}?>

查看结果:

四、反序列化(unserialize)

        unserialize()可以从序列化后的结果中恢复对象(object)为了使用这个对象,在下列代码中用unserialize重建对象.

测试代码:

";//进行反序列化print_r(unserialize($stus)); ?>

查看结果:

五、什么是PHP魔术方法

魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,利用魔术方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)。 问题就出现在重载过程中,执行了相关代码。

六、一些常见的魔术方法

  • __construct() :构造函数,当创建对象时自动调用。
  • __destruct():析构函数,在对象的所有引用都被删除时或者对象被显式销毁时调用,当对象被销毁时自动调用。
  • __wakeup():进行unserialize时会查看是否有该函数,有的话有限调用。会进行初始化对象。
  • __ toString():当一个类被当成字符串时会被调用。
  • __sleep():当一个对象被序列化时调用,可与设定序列化时保存的属性。

七、魔术方法的利用

测试代码:

";   //序列化    $stu_ser = serialize($stu);    print_r($stu_ser);    //当成字符串输出    echo "$stu";   //反序列化    $stu_unser = unserialize($stu_ser);    print_r($stu_unser);?> 

 测试结果:

 八、反序列化漏洞的利用

由于反序列化时unserialize()函数会自动调用wakeup(),destruct(),函数,当有一些漏洞或者恶意代码在这些函数中,当我们控制序列化的字符串时会去触发他们,从而达到攻击。

1.__destruct()函数

个网站内正常页面使用logfile.php文件,代码中使用unserialize()进行了反序列化,且反序列化的值是用户输入可控 。正常重构Stu对象

测试代码:

name.'
';echo '年龄:'.$this->age;}}//实例化对象$stu = new Stu();//重构用户输入的数据$newstu = unserialize($_GET['stu']);//O:3:"Stu":2:{s:4:"name";s:25:"";s:3:"age";i:120;}echo "
";var_dump($newstu) ; ?>

logfile.php 代码:

';file_put_contents($this->filename, $text,FILE_APPEND);}//删除日志文件function __destruct(){//输出删除的文件echo '析构函数__destruct 删除新建文件'.$this->filename;//绝对路径删除文件unlink(dirname(__FILE__).'/'.$this->filename);}}  ?>

正常输入参数:O:3:"Stu":2:{s:4:"name";s:2:"aa";s:3:"age";i:20;}

重构logfile.php文件包含的对象进行文件删除 

  •  正常重构:O:7:"LogFile":1:{s:8:"filename";s:9:"error.log";}

 发现正常删除,但如果我们修改参数,让其删除其他的文件呢?

  • 异常重构:O:7:"LogFile":1:{s:8:"filename";s:10:"../ljh.php";}
  • 执行该代码

2.__wakeup()

例如有一个代码为index.php,源码如下

test);fclose($fp);}}$class = @$_GET['test'];print_r($class);echo "
";$class_unser = unserialize($class);// 为显示效果,把这个shell.php包含进来 require "shell.php"; ?>

 传入参数:?test=O:7:"chybeta":1:{s:4:"test";s:19:"";}

 查看shell.php文件

也可以传入一句话木马:O:7:"chybeta":1:{s:4:"test";s:25:"";}

3.toString()

举个例子,某用户类定义了一个__toString为了让应用程序能够将类作为一个字符串输出(echo $obj),而且其他类也可能定义了一个类允许 __toString读取某个文件。把下面这段代码保存为fileread.php

fileread.php代码

filename);}} ?>

 个网站内正常页面应引用fileread.php文件,代码中使用unserialize()进行了反序列化,且反序列化的值是用户输入可控 。

测试代码:

name.';'.'年龄:'.$this->age;}}//O:4:"User":2:{s:4:"name";s:2:"aa";s:3:"age";i:18;}//反序列化$obj = unserialize($_GET['user']);//当成字符串输出触发toStringecho $obj; ?>

 正常重构:O:4:"User":2:{s:4:"name";s:2:"aa";s:3:"age";i:18;}

 

重构fileread.php文件包含的类进行读取password.txt文件内容

重构:O:8:"FileRead":1:{s:8:"filename";s:12:"password.txt";}

九、反序列化漏洞的防御

和大多数漏洞一样,反序列化的问题也是用户参数的控制问题引起的,所以最好的预防措施: 

  1.  不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去。
  2. 在进入反序列化函数之前,对参数进行限制过滤。

 

来源地址:https://blog.csdn.net/LJH1999ZN/article/details/123338591

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

反序列化漏洞详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHPsession反序列化漏洞超详细讲解

这篇文章主要介绍了PHP session反序列化漏洞,php session反序列化漏洞存在的原因是当序列化session和读取反序列化字符时采用的序列化选择器不一样时,处理的方法不一样
2023-02-16

fastjson反序列化漏洞怎么解决

要解决fastjson反序列化漏洞,可以采取以下几种措施:1. 更新fastjson版本:及时更新fastjson到最新版本,因为漏洞通常会在新版本中得到修复。2. 配置fastjson的AutoType检查:开启AutoType检查,限制
2023-08-14

PHP反序列化漏洞实例分析

本篇内容介绍了“PHP反序列化漏洞实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、PHP面向对象编程在面向对象的程序设计(Obje
2023-06-29

java反序列化漏洞怎么修复

修复Java反序列化漏洞可以采取以下措施:1. 反序列化白名单:在反序列化操作之前,先进行输入验证,只接受预先定义好的类进行反序列化操作。可以使用许可清单(Whitelist)或黑名单(Blacklist)的方式限制可反序列化的类。2. 使
2023-08-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录