任意代码执行 socketFactory/socketFactoryArg
跟着大佬的调用栈一步步分析
首先在Driver的connect方法处下个断点
为什么会有这种攻击方法呢,因为正常情况下,有shiro必定会有CB依赖,而不一定会有CC依赖,所以CB攻击比起之前的cc链攻击肯定是更加有效的。
尝试对之前的CB链修改生成payload
安全(权限)框架
。认证
,授权
,加密
,会话管理
,Web集成
,缓存
等.Shiro有三大核心组件,即Subject
、SecurityManager
和 Realm
认证主体
。应用代码直接交互的对象是Subject,Subject代表了当前的用户。包含Principals
和Credentials
两个信息。安全管理员
。是Shiro架构的核心。与Subject的所有交互都会委托给SecurityManager, Subject相当于是一个门面,而SecurityManager才是真正的执行者。它负责与Shiro 的其他组件进行交互。一个域
。充当了Shiro与应用安全数据间的“桥梁”。Shiro从Realm中获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm中获取相应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能过进行,可以把Realm看成DataSource,即安全数据源。Authentication
: 身份认证、登录,验证用户是不是拥有相应的身份;
Authorization
:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,即判断用户能否进行什么操作,如:验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限!
Session Manager
: 会话管理,即用户登录后就是第-次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通的JavaSE环境,也可以是Web环境;
Cryptography
: 加密,保护数据的安全性,如密码加密存储到数据库中,而不是明文存储;
Web Support
: Web支持,可以非常容易的集成到Web环境;
Caching
: 缓存,比如用户登录后,其用户信息,拥有的角色、权限不必每次去查,这样可以提高效率
Concurrency
: Shiro支持多线程应用的并发验证,即,如在一个线程中开启另一个线程,能把权限自动的传播过去
Testing
:提供测试支持;
RunAs
:允许一个用户假装为另-一个用户(如果他们允许)的身份进行访问;
Remember Me
:记住我,这个是非常常见的功能,即一-次登录后, 下次再来的话不用登录了
从外部来看Shiro,即从应用程序角度来观察如何使用shiro完成工作: Subject 用户,SecurityManager管理所有用户 Realm连接数据
subject
: 应用代码直接交互的对象是Subject, 也就是说Shiro
的对外API核心就是Subject
, Subject代表了当前的用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subject的所有交互都会委托给SecurityManager; Subject其实是一一个门面, SecurityManageer 才是实际的执行者。SecurityManager
: 安全管理器,即所有与安全有关的操作都会与SercurityManager
交互, 并且它管理着所有的Subject,可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC的DispatcherServlet的角色Realm
: Shiro从Realm获取安全数据 (如用户,角色,权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较,来确定用户的身份是否合法;也需要从Realm
得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以把Realm看DataSource;以spring boot的配置搭建shiro
1 | <!DOCTYPE html> |
1 | package com.example.shiro.controller; |
启动spring boot
Subject:用户
SecurityManager:管理所有用户
Realm:连接数据
1 | <dependency> |
1 | package com.example.shiro.config; |
在templates目录下创建user目录编写html页面,add.html,update.html
1 | <!DOCTYPE html> |
1 | package com.example.shiro.controller; |
1 | <!DOCTYPE html> |
1 | <!DOCTYPE html> |
1 | @RequestMapping("/toLogin") |
anon:无需认证就可以访问
authc:必须认证了才能让问
user:必须拥有,记住我功能,才能访问
perms:拥有对某个资源的权限才能访问
role:拥有某个角色权限才能访问
1 | @Controller |
© 2024 ycxlo
URLDNS
是ysoserial
中的一条利用链,通常用于检测是否存在Java
反序列化漏洞,该利用链具有如下特点
1 | URLDNS 利用链只能发起 DNS 请求,并不能进行其它利用 |
Rome主要是用于解析RSS与Atom元数据的框架
1 | RSS:RSS 是一种用于发布和订阅网站内容的 XML 格式。它允许网站所有者将更新的内容以结构化的方式提供给订阅者。通过使用 RSS,用户可以通过 RSS 阅读器或其他应用程序来获取网站的最新文章、新闻、博客等内容,而无需直接访问网站。 |
之所以会提到CommonsBeanutils的反序列化链,是因为shiro是依赖commons-beanutils的,当然这是接下来学习的东西的。
根据名字就知道,类似Commons-Collections是对集合的封装和补充,commons-beanutils是应用于javabean的工具。
至于什么是JavaBean,放一下维基百科的定义,很简单:
第二条说白了就是属性都有访问器和更改器。而commons-beanutils中提供了一个静态方法 PropertyUtils.getProperty
,让使用者可以直接调用任 意JavaBean
的getter
方法
1 | PriorityQueue.readObject()-> |
它是对JavaBean进⾏操作的⼯具类,可单独为某个属性进⾏值的操作的⼯具类。它利⽤反射操作Bean的属性
⼀个简单的JavaBean
1 | package main.java.CommonsBeanutils; |
PropertyUtils类下提供了⼀些静态⽅法,以⽅便开发者直接调⽤⼀些getter和setter⽅法:
1 | package main.java.CommonsBeanutils; |
输出234
PropertyUtils类中的方法就是调用相关属性的getter和setter方法
前面和后面和cc链2基本一致,我们主要看从BeanComparator开始
首先判断property属性是否为null,由于我们等会会对其进行赋值,肯定是不为null,然后调用property属性的getter方法,我们这里将其赋值为_outputProperties属性
跟进TemplateImpl类
调用newTransformer()方法,后面也就和cc链2基本一致了
1 | package main.java.CommonsBeanutils; |
成功弹出计算器
© 2024 ycxlo
上面 CC2 说了因为 CommonsCollections4 除4.0的其他版本去掉了 InvokerTransformer 的 Serializable 继承,导致无法序列化。所以我们是否可以不使用 InvokerTransformer 呢?于是便有了 CC4,其实cc链4就是cc2链中InvokerTransformer替换为 InstantiateTransformer,看起来有点类似cc2与cc3的结合
这里我们又回到了去触发 LazyMap.get(),只不过我们改变了 LazyMap.get() 的触发方式,不再和 CC1 和 CC3 一样借助 AnnotationInvocationHandler 的反序列化触发。
CC1链在实际利用过程存在一些限制,例如jdk8u71版本已经无法利用反序列化漏洞了,通过分析发现jdk8u71版本中改写了sun.reflect.annotation.AnnotationInvocationHandler类的readObject方法,CC1链在jdk8u71版本以上已经被修复了,因此jdk8u71版本重新构造了一条新的利用链(CC2链)
不过CC2链使用了apache commons collections组件4.0版本来进行构造,并没有使用3.1版本,首先 CommonsCollections3 中无法使用,因为其 TransformingComparator 无法序列化。其次只有 CommonsCollections4-4.0 可以使用,因为 CommonsCollections4 其他版本去掉了 InvokerTransformer 的 Serializable 继承,导致无法序列化。