前言
Apache Shiro是一个功能强大且灵活的开源安全框架,可以干净地处理身份验证,授权,企业会话管理和加密。
漏洞分析
当Shiro接收到来自未经身份验证的用户的请求时,如果cookie中携带了rememberMe字段,它将对其值进行Base64解码,AES解密,Java序列化(ObjectInputStream)反序列化等一系列命令。
但是,在Shiro <= 1.2.4的版本中,Shiro使用的AES解密密钥是固定的,默认值为kPH+bIxk5D2deZiIxcaaaA==。此时,如果利用特定的rememberMe值,可以利用该漏洞,执行远程代码。
尽管经过多个版本更新,官方为解决反序列化漏洞本身,而是将固定的key改为随机生成。所以,哪怕使用Shiro的最新版本,如果开发者使用自定义的方式替代随机生成的key或者使用网上一些开源代码,仍有可能存在该漏洞。
Shiro发现
通过利用Shiro提供的RememberMe功能。在请求的Cookie中设置rememberMe,值为简单的字符串。服务器在解析rememberMe时,会在base64解码时抛出异常,调用removeFrom在响应中设置rememberMe=deleteMe。
这种情况可以用来检测是否使用Shiro。
key检测和利用
如上文所示,当从cookie中检测到rememberMe的字段时,Shiro会进行解码解码反序列化操作。当这一系列操作成功的话,就会得到用户信息;失败时,会在响应中设置rememberMe=deleteMe。
因此,可以构造特定的payload与常用的key进行ASE加密,来检测key是否正确。在Shiro 1.4.2版本中,将ASE的加密方式从CBC改为了GCM,在检测时需要通过两种方式分别进行测试。以下的测试使用的为GCM的方式。
当使用错误的key时:
当使用正确的key时:
当知道了key之后,就可以通过反序列化漏洞来执行命令。
对远程服务器执行命令:
总结
当使用Apache Shiro时尽量使用高版本的Shiro,尽可能避免使用硬编码的key。当使用的开源项目中用到了Shiro,查看是否存在该漏洞。
—- END —-
来源:freebuf.com 2021-05-07 17:25:19 by: 南京聚铭网络
请登录后发表评论
注册