Apache Shiro 反序列化漏洞 CVE-2016-4437 漏洞复现
什么是Shiro
Apache Shiro(简称 Shiro)是一个功能强大且易于使用的 Java 安全框架,用于身份验证、授权和加密等安全功能。它提供了一套统一的安全API,可以轻松地集成到Java应用程序中。
Shiro 的主要功能包括:
- 身份验证:Shiro 可以处理用户身份验证,支持各种常见的认证方式,如用户名/密码、LDAP、OAuth 等。它还提供了许多可插拔的身份验证 Realm,可以根据自己的需求进行定制。
- 授权:Shiro 提供了基于角色和权限的授权机制。您可以定义角色和权限,并在代码中进行简单的注解或编程式授权。Shiro 还支持细粒度的权限控制,可以对单个资源进行授权。
- 会话管理:Shiro 可以管理用户会话,支持不同的会话存储方式,如内存、数据库、Redis 等。它提供了会话管理和集群环境下的会话共享功能。
- 密码加密:Shiro 提供了对密码进行加密和散列的功能,可以确保用户密码的安全性。
Web集成:Shiro 提供了与 Java Web 技术的无缝集成,支持常见的 Web 框架,如Spring MVC、Struts等。
工作原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会将用户信息加密,
加密过程:用户信息 -> 序列化 -> AES加密 -> base64编码 -> Cookie中RememberMe。
如果用户勾选记住密码,那么在请求中会携带cookie,并且将加密信息存放在cookie的rememberMe字段里面,在服务端收到请求后,
解密过程:rememberMe -> base64解码 -> AES解密 -> 反序列化。
这个加密过程如果我们知道AES加密的密钥,那么我们把用户信息替换成恶意命令,就导致了反序列化RCE漏洞。
在shiro版本<=1.2.4中使用了默认密钥kPH+bIxk5D2deZiIxcaaaA==,这就更容易触发RCE漏洞。所以我们Payload产生的过程:
命令 -> 序列化 -> AES加密 -> base64编码 -> RememberMe
漏洞描述
| 漏洞 | 说明 |
|---|---|
| 受影响版本 | Apache Shiro <= 1.2.4 |
| 漏洞名称 | Shiro-550反序列化漏洞 |
| 漏洞编号 | CVE-2016-4437 |
| 危害等级 | 高危 |
| 漏洞类型 | RCE |
漏洞特征
shiro550反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段
漏洞复现
启动环境
解决docker拉不下来的问题:
sudo vim /etc/docker/daemon.json
#添加如下内容,第一个镜像网站管用
{
"registry-mirrors":[
"https://6kx4zyno.mirror.aliyuncs.com",
"https://hub.daocloud.io",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
启动docker
cd /vulhub-master/shiro/CVE-2016-4437
sudo docker -compose up -d
访问localhost:8080
判断框架
输入任意账号与密码,勾选RememberMe,点击登录,返回包set-Cookie会有rememberMe=deleteMe字段,说明使用了shiro框架,但是不知道版本。


漏洞验证
漏洞验证可以使用python脚本进行验证,第二种方式是使用相关工具进行验证。
方法一:
https://github.com/insightglacier/Shiro_exploit/tree/master
方法二:


修复建议
1、升级Apache Shiro高于1.2.4。
2、部署安全产品。
3、更换源码中的默认密钥。

浙公网安备 33010602011771号