Java审计之CMS中的那些反序列化漏洞

摘要:
Java审计:CMS中的反序列化漏洞0x00在春节期间很无聊。我找到了一组源代码审计,并找到了几个有趣的地方与大家分享。这里,xstream。调用fromXML进行反序列化。现在让我们看看lib文件夹下的组件实际上有cccb和其他组件,并且该组件的反序列化漏洞在版本范围内。0x02Shiro反序列化漏洞在未找到最后一点后开始改变想法。Java Security Shiro550反序列化漏洞分析但是只要能够找到配置的密钥,Shiro的加密过程就可以被伪造,小工具可以被发送去反序列化以实现命令执行。
Java审计之CMS中的那些反序列化漏洞

0x00 前言

过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下。

0x01 XStream 反序列化漏洞

下载源码下来发现并不是源代码,而是一个的文件夹,里面都已经是编译过的一个个class文件。

在一个微信回调的路由位置里面找到通过搜索类名 Serialize关键字找到了一个工具类,并且参数是可控的。

Java审计之CMS中的那些反序列化漏洞第1张

Java审计之CMS中的那些反序列化漏洞第2张

Java审计之CMS中的那些反序列化漏洞第3张

Java审计之CMS中的那些反序列化漏洞第4张

这里调用xstream.fromXML(xml)进行反序列化。

而下面这个看了一下lib文件夹下面的组件其实是有着cc cb等组件,并且这个组件的反序列化漏洞是在版本范围内。

Java审计之CMS中的那些反序列化漏洞第5张

找到路由位置,发现访问页面的时候显示API 什么的错误。POC打过去没有任何响应。这个点弄了比较久没弄出来,暂且留着。

0x02 Shiro反序列化漏洞

上次的点没弄出来后,开始转换思路。再次从web.xml入手

Java审计之CMS中的那些反序列化漏洞第6张

发现这里加载了一下配置文件,从中还发现了shiro的配置文件,前面还真没注意到。

Java审计之CMS中的那些反序列化漏洞第7张

并且在lib的组件找到了这个shiro组件,但是发现这个是1.3版本的。而shiro 550漏洞的版本是在1.2.4,但是问题就来了,不在漏洞版本内就是不能打了嘛?其实不是的。

Shiro 1.2.4及之前的版本中,AES加密的密钥默认硬编码在代码里(SHIRO-550),Shiro 1.2.4以上版本官方移除了代码中的默认密钥,要求开发者自己设置,如果开发者没有设置,则默认动态生成,降低了固定密钥泄漏的风险。

回头再来看看上次分析的shiro550的细节

Java审计之CMS中的那些反序列化漏洞第8张

这里key是定义在代码里面的,定义死的。

Java安全之Shiro 550反序列化漏洞分析

但是只要能找到他配置的密钥就能伪造Shiro的加密流程发送gadget进行反序列化,从而达到命令执行。

这里找到web.xml加载的这个配置文件翻找了一下还真找到了密钥。这里密钥配置的不是随机密钥。

Java审计之CMS中的那些反序列化漏洞第9张

那么这里还需要找的一点是漏洞地址在哪里,也就是shiro作用于哪个地方,一般使用shiro都是将这些东西托管给shiro做权限控制,而在做权限控制的时候同时也需要配置到一些后台的登录地址,这里是从配置文件上方找到了这个地址。

Java审计之CMS中的那些反序列化漏洞第10张

配置对应的key值拿到工具里面跑一下

Java审计之CMS中的那些反序列化漏洞第11张

以上是xml文件的配置方式的审计方法,当然部分cms也会采用一个config类来进行配置。同理还是找到配置类然后看密钥

Java审计之CMS中的那些反序列化漏洞第12张

这里Config配置Shiro的本地没环境,找了一个网上的图。

漏洞修复

其实修复起来也很简单,只需要使用随机密钥就好了。

 <bean   class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey" value="#{T(com.nova.framework.modules.sys.security.GenerateCipherKey).generateNewKey()}"></property>
    </bean>

0x03 结尾

整体的其实还是比较简单,但是在XStream这个洞里面远程调试的环境不知道为啥一直搭不好,不知道是环境问题还是啥,断点停不下来。总的来说其实还是有源代码审起来舒服,环境只要一搭建好就能本地调试下断点。

免责声明:文章转载自《Java审计之CMS中的那些反序列化漏洞》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python pytest fixture夹具Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot整合Redis乱码原因及解决方案

问题描述:springboot使用spring data redis存储数据时乱码 redis key/value 出现xACxEDx00x05tx00x05 问题分析: 查看RedisTemplate类 JdkSerializationRedisSerializer类 SerializingConverter类 DefaultSerialize...

SpringBoot + Shiro实现当前在线人数统计

实现思路 数据库中添加用户是否登录is_login字段,用来记录用户的登录状态,假设1表示在线;0表示未在线,则需要进行控制: 1)当用户登录成功时,设置用户登录状态为1 2)当用户退出登录时,设置用户登录状态为0 3)当session失效时,设置对应的用户的登录状态为0 实现方法 1、更改数据库字段,编写登录状态更新函数 添加字段后,编写状态更新函数 /...

rest-framework框架——视图三部曲

一、mixins类编写视图 1、配置url urlpatterns = [ ... re_path(r'^authors/$', views.AuthorView.as_view(), name="author"), re_path(r'^authors/(?P<pk>d+)/$', views.AuthorDet...

drf序列化组件

一. 序列化组件介绍# Copy 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能 二. 简单使用# 步骤: Copy 1. 写一个序列化的类,继承Serializer 2....

【深入浅出SpringBoot】RedisTemplate使用方法归纳

一.介绍 RedisTemplate是Spring Data Redis提供给用户的最高级的抽象客户端,用户可直接通过RedisTemplate进行多种操作,那么,我们先来看看RedisTemplate封装了哪些操作。下面这列表是RedisTemplate的继承关系和所有方法(已过滤重载方法,共有81个方法) (1) 类继承关系 //RedisAccess...

C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案

C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案 1、DataContract继承对子类进行序列化的解决方案 第一种是在 [DataContract, KnownType(typeof(继承的子类))]添加 KnownType(typeof(继承的子类))即可,第二种是在序列化的时候,添加类型 DataContractSe...