不安全的反序列化

文章目录

  • 一、 序列化与反序列化
    • 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.xdnf.cn/news/142069.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat8 任意写文件PUT方法 (CVE-2017-12615)

Tomcat 任意写文件PUT方法 (CVE-2017-12615) 文章目录 Tomcat 任意写文件PUT方法 (CVE-2017-12615)1 在线漏洞解读:2 版本影响3 环境搭建4 漏洞复现4.1 访问4.2 POC攻击点4.2.1 直接发送以下数据包&#xff0c;然后shell将被写入Web根目录。4.2.2 访问是否通&#xff0c;可以访…

智能热水器丨打造智能家居新体验

随着科学技术的不断发展&#xff0c;智能电器越来越被大众所采纳&#xff0c;如智能扫地机&#xff0c;智能洗衣机&#xff0c;智能微波炉等等&#xff0c;越来越智能的电器为人们的生活带来了许多便利。以往的热水器一般都是只有按键/机械的控制方式&#xff0c;没有其他无线控…

ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql&#xff0c;程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

内存管理和模板

目录 定位new表达式 定位new使用的池化技术&#xff1a; ​编辑 malloc和free与new和delete的区别&#xff1a; 内存泄漏&#xff1a; 模板 显示实例化 两个不同参数的模板 模板函数与函数&#xff1a; 类模板 []重载&#xff1a; 定位new表达式 class A { public:A(int …

大数据时代,数据治理

一、大数据时代还需要数据治理吗&#xff1f; 数据平台发展过程中随处可见的数据问题 大数据不是凭空而来&#xff0c;1981年第一个数据仓库诞生&#xff0c;到现在已经有了近40年的历史&#xff0c;相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末…

ToBeWritten之攻击者模拟

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…

路由综合实验

RIP配置 在R1上配置 rip 1 #此处的1表示进程号&#xff0c;非版本号 version 2 #选择rip版本2 network 100.0.0.0 network 12.0.0.0 network 13.0.0.0 #rip宣告时只能宣告主类网络&#xff0c;实际上是对内宣告为主类网络&#xff0c;对外转发时时携带子网掩码的在R2上…

【postgresql】 ERROR: multiple assignments to same column “XXX“

Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; 原因&#xff1a;or…

Java开发需要的网络基础知识,搞清楚计算机网络底层原理

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 计算机基础是…

变电站运维服务方案

一、背景与目标 随着电力行业的快速发展&#xff0c;变电站的数量和规模不断扩大&#xff0c;运维服务的需求也日益增长。为了确保变电站的安全、稳定、高效运行&#xff0c;提高运维服务质量&#xff0c;本文档旨在提供一套全面的变电站运维服务方案。 二、服务范围 …

lv5 嵌入式开发-6 线程的取消和互斥

目录 1 线程通信 – 互斥 2 互斥锁初始化 – pthread_mutex_init 3 互斥锁销毁 pthread_mutex_destroy 4 申请锁 – pthread_mutex_lock 5 释放锁 – pthread_mutex_unlock 6 读写锁 7 死锁的避免 8 条件变量&#xff08;信号量&#xff09; 9 线程池概念和实现 9.1 …

CCS介绍

CCS介绍 设置主体颜色 修改字体的颜色和大小 安装一些插件 CCS中的App中心 切换工作空间 导入工程

el-table-column默认选中一个复选框和只能单选事件

表格代码 <el-table ref"contractTable" v-loading"loading" :data"contractList" selection-change"contractSelectionChange" style"margin-top: 10%;"><el-table-column type"selection" width"…

【分享】Word文档如何批量转换成PDF?

Word格式比较容易编辑&#xff0c;是工作中经常用到的文档工具&#xff0c;有时候为了避免文档在传送中出现乱码&#xff0c;或者防止被随意更改&#xff0c;很多人会把Word文档转换成PDF&#xff0c;那Word文档要怎样转成PDF呢&#xff1f;如果Word文档很多&#xff0c;有没有…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

Three.js后期处理简明教程

后期处理&#xff08;Post Processing&#xff09;通常是指对 2D 图像应用某种效果或滤镜。 在 THREE.js 中我们有一个包含一堆网格物体的场景。 我们将该场景渲染为 2D 图像。 通常&#xff0c;该图像会直接渲染到画布中并显示在浏览器中&#xff0c;但我们可以将其渲染到渲染…