Apache Shiro框架漏洞
Apache Shiro
Shiro框架描述
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。
Shiro框架直观、易用,同时也能提供健壮的安全性。
使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。
Shiro 1.2.4反序列化漏洞
漏洞描述
在Shiro <= 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中[密钥是写死在代码中的],当用户勾选RememberMe并登录成功,Shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中,服务端收到登录请求后,会对rememberMe的cookie值进行base64解码,接着进行AES解密,然后反序列化。由于AES加密是对称式加密(key既能加密数据也能解密数据),所以当攻击者知道了AES key后,就能够构造恶意的rememberMe cookie值从而触发反序列化漏洞。
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
rememberMe的流程为
1.序列化用户身份对象.:['java','-jar',fp,gadget,command]
2.对序列化后的数据进行AES加密,密钥为常量.encryptor = AES.new(base64.b64decode(CipherKey), mode, iv)
3.base64编码:base64.b64encode(iv + encryptor.encrypt(file_body))
4.设置到cookie中:requests.get(target,cookies={'rememberMe': payload.decode()},timeout=10)
shiro的解析流程:
1.读取cookie中的rememberMe的值. payload.decode()
2.base64解码.
3.AES解密
4.反序列化
第四点就触发像dnslog发送请求了.
特征判断:返回包中含有rememberMe=deleteMe字段
攻击成功的条件:
1.能够有对外的shiro功能
2.能够猜中框架的key值
Shiro key的获取方式
1.结合Dnslog与URLDNS
在进行漏洞探测的时候,一般会使用ysoserial-URLDNS-gadget结合dnslog进检测,其受JDK版本和相关的安全策略影响, 除非存在网络限制DNS不能出网。
通过判断dnslog是否收到对应的请求,判断漏洞是否存在。这是获取key比较实用方法,通过在dnslog域名前加对应key的randomNum,结合对应的dnslog记录,即可获取到应用对应的Shiro key了
2.利用时间延迟或报错
结合Dnslog与URLDNS方法有一个前提是DNS能出网。那么在不出网的情况下就需要找一个替代的方案了。结合SQL盲注的思路,可以考虑执行如下代码结合时间延迟进行判断,若系统是linux系统,则睡眠10s
try{ if(!(System.getProperty("os.name").toLowerCase().contains("win"))){ Thread.currentThread().sleep(10000L); } } catch(Exception e){}
1
3.结合CookieRememberMeManaer
4.利用JRMP协议
5.依赖shiro自身进行key检测
漏洞复现
1、页面存在remember me,抓包查看是否有rememberMe=deleteMe字段
2、工具利用
命令执行
Apache Shiro 认证绕过漏洞
CVE-2020-1957
Apache Shiro1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。
anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符表示匹配零个或多个字符串,比如:/可以匹配/hello,但是匹配不到/hello/,因为*通配符无法匹配路径。
假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。
漏洞复现
访问admin路径时,状态码为302
访问/xxx 不存在的路径时,状态码404
两个路径组合时,状态码404
当路径为/xxx/..;/admin/时,状态为200
登录成功,认证权限绕过
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论