不安全的反序列化

文章目录

  • 一、 序列化与反序列化
    • 1.1 引例
    • 1.2 序列化实例
      • 1.2.1 定义一个类
      • 1.2.2 创建对象
      • 1.2.3 反序列化
      • 1.2.4 对象注入
  • 二、 漏洞何在
    • 2.1 漏洞触发
      • 2.1.1 有一个类
      • 2.1.2 有一个对象
      • 2.1.3 反序列化执行代码
    • 2.2 为什么会这样
  • 三、反序列化漏洞攻防
    • 3.1 PHP反序列化实例
    • 3.2 Java 反序列化实例
    • 3.3 反序列化漏洞防御

A8:2017-不安全的反序列化

A08:2021-Software and Data Integrity Failures

对象(真实存在) ----通过序列化 --> 字符串、Json —通过反序列化—>对象

为什么要序列化?

序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”,这种形式⼤多为字节流、字符串、json 串。在序列化期间内,将对象当前状态写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重新创建该对象。简单的说,序列化就是把一个对象变成可以传输的字符串,可以以特定的格式在进程之间跨平台安全的进⾏通信。

一、 序列化与反序列化

1.1 引例

JSON 数据是数据的一种表达形式,与Python ⾥的字典类似。

// json.php$stu = array(
'name'   => 'ghui', 'age'	=> 18,
'sex'	=> true, 'score' => 89.9
);// echo $stu; //echo不能输出数组,可以使用var_dump()进行输出
//var_dump($stu);$stu_json = json_encode($stu); //进行json编码
echo $stu_json; //json编码能够用echo输出,说明json数据能够存储和传输echo "<hr />";$stu_json = isset($_GET['stu'])?$_GET['stu']:$stu_json;
$stu = json_decode($stu_json); //将ghui数据重新还原成对象
var_dump($stu); #强制转换成字符串

json编码结果

{"name":"ghui","age":18,"sex":true,"score":89.9}

结果很像python中的字典

isset() 函数用于检测变量是否已设置并且非 NULL。如果为空,则返回false,否则返回true.

验证:

?stu={"name":"ghui","age":19,"sex":true,"score":89.9}

补充:

echo 只能输出文本字符串,不能输出数组

输出数组可以使用var_dump 进行输出。

var_dump() 函数用于输出变量的相关信息。

var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

image-20230905171818535

1.2 序列化实例

1.2.1 定义一个类

//   stu.class.phpclass Stu{  //定义了一个类,类的名字为Stu
public $name; 
public $age; 
public $sex; 
public $score;
}

解释:

PHP 提供了四个文件包含的语句,四个语句之间略有不同。

语句区别
include()多次包含,多次执行;
如果包含失败,脚本产生警告,继续运行。
include_once()多次包含,一次执行;
如果包含失败,脚本产生警告,继续运行。
require()多次包含,多次执行;
如果包含失败,脚本产生错误,结束执行.
require_once()多次包含,一次执行;
如果包含失败,脚本产生错误,结束执行。

1.2.2 创建对象

创建一个对象,并对该对象进⾏序列化操作,将对象转化为可以存储、传输的字符串。

// serialize.phpinclude   "./stu.class.php"; //包含一下stu.class.php文件,主要是让能够使用里面的Stu类$stu1 = new Stu();$stu1 -> name	= "zhangsan"; //$stu1.name$stu1 -> age	= 24;
$stu1 -> sex	= true;
$stu1 -> score   = 99.9;// echo $stu1; //echo输出不了字符串
// var_dump($stu1); $_stu1 = serialize($stu1); //要想输出,必须将对象stu1进行序列化-->字符串
echo $_stu1; //输出序列化后的字符串

serialize() 函数用于序列化对象或数组,并返回一个字符串。

serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变。

如果想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。

序列化后的字符串:

O:3:"Stu":4:{s:4:"name";s:8:"zhangsan";s:3:"age";s:2:"24";s:3:"sex";N;s:5:"score";d:99.900000000000006;}

解释:

O :代表object

3 :代表类名的字符数,Stu,三个字符,所以是3

4 :代表有4个变量

image-20230905174458756

1.2.3 反序列化

将字符串转化为对象。

//   unserialize.phpinclude "./stu.class.php"; //文件包含$stu1_ser = 'O:3:"Stu":4:{s:4:"name";s:8:"zhangsan";s:3:"age";s:2:"24";s:3:"sex";N;s:5:"score";d:99.900000000000006;}'; //定义一个变量,放入序列化后的字符串。$stu1_obj = unserialize($stu1_ser); 
var_dump($stu1_obj);

unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

image-20230905192513153

1.2.4 对象注入

如果反序列化字符串,Web ⽤⼾可以控制,则造成对象注⼊。

// $stu1_seria = 'O:3:"Stu":4:{s:4:"name";s:8:"zhangsan";s:3:"age";s:2:"24";s:3:"sex";N;s:5:"score";d:99.900000000000006;}';//将stu_ser通过GET来获取序列化后的数据:
$stu1_ser = $_GET['stu1_ser'];$stu1_obj = unserialize($stu1_ser); 
var_dump($stu1_obj);

