在一些面试以及攻防对抗中,总会碰到shiro反序列化的命令执行,于是给大家简单的科普一下。
Apache Shiro是一款开源企业常见JAVA安全框架,此框架提供了RememberMe的功能,这是很多网站都具备的,例如你登录了一个网站,关掉浏览器再次打开网站时,网站会保留你的登录信息情况。
首先,shiro处理cookie的流程是先得到rememberMe的cookie值,然后Base64解码,AES加密,最后反序列化。但是AES的密钥是硬编码的,攻击者可以通过构造payload造成反序列化的命令执行。
硬编码:硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。 硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,尽管可以使用调试器或十六进制编辑器在内存或磁盘上进行更改。
shiro反序列化的影响范围是1.2.4及以下版本,同时特征十分明显,使用burp抓包后响应包中会有一条set-cookie
Set-Cookie:rememberMe=deleteMe;
看到这行语句后直接扔到ShiroScan里跑一下
下载地址:https://github.com/sv3nbeast/ShiroScan
结合dnslog.cn即可确定是否存在shiro反序列化漏洞
漏洞修复建议:此处参考https://blog.csdn.net/weixin_44578334/article/details/105821240
先说结论:无论是否升级shiro到1.2.5及以上,如果shiro的rememberMe功能的AES密钥一旦泄露,就会导致反序列化漏洞。
升级shiro到1.2.5及以上如果在配置里配置了密钥,那么请一定不要使用网上的密钥,一定不要!!请自己base64一个AES的密钥,或者利用官方提供的方法生成
总结
标准的AES的加解密只跟私钥key和加密模式有关,和IV无关。
为了证明反序列化漏洞确实存在,可以利用ysoserial的URLDNS gadget进行验证,但是默认会有TTL缓存机制,默认10s。
反序列化导致的命令执行需要两个点:
readObject()反序列化的内容可控。
应用引用的jar包中存在可命令执行的Gadget Chain。