Java安全之Cas反序列化漏洞分析
2021-05-27 22:49
971 查看
Java安全之Cas反序列化漏洞分析
0x00 前言
某次项目中遇到Cas,以前没接触过,借此机会学习一波。
0x01 Cas 简介
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目,开源的企业级单点登录解决方案。
0x02 远程调试环境搭建
下载地址,将环境war包下载,部署到tomcat即可
tomcat目录bin文件下,
startup_debug.bat
call %EXECUTABLE%" start %CMD_LINE_ARGS%
改为
set JPDA_TRANSPORT=dt_socket set JPDA_ADDRESS=5005 set JPDA_SUSPEND=n call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%
IDEA中设置Remote远程调试5005即可完成。
0x03 漏洞分析
漏洞详情
4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。
- 影响版本 Apereo CAS <= 4.1.7
感觉上和Shiro的 ad8 550有点类似
解析流程分析
看web.xml得知,该项目基于Spring MVC开发。
上图请求路径是
/login的这里来直接找login的处理方法进行跟踪。
从web.xml中可见,交给了
DispatcherServlet去处理。
这时候可以查看springmvc的配置文件
cas-servlet.xml
注意
loginHandlerAdapter这个配置的bean,其中的属性有
supportedFlowId的值为"login",同时属性flowExecutor-ref的引用值为
loginFlowExecutor。
再看
loginFlowExecutor这个bean中所配置的登录流程属性引用值就是我们webflow上下文配置中的
loginFlowRegistry这个属性。
因此我们来看一下
loginHandlerAdapter这个bean对应的类为
org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter所起的作用,是如何来处理登录动作的。先来看一下这个类的父类
org.springframework.webflow.mvc.servlet.FlowHandlerAdapter,这个是Springmvc中的一个类。
FlowHandlerAdapter实现接口
HandlerAdapter,而
SelectiveFlowHandlerAdapter继承自
FlowHandlerAdapter。
SelectiveFlowHandlerAdapter类在
cas-server-webapp-actions模块下的
org.jasig.cas.web.flow包下。
因此Spring的DispatcherServlet找到要处理的
handleAdapter是
SelectiveFlowHandlerAdapte。并且根据地址http://localhost:8080/cas/login?service=XXX,得到handler的flowId="login",即流程:
loginFlowRegistry。
然后进入下面的handle方法,开始调取流程:
当有登录请求时,spring则会调用该
org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter
跟进
this.flowUrlHandler.getFlowExecutionKey(request)可见,该方法会获取请求中的
execution参数。
而后会进行调用
this.executionRepository.parseFlowExecutionKey(flowExecutionKey);获取到key。
跟进查看
可见从
execution参数,后分割UUID和
_后面部分,而后面部分进行base64解密。对返回id和data进行赋值,然后返回
ClientFlowExecutionKey对象
下面调用
this.executionRepository.getFlowExecution(key);,将刚刚获取到的
ClientFlowExecutionKey对象,即key变量传递。跟进。
这地方进行了数据的反序列化操作。先来看到构造方法,使用
AES/CBC/PKCS7加密方式,并且密钥使用默认的密钥进行加密。
而在解密后还会对数据进行解压缩
GZIPInputStream处理后进行反序列化。
漏洞复现与利用
根据以上数据解析分析,我们只需要将cas中加密部分扣出来,然后进行
GZIPOutputStream处理,而后将他进行base64加密,将处理后的gadgets加入到
execution参数里面即可,当然还需要构造一下前面UUID的值。
从github找到现成工具。
Reference
https://www.anquanke.com/post/id/1 111c 98842
0x04 结尾
除此外,还有一些值得探讨的地方例如,回显方式的构造
相关文章推荐
- Java安全之Shiro 550反序列化漏洞分析
- Java反序列化漏洞通用利用分析
- Commons Collections Java反序列化漏洞深入分析
- Java反序列化漏洞通用利用分析
- Java反序列化漏洞分析
- 【每日安全资讯】通过JBoss反序列化(CVE-2017-12149)浅谈Java反序列化漏洞
- Java反序列化漏洞分析
- Lib之过?Java反序列化漏洞通用利用分析
- Java反序列化漏洞通用利用分析
- Java反序列化漏洞分析
- java代码审计系列二:反序列化漏洞的分析
- JAVA Apache-CommonsCollections 序列化漏洞分析以及漏洞高级利用
- Lib之过?Java反序列化漏洞通用利用分析
- Lib之过?Java反序列化漏洞通用利用分析
- Lib之过?Java反序列化漏洞通用利用分析
- Java反序列化漏洞通用利用分析
- JAVA反序列化之Apache Commons Collections反序列化漏洞分析
- Java反序列化漏洞通用利用分析
- common-collections中Java反序列化漏洞导致的RCE原理分析
- JAVA Apache-CommonsCollections 序列化RCE漏洞分析