探索 Shiro RememberMe 漏洞的研究与检测

前言

Shiro作为Apache旗下的一个开源框架,用于权限管理,提供了身份验证、授权、密码套件和会话管理等功能。 然而,在2016年,Shiro报告了一个著名的漏洞——Shiro-550,即RememberMe反序列化漏洞。 经过四年,该漏洞并没有随着时间的流逝而消失,反而凭借其绕过WAF的特性逐渐升温。 面对这一备受关注的漏洞,本文将探讨如何从零开始实现该漏洞的自动化检测。

漏洞成因

使用Shiro框架的Web应用,登录成功后用户信息会被加密存储在Cookie中,以实现“记住我”的功能。 然而,在Cookie读取过程中存在一个使用AES解密Cookie值的过程。 如果秘钥泄露且Cookie值是由攻击者构造的恶意Payload,就可以触发危险的Java反序列化。 在Shiro 1.2.4及之前的版本中,Shiro的秘钥是硬编码的一个值。 这个漏洞不仅存在于1.2.4版本,而且后续版本的读取流程也没有改动,因此仍然存在高危风险。 有趣的是,许多程序员习惯性地复制粘贴,将一些示例代码直接复制到项目中,包括设置秘钥的代码,这为安全人员提供了可乘之机。

图片[1]-探索 Shiro RememberMe 漏洞的研究与检测-山海云端论坛

反序列化利用链提炼

Java反序列化漏洞涉及利用链的讨论。 我们发现ysoserial中Commons相关的利用链都是按照一定模式出现的。 我将原有的CommonsCollections1~7浓缩提炼,形成了新的4条利用链。 这4条链不仅可以完整覆盖原有的7条链支持的场景,还可以在一些特殊的场景中发挥作用。

无心插柳的反序列化防护

Shiro最终反序列化调用的地方不是常见的ObjectInputStream().readObject,而是用ClassResolvingObjectInputStream封装了一层。 这导致一些利用链不可用。 然而,这一无心插柳的行为阻挡了无数次的反序列化攻击。 有些利用链由于采用了TemplatesImpl作为终点,避开了这个限制,才使得这个漏洞在渗透测试中有所应用。

图片[2]-探索 Shiro RememberMe 漏洞的研究与检测-山海云端论坛

东风何处来

为实现Shiro反序列化漏洞的可靠检测,我们可以借助TemplatesImpl实现任意代码执行,仅需一行代码就可以实现一个HTTP反连的Payload。 这种方法在目标网站无法出网时非常有用。 另一种常用的方法是利用URLDNS这个利用链,其反连基于DNS请求。 此外,使用JRMP相关的方法也是一种常见的实践。 然而,这些方法在目标站点部署了RASP等主机防护手段时可能无法使用。 因此,漏洞回显是解决这个问题的不二法门。

更上一层楼

探测Shiro Key是检测Shiro漏洞的关键一步。 如果探测成功,则可枚举出秘钥,提高了漏洞检测的下限。 借助这种方法,我们可以将Shiro的检测拆分为两步:探测Shiro Key和利用得到的Shiro Key尝试Tomcat回显。 其中,Shiro Key探测不受环境影响,而Tomcat回显是受环境限制的。 通过结合这两种方法,我们可以提高漏洞检测的效率和准确性。

这些方法的发现和优化,将为Shiro RememberMe漏洞的检测和防护提供更加有效的手段,为网络安全事业贡献一份力量。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容