PHP 的反序列化漏洞也叫PHP 对象注⼊,是一个⾮常常⻅的漏洞,这种漏洞在某些场景下虽然有些难以利⽤,但是一旦利⽤成功就会造成⾮常危险的后果。

image-20230905193740403

我们这时可以将zhangsan改为phpinfo(); 来试着执行以下,注意:这里修改的时候还要修改它的长度,zhangsan的字符长度为8,而phpinfo();的长度为10

image-20230905194451754

我们发现输出了字符phpinfo();,而没有执行phpinfo();,那么漏洞在哪里呢?

二、 漏洞何在

2.1 漏洞触发

2.1.1 有一个类

//   vul.class.phpclass Vul{
public $str = "lisi";function __destruct(){
//echo "This is function __destruct()"; 
@eval($this -> str);}
}

解释:

eval 是一个危险语句,因为它可以将字符串当作PHP代码来执行。

​ 例如:

​ 如果编辑php代码为:

<?php$str="phpinfo();";  echo $str;   //只会输出字符串:  phpinfo();
?>

​ 而如果将echo改为eval:

<?php$str="phpinfo();";  eval($str);  //执行phpinfo();
?>

结果:

image-20230905195606674

2.1.2 有一个对象

// test.phpinclude './vul.class.php';$s = new Vul(); 
echo serialize($s);  //序列化操作
echo "<hr />";$_s = $_GET['s_ser'];
$s = unserialize($_s);  //反序列化操作
var_dump($s);

序列化后:

O:3:"Vul":1:{s:3:"str";s:4:"lisi";}

2.1.3 反序列化执行代码

?obj=O:3:"Vul":1:{s:3:"str";s:10:"phpinfo();";}

image-20230905201110074

我们现在将lisi 换成phpinfo(); 来执行一下试试:

image-20230905201439205

怎么执行的呢?

​ 其实是因为危险函数eval,我们发现eval在__destruct() 函数里面,而我们没有调用这个函数啊,怎么就触发这个函数了呢。

2.2 为什么会这样

__destruct(),会被对象⾃动调⽤。

以 __ 开头的函数,是PHP 中的魔术⽅法。类中的魔术⽅法,在特定情况下会⾃动调⽤。即使魔术⽅法在类中没有被定义,也是真实存在的。

魔术方式触发条件
__construct()在创建对象时⾃动调⽤,构造函数
__destruct()在销毁对象时⾃动调⽤,析构函数
__call();
__callStatic();
__get();
__set();
__isset();
__unset();
__sleep();
__wakeup();
toString();
__invoke();
__set_state();
__clone();
__debuginfo();
创建对象之前触发

漏洞形成的根本原因就是程序没有对⽤⼾输⼊的反序列化字符串进⾏检测,导致反序列化过程可以被恶意控制,进而造成代码执⾏、GetShell 等一系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存在于Java、Python 语⾔中,其原理基本相同。

三、反序列化漏洞攻防

3.1 PHP反序列化实例

typecho 反序列化漏洞

3.2 Java 反序列化实例

Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞

S2-045 Remote Code Execution Vulnerablity

JBoss 5.x/6.x 反序列化漏洞

fastjson 1.2.24 反序列化导致任意命令执⾏漏洞Fastjson 1.2.47 远程命令执⾏漏洞

Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

3.3 反序列化漏洞防御

  • 升级组件到最新版本;
  • ⿊⽩名单过滤敏感字符;
  • 禁⽤反序列化功能;
    149/)

fastjson 1.2.24 反序列化导致任意命令执⾏漏洞Fastjson 1.2.47 远程命令执⾏漏洞

Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 基于微信小程序的校园商铺系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【Java 基础篇】Java 模块化详解

Java 9引入了一项重要的功能&#xff1a;模块化&#xff08;Module System&#xff09;。模块化是一种将代码和资源封装到可重用和独立的单元中的方法&#xff0c;它有助于改善代码的可维护性、可重用性和安全性。本文将介绍Java模块化的基本概念、如何创建和使用模块以及一些最…

AI数字人:最强声音驱动面部表情模型VideoReTalking

目录 1 VideoReTalking论文解读 1.1 介绍 1.2 相关工作 1.2.1 视频编辑中的音频配音 1.2.2 基于音频的单图像面部动画 1.3 框架 1.3.1 语义引导重演网络 1.3.2 口型同步网络 1.3.3 身份感知增强网络 1.3.4 后期处理 1.4 训练 1.4.1 每个模块的训练 1.4.2 评估 1.…

JSP ssm 零配件管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm 零配件管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

注入之SQLMAP(工具注入)

i sqlmap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描&#xff0c;发现并利用给定的URL和SQL注入漏洞&#xff0c;其广泛的功能和选项包括数据库指纹&#xff0c;枚举&#xff0c;数据库提权&#xff0c;访问目标文件系统&#xff0c;并在获取操作权限时执行任…

RabbitMQ生产故障问题分析

1. 问题引发 由某个服务BI-collector-xx队列出现阻塞&#xff0c;影响很整个rabbitMQ集群服务不可用&#xff0c;多个应用MQ生产者服务出现假死状态&#xff0c;系统影响面较广&#xff0c;业务影响很大。当时为了应急处理&#xff0c;恢复系统可用&#xff0c;运维相对粗暴的把…

java Spring Boot2.7实现一个简单的爬虫功能

首先 我们要在 pom.xml 中注入Jsoup 这是一个简单的java爬虫框架 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.1</version> </dependency>然后这里我们直接用main吧 做简单一点 我…

分布式搜索引擎01

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 1.1.2.ELK…

Java函数式接口(Consumer、Function、Predicate、Supplier)详解及代码示例

函数式接口 java.util.function : Consumer :消费型函数接口 void accept(T t) Function :函数型接口 R apply(T t) Predicate :判断型接口 boolean test(T t) Supplier :供给型接口 T get() Consumer - 消费型函数接口 该接口代表了一个接受一个参数并且不返回结果的操作。…

【Less-CSS】初识Less,使编写 CSS 变得简洁

初识Less&#xff0c;使编写 CSS 变得简洁 1.Less简述2.LESS 原理及使用方式3.示例4.less语法5.Easy Less插件 作为一门标记性语言&#xff0c;CSS 的语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题&#xff1a;CSS 需要书写大量看似没有逻辑的代…

Python爬虫从端到端抓取网页

网页抓取和 REST API 简介 网页抓取是使用计算机程序以自动方式从网站提取和解析数据的过程。这是创建用于研究和学习的数据集的有用技术。虽然网页抓取通常涉及解析和处理 HTML 文档&#xff0c;但某些平台还提供 REST API 来以机器可读格式&#xff08;如 JSON&#xff09;检…

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…

一、vue2的基础语法巩固

一、定义&#xff1a;是一个渐进式的JavaScript框架 二、特点&#xff1a; 减少了大量的DOM操作编写 &#xff0c;可以更专注于逻辑操作分离数据和界面的呈现&#xff0c;降低了代码耦合度(前端端分离)支持组件化开发&#xff0c;更利于中大型项目的代码组织 vue2核心功能&a…

【Linux】生产消费模型 + 线程池

文章目录 &#x1f4d6; 前言1. 生产消费模型2. 阻塞队列2.1 成员变量&#xff1a;2.2 入队(push)和出队(pop)&#xff1a;2.3 封装与测试运行&#xff1a;2.3 - 1 对代码进一步封装2.3 - 2 分配运算任务2.3 - 3 测试与运行 3. 循环阻塞队列3.1 POSIX信号量&#xff1a;3.1 - 1…

WKB近似

WKB方法用于研究一种特定类型的微分方程的全局性质 很有用这种特定的微分方程形如&#xff1a; 经过一些不是特别复杂的推导&#xff0c;我们可以得到他的WKB近似解。 该近似解的选择取决于函数和参数的性质同时&#xff0c;我们默认函数的定义域为当恒大于零,时&#xff1a; 当…

44.java教程

目录 一、Java 教程。 &#xff08;1&#xff09;我的第一个 JAVA 程序。 &#xff08;2&#xff09;Java 简介。 &#xff08;2.1&#xff09;java简介。 &#xff08;2.2&#xff09;主要特性。 &#xff08;2.3&#xff09;发展历史。 &#xff08;2.4&#xff09;J…

iOS应用程序的签名、重签名和安装测试

目录 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 前言 ipa编译出来后&#xff0c;或者ipa进行修改后&#xff0c;需要进行重新签名才能安装到测试手机&#xff0c;或者提交app store供apple 商店审核上架。ipaguard有签名和重签名功能&…

吴恩达ChatGPT《Finetuning Large Language Models》笔记

课程地址&#xff1a;https://learn.deeplearning.ai/finetuning-large-language-models/lesson/1/introduction Introduction 动机&#xff1a;虽然编写提示词&#xff08;Prompt&#xff09;可以让LLM按照指示执行任务&#xff0c;比如提取文本中的关键词&#xff0c;或者对…

React中setState的原理及深层理解

1.为什么使用setState React并没有实现类似于Vue2中的Object.defineProperty或者Vue3中的Proxy的方式来监听数据的变化 我们必须通过setState来告知React数据已经发生了变化 setState方法是从Component中继承过来的。 2.setState异步更新 setState设计为异步&#xff0c;可…

PHY6230低成本遥控灯控芯片国产蓝牙BLE5.2 2.4G SoC

高性价比的低功耗高性能蓝牙5.2系统级芯片&#xff0c;适用多种PC/手机外设连接场景。 高性能多模射频收发机&#xff1a; 通过硬件模块的充分复用实现高性能多模数字收发机。发射机&#xff0c;最大发射功率10dBm&#xff1b;BLE 1Mbps速率接收机灵敏度达到-96dBm&#xff1…