不安全的反序列化

文章目录

  • 一、 序列化与反序列化
    • 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吧 做简单一点 我…

Linux 终端命令总结

一、常用的七条命令 命令 对应英文作用lslist查看当前文件夹下的内容pwdprint work directory查看当前所在文件夹cd [目录名]change directory切换文件夹 touch [文件名]touch如果文件不存在新建文件mkdir [目录名]make directory创建目录rm[文件名]remo…

如何在Vue 3项目中使用Jest配置生成测试报告

1. 介绍 在Vue 3项目中使用Jest进行单元测试是一种常见的做法&#xff0c;它可以帮助我们验证代码的正确性和稳定性。而生成测试报告可以帮助我们更好地了解测试覆盖率和测试结果&#xff0c;以便更好地优化和改进我们的代码。本文将介绍如何在Vue 3项目中配置Jest&#xff0c…

Vue Hooks 让Vue开发更简单与高效

Vue Hooks 让Vue开发更简单与高效 介绍 Vue Hooks 是一个基于 Vue.js 的插件&#xff0c;它提供了一种新的方式来编写 Vue 组件&#xff0c;使得开发更加简单和高效。它借鉴了 React Hooks 的概念&#xff0c;通过使用 Hooks&#xff0c;我们可以在不编写类组件的情况下&…

MQ - 29 基础功能:事务消息的设计

文章目录 导图概述消息队列中的事务是什么主流消息队列的事务功能RabbitMQ 的事务消息RocketMQ 的事务消息Kafka 的事务消息Pulsar 的事务消息小结分布式事务理论基础XA - 两阶段事务(2PC)XA - 三阶段事务(3PC)CanCommit 阶段PreCommit 阶段DoCommit 阶段TCC消息队列的事务…

Shell脚本之if的用法

Shell脚本之if的用法 1、if语句的格式2、if语句的conditon介绍3、应用举例 1、if语句的格式 1&#xff09; if-elif-else语法格式 if [ condition1 ]; then # 执行条件1的代码块 elif [ condition2 ]; then # 执行条件2的代码块 else # 执行条件都不满足时的代码块 …

分布式搜索引擎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 - 消费型函数接口 该接口代表了一个接受一个参数并且不返回结果的操作。…

YOLOV8 C++ opecv_dnn模块部署

废话不多说:opencv>4.7.0 opencv编译不做解释&#xff0c;需要的话翻看别的博主的编译教程 代码饱含V5,V7,V8部署内容 头文件yoloV8.h #pragma once #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; using name…

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

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

Linux系统编程——线程的学习

学习参考博文&#xff1a; Linux多线程编程初探 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——进程间通信的学习Linux系统编程——网络编程的学习 Linux系统编程——线程的学习 一、概述1. 进程与线程的区别2. 使…

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…