点我

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字段

image-20221222211732977

2、工具利用

image-20221222211813351

命令执行

image-20221222211827766

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

image-20221222212929767

访问/xxx 不存在的路径时,状态码404

image-20221222213002002

两个路径组合时,状态码404

image-20221222213041614

当路径为/xxx/..;/admin/时,状态为200

image-20221222213118468

登录成功,认证权限绕过

image-20221222213135594

分类: WEB安全

评论

-- 评论已关闭 --

目录