当前位置: 首页 > news >正文

PHP、JAVA、Shiro反序列化

目录

一、PHP反序列化

二、JAVA反序列化

三、Shiro反序列化

Shiro-550 反序列化漏洞原理

Shiro-721 反序列化漏洞原理

Padding Oracle 漏洞补充:

防御措施:


一、PHP反序列化

主要是分为有类和无类:

1、有类:就有相关的魔术方法

2、无类:就只是序列化和反序列化

#PHP 反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码
执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行
反序列化的时候就有可能会触发对象中的一些魔术方法。serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:参考:https://www.cnblogs.com/20175211lyz/p/11403397.html__construct()	//创建对象时触发
__destruct() 	//对象被销毁时触发
__call() 			//在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() 			//用于从不可访问的属性读取数据
__set() 			//用于将数据写入不可访问的属性
__isset() 		//在不可访问的属性上调用 isset()或 empty()触发
__unset() 		//在不可访问的属性上使用 unset()时触发
__invoke() 		//当脚本尝试将对象调用为函数时触发

二、JAVA反序列化

Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,其作用把对象转换成字节流,便于保存或者传输,而ObjectInputStream类的readObject()方法用于反序列化,作用就是把字节流还原成对象。

三、Shiro反序列化

Shiro反序列化主要是Apache Shiro提供了一个remember 的功能,用户登录成功后会生成经过加密并编码的cookie,保存在浏览器中方便用户的日常使用。

而服务器对cookie的处理流程就是先获取浏览器上保存的cookie,然后将其base64解码,再进行AES解密,再将其反序列化进行校验。

而漏洞就是出现在这里,我们都知道AES它是一个硬编码,他是有默认密钥的,如果程序员没有去修改或者过于简单,那我们就可以进行cookie重构,先构造我们的恶意代码,然后将恶意代码进行序列化,然后AES加密(密钥我们已经爆破出来了)再进行base64编码,形成我们新的cookie,而服务器在处理时就会按照刚才的处理流程,就会在服务端触发我们构造的恶意代码。

过程:

  1. 加密过程:用户在登录时勾选 "Remember Me" 功能,Shiro 会将用户身份信息序列化后进行 AES 加密和 Base64 编码,然后存储在 cookie 的 RememberMe 字段中。
  2. 解密过程:当用户再次访问服务器时,服务器会从 cookie 中提取 RememberMe 字段,进行 Base64 解码和 AES 解密,最后反序列化以获取用户身份信息。
  3. 攻击者利用:攻击者可以利用已知的或通过爆破得到的 AES 密钥,构造恶意的序列化对象,并按照 Shiro 的加密解密流程进行处理,生成恶意的 RememberMe cookie。当服务器处理这个恶意 cookie 时,就会触发反序列化漏洞,执行攻击者的代码。

 

Shiro-550 反序列化漏洞原理

Shiro-550 漏洞的根本原因在于 Shiro 使用了一个硬编码的 AES 加密密钥,这个密钥在 Shiro 的源码中是默认的,因此任何人都可以使用这个密钥来构造 RememberMe 的值,进而让服务器执行反序列化操作。攻击者可以创建一个恶意对象,对其进行序列化、AES 加密和 Base64 编码,然后将其作为 RememberMe cookie 发送给服务器。服务器在解码和反序列化这个 cookie 时,会执行其中的恶意代码。

Shiro-721 反序列化漏洞原理

与 Shiro-550 类似,Shiro-721 漏洞也涉及到 RememberMe 功能,但它的 AES 加密密钥通常是随机生成的,不容易被猜测。攻击者需要使用有效的用户信息和 RememberMe cookie 来执行 Padding Oracle 攻击,构造恶意的 RememberMe 字段进行反序列化攻击。这种攻击利用了 AES-128-CBC 模式中的 Padding Oracle 漏洞,允许攻击者在不知道加密密钥的情况下,通过填充错误的响应时间来推断出加密过程中的秘密信息。

Padding Oracle 漏洞补充:

Padding Orace 四攻击指应用在解密客户端只提交的加密数据时,泄露了解密数据的分段填充是否合法的信息。攻击者利用PaddingOrace可以在不知道加密程序所使用的密钼的情况下,解密数据或者加密任意数据。即使应用程序确认加密数据的完整性,仍会导致该程序仍有敏感数据泄露和越权漏洞的风,险。
密文在被解密时,会被分成若干个数据块,每个数据块有固定的长度,常见的加密算法只大多为8字节或16字节。当数据不满足指定长度时,程序会通过指定的方式进行填充,以方便在解密时能剥除这些这些填充数据。常见的填充标准有PKCS#7。当填充内容与标准要求的语法不一致时,会生成一个错误。如果应用在解析客户端提交的加密信息时泄露了这个填充出错的状态信息,就形成了Padding Oracle。

550和721区别:

550是固定密钥,721是随机密钥

防御措施:

  • 升级 Shiro 版本:更新到 1.2.4 以上的版本,不使用默认的加密密钥,而是随机生成密钥。
  • 安全配置:不要使用公开的密钥,避免将密钥硬编码在代码中,确保密钥的安全性。
  • WAF 防护:通过 Web 应用防火墙拦截异常的 RememberMe cookie 值,防止恶意利用。

相关文章:

  • 云原生主要架构模式
  • java云原生实战之graalvm 环境安装
  • 考研系列-408真题计算机组成原理篇(2015-2019)
  • C++ QT 与 win32 窗口可以互操作
  • 创建thinkphp项目并配置数据库
  • 微服务架构中的多进程通信--内存池、共享内存、socket
  • Java期末总复习 编程题(偏基础)
  • Python数据可视化再探——Matplotlib模块 之一
  • Unity入门学习(四)3D数学(4)之四元数Quaternion
  • python新手学习笔记①
  • Vue2到Vue3迁移问题解析
  • uniapp-商城-63-后台 商品列表(分类展示商品的删除)
  • GO语言学习(六)
  • Python实战:打造一个功能完整的单位转换器(长度/温度/货币)
  • 5.20打卡
  • 解决git中断显示中文为八进制编码问题
  • StreamSaver实现大文件下载解决方案
  • 基于R语言的贝叶斯网络建模:生态与环境因果推断实践
  • Linux网络编程:广播、组播与原始套接字
  • DAY31
  • 破题“省会担当”,南京如何走好自己的路?
  • 痴情与真爱
  • 张核子“限高”次日即被解除,前员工的执行款3个月后仍未到账
  • 多所院校高规格召开考研动员会,有学院考研报名率达84%
  • 小米法务部:犯罪团伙操纵近万账号诋毁小米,该起黑公关案告破
  • 国家统计局:中美大幅降低关税有利于双方贸易增长,也有利于世界经济复苏