🍨 Shiro 身份验证绕过 (CVE-2020-13933)
Apache Shiro框架提供了记住我(RememberMe)的功能,关闭浏览器再次访问时无需再登录即可访问。shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。服务器端识别身份解密处理cookie的流程则是:
获取rememberMe cookie ->base64 解码->AES解密(加密密钥硬编码)->反序列化(未作过滤处理)。但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都可能会导致该漏洞的产生.硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中。如果在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段,那么就可能存在此漏洞。
Apache Shiro <= 1.2.4
输入任意账号密码,勾选Remember me,登录,查看发现响应包中存在rememberMe=deleteMe字段,说明可能存在Shiro反序列化漏洞,利用综合利用工具进行测试,进行秘钥爆破。
由于Apache Shiro cookie中通过AES-128-CBC模式加密的rememberMe字段存在问题,用户可通过Padding Oracle加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精⼼制作rememberMe来进⾏反序列化攻击。Tip:在1.2.4版本后,shiro已经更换AES-CBC为AES-GCM,无法再通过Padding Oracle 遍历 key
Apache Shiro <= 1.4.1
利用工具的攻击方法同Shiro550一致,下面简单讲述手动攻击的步骤
🍬(1)利用技巧
🍼 该漏洞需要登录后获取到合法的Cookie: rememberMe=XXX后才可以进行利用, 看起来不是很好利用 但实际上有一些网站是开放注册的, 而且这个洞不需要知道服务端密钥 所以后续的利用还是可以同Shiro-550一样利用, 而且这里是AES加密的, 自带过WAF属性 ;
🍼 如果攻击没有生效, 可以试一下删除Cookie中的JSESSIONID 字段, 很多时候这个字段存在的话, 服务端不会去处理 rememberMe。
🍬(2)攻击流程
🍼 登录网站(勾选Remember),并从Cookie中获取合法的RememberMe。
🍼 使用RememberMe cookie作为Padding Oracle Attack的前缀。
🍼 加密 ysoserial 的序列化 payload,以通过Padding Oracle Attack制作恶意RememberMe。
🍼 重放恶意RememberMe cookie,以执行反序列化攻击。
在Apache Shiro 1.5.2以前的版本中,在使用Spring动态控制器时,攻击者通过构造`..;`这样的跳转,可以绕过Shiro中对目录的权限限制。
Apache Shiro <= 1.5.2
直接请求管理页面/admin/,无法访问,将会被重定向到登录页面;构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面。
Apache Shiro身份验证绕过漏洞CVE-2020-11989的修复补丁存在缺陷,在1.5.3及其之前的版本,由于shiro在处理url时与spring仍然存在差异,依然存在身份校验绕过漏洞由于处理身份验证请求时出错,远程攻击者可以发送特制的HTTP请求,绕过身份验证过程并获得对应用程序的未授权访问。
Apache Shiro < 1.6.0
访问后台时,通过路径/admin/或者/login/均无法进入后台,返回404或者提升需要登录,通过构造特殊的payload即可绕过验证,登录后台
payload:http://ip/admin/%3bxxx(不要xxx或者替换为其他字母也可以)