shiro漏洞复现--vulhub

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性,可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

Shiro反序列化漏洞(CVE-2016-4437,Shiro-550)

影响版本:Shiro <= 1.2.4

漏洞原理:

shiro框架在登录时,如果勾选了RememberMe的功能,关闭浏览器再次访问时便无需再次登录,此时cookie中会增加一个rememberMe字段,其
value 的值是经过序列化、AES加密和Base64编码后得到的结果。

服务端在接收到一个Cookie时,会按照如下步骤进行解析处理:

1.检索RememberMe Cookie的值
2.进行Base64解码
3.进行AES解码
4.进行反序列化操作

由于在第4步中的调用反序列化时未进行任何过滤,导致可以触发Java反序列化漏洞,进而在目标机器上执行任意命令。

由于使用了AES加密,利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为
kPH+bIxk5D2deZiIxcaaaA==,于是就可得到Payload的构造流程:

恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie

目前官方通过去掉硬编码的密钥每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。

漏洞复现:

直接使用集成工具即可

Shiro反序列化漏洞(CVE-2019-12422,Shiro721)

影响版本:Shiro < 1.4.2

漏洞原理:

和上面的 shiro550 差不多,只是 shiro721 用到的加密方式是 AES-CBC 加密,其中 AES 加密的 key
基本猜不到了,是系统随机生成的。但是这种加密模式可以通过 Padding Oracle Attack( Oracle 填充攻击 ),攻击者可以使用有效的
RememberMe Cookie 作为 Paddding Oracle Attack 的前缀,然后精心构造 RememberMe Cookie
来实施反序列化攻击。

这里的Oracle不是那个数据库,而是一种通过接收特定加密数据,解密并验证填充是否正确的方式。

攻击流程:

1.使用任意账户登陆目标网站,以获取一个合法的RememberMe Cookie
2.将获取的值作为POA的前缀
3.加密反序列化的payload来构造恶意RememberMe Cookie
4.将构造好的恶意数据填充到RememberMe Cookie字段中并发送

必要条件:合法的RememberMe Cookie(需认证一次)
漏洞环境:

使用 vulfocus 靶场的 shiro-721

漏洞复现:

直接使用集成工具即可

Shiro权限绕过漏洞(CVE-2020-1957)

影响版本:Shiro < 1.5.3

在 Apache Shiro 1.5.2
以前的版本中,在使用Spring动态控制器时,攻击者通过构造..;这样的跳转,可以绕过Shiro中对目录的权限限制。

漏洞原理:

Shiro框架使用拦截器对用户访问权限进行控制,常见的有如anon、authc等拦截器。

  • anon拦截器为匿名拦截器,无需登陆即可进行访问,一般用于静态资源。
  • authc为登陆拦截器,需要登陆才可以访问。

URL路径表达式通常为ANT格式。这个应用中对URL权限的配置如下:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
    chainDefinition.addPathDefinition("/logout", "logout");
    chainDefinition.addPathDefinition("/admin/**", "authc");
    return chainDefinition;
}



Ant格式:? 匹配一个字符

   * 匹配零个或多个字符串
   ** 配路径中的零个或多个路径

/**可以匹配路径,即可以匹配到/user/test/,而/*只能匹配到单个或多个字符串,即/user/test。

shiro会以分号将传入的URI进行截断,并将分号以及分号后面的数据进行清空,返回分号前面的URI数据,从而让/a/b;/c变为/a/b

Spring对于分号的处理方式与Shiro不同,Spring会先获取分号的位置,并检测分号后是否存在/,如果有,将/的位置记录在slashIndex变量中,并将分号前的数据与/之后的数据进行拼接,从而让/a/b;/c变为/a/b/c。返回处理后的requestURI。

由于Spring与Shiro的decodeAndCleanUriString方法不同,攻击者可以使用分号构造路径,绕过Shiro认证,并可以匹配Spring的动态控制器。

即URL请求过程:

客户端请求URL: /xxx/…;/admin/
Shrio内部处理得到校验URL为 /xxx/…,校验通过。
SpringBoot 处理 /xxx/…;/admin/,最终请求 /admin/,成功访问了后台请求。

漏洞复现:

http://192.168.200.142:8080/admin/
无法直接访问

http://192.168.200.142:8080/xxx/…;/admin/
绕过限制访问到后台
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccc_9wy

觉得写的好的话就赏杯奶茶喝吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值