Shiro反序列化

Shiro反序列化

参考文章:

Shiro反序列化漏洞笔记一(原理篇)

环境搭建

直接从github上clone代码到本地。

修改 pml.xml(路径为 \shiro\samples\web\pom.xml)

之后 maven 搭建,配置 tomcat 环境

img

img

img

漏洞分析

漏洞分析具体已经在 Java-sec-code 分析过了,就不再重复了:

逻辑总结:

当获取用户请求时,大致的关键处理过程如下:

  1. 获取Cookie中rememberMe的值

  2. 对rememberMe进行Base64解码

  3. 使用AES进行解密

  4. 对解密的值进行反序列化

由于AES加密的Key是硬编码的默认Key,因此攻击者可通过使用默认的Key对恶意构造的序列化数据进行加密,当

CookieRememberMeManager 对恶意的 rememberMe 进行以上过程处理时,最终会对恶意数据进行反序列化,从而导致反序列化漏洞。

Shiro rememberMe 功能用于“记住登录状态”。它的设计逻辑是:

用户勾选“记住我”登录后,Shiro 把用户的认证信息序列化为字节流,用一个固定密钥(默认是 kPH+bIxk5D2deZiIxcaaaA==)用 AES 加密,Base64 编码后作为 rememberMe Cookie 发送给浏览器。当浏览器下次请求时,Shiro:读取 rememberMe Cookie,用同样的密钥进行解密,然后直接反序列化出用户对象,只要攻击者能控制 rememberMe Cookie 内容,就能构造恶意对象反序列化,从而执行任意代码。

漏洞利用:

生成恶意序列化数据

加密 Payload

发送 cookie 请求

null

也可以利用工具:

null

null

null

总结:

重写readObject

Shiro使用的是Java原生反序列化(当一个类实现了Serializable接口并且重写readObject方法时,该方法会在对象进行反序列化时被调用),其漏洞成因是反序列化的类重写了readObject方法,反序列化时调用readObject() 触发重写类的readObject() 方法

利用:恶意命令 -> 序列化 -> AES加密 -> Base64编码 -> rememberMe Cookie 值 -> Base64解码 -> AES解密 -> 反序列化 -> 执行恶意命令

Shiro 550反序列化

前置知识

参考文章:

关于我学渗透的那档子事之Java反序列化-CB链

https://www.freebuf.com/articles/web/319397.html

Java代码审计&Shiro反序列化&CB1链

https://blog.csdn.net/qq_46081990/article/details/135724944

CC链 1-7 分析

https://xz.aliyun.com/news/8908

Javaweb安全——反序列化漏洞-CC&CB链思路整理

https://blog.csdn.net/weixin_43610673/article/details/127580121

1、CC & CB 链 (简单理解)

shiro反序列化利用工具

JavaThings - Java安全漫谈笔记相关

https://github.com/phith0n/JavaThings/tree/master

Commons Collections 链

来源 Apache Commons Collections 库,利用该库的 Transformer、LazyMap 等类,在反序列化时自动调用恶意代码

Commons Beanutils 链

来源:Apache Commons Beanutils 库,利用 BeanComparator 在反序列化触发排序比较时,调用 getter 方法,从而间接触发另一条漏洞链(常常是 cc 链)

CB 链生成:

2、一个完整的攻击链通常由以下三个部分组成:

1、Source(源):入口点,通常是指攻击链的起始点,其中用户输入或外部数据进入应用程序。在反序列化漏洞中,readObject 方法通常被认为是源,因为它是从输入流读取数据并进行反序列化的方法。

2、Sink(执行点):执行点,是攻击链上的终点,其中攻击者希望执行恶意操作的位置。在反序列化漏洞中,sink 可能是一个动态方法执行、JNDI注入或写文件等操作。

3、Gadget(链):连接入口执行的多个类,通过它们的相互方法调用形成攻击链。Gadget 类通常满足一些条件,例如类之间方法调用

是链式的,类实例之间的关系是嵌套的,调用链上的类都需要是可以序列化的。在反序列化漏洞中,Gadget 类是攻击者构建的、可序列

化的类,通过构建特定的对象图,使得在反序列化时执行恶意代码。

3、理解数据结构

数据结构:

https://oi-wiki.org/ds/

二叉堆

https://oi-wiki.org/ds/binary-heap/

堆分为大根堆(父节点值不小于子节点值)和小根堆(父节点值不大于子节点值)

null

4、CB中的JavaBean利用

PropertyUtils.getProperty(new Person(),“name”);

自动调用Person对象里面的getName方法

PropertyUtils.getProperty(new TemplatesImpl(),“outputProperties”)

自动调用TemplatesImpl对象里面的getOutputProperties方法

Shiro 550 CB1 链分析

利用链流程:

**入口点:**PriorityQueue#readObject方法(java/util/PriorityQueue.java),PriorityQueue类中重写了readObject方法,Shiro反序列化时会调用这个类调用重写的readObject方法

null

步入 heapify()

null

跟进 siftDown

null

跟进 siftDownUsingComparator ,堆化操作(heapify)的具体实现,用 Comparator 来比较元素大小。

null

跟进 comparator#compare,Comparator<T> 是一个函数式接口,用来定义“两个对象谁大谁小”。

它不要求对象本身实现 Comparable,可以把比较规则外置。

返回值规则:

  • < 0 → o1 比 o2 小

  • 0 → 相等

  • > 0 → o1 比 o2 大

null

那么接下来就要找到哪里调用了这个接口:

关键点:BeanComparator.compare

BeanComparator继承了Comparator类和Serializable类,并且出现了PropertyUtils.getProperty()

null

null

那么,当执行 Object value1 = PropertyUtils.getProperty(o1, this.property);时,对其传参:

  • o1 = new TemplatesImpl()

  • property = outputProperties

  • 就会自动调用 TemplatesImpl#getOutputProperties 方法

关键点:getOutputProperties

找到 getOutputProperties:

null

执行:newTransformer().getOutputProperties();

null

跟进 newTransformer

null

跟进getTransletInstance

null

跟进 defineTransletClasses,当满足 _bytecodes !== null,向下执行 loader.defineClass(_bytecodes[i]) ,将_bytecodes[i]中的字节码转换为Class对象,并将该类加载执行。

null

总结调用链:

PriorityQueue#readObject(入口点 Source) -> heapify() -> siftDown() -> siftDownUsingComparator() -> comparator.compare()

-> BeanComparator.compare()

-> PropertyUtils.getProperty()

-> TemplatesImpl#getOutputProperties()(执行点 Sink) -> newTransformer() -> getTransletInstance() -> defineTransletClasses()

-> loader.defineClass()

参照图片:

null

null

总结条件:

  1. size值大于等于2;size >>> 1

  2. comparator != null

  3. this.property != null

  4. o1 = new TemplatesImpl()&this.property = outputProperties

  5. _name != null&_class == null

  6. _bytecodes != null

POC编写分析 :