Shiro_认证绕过漏洞复现:原理详解+环境搭建+渗透实践(CVE-2020-1957)
目录
一、Shiro_认证绕过漏洞(CVE-2020-1957)
1、漏洞简介
2、漏洞原理
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
2、下载 Vulhub
3、进入漏洞环境
4、启动漏洞环境
5、查看环境状态
三、渗透实战
1、访问环境
2、构造Payload
本文通过vulhub靶场的Shiro认证绕过漏洞关卡讲解Shiro认证漏洞原理(CVE-2020-1957)、渗透环境搭建与渗透全流程。
一、Shiro认证绕过漏洞(CVE-2020-1957)
1、漏洞简介
CVE-2020-1957 是 Apache Shiro 框架中一个身份验证绕过漏洞。攻击者通过构造特殊的请求 URL,可以绕过 Shiro 的权限控制,直接访问本应受保护的资源。
漏洞特征 | 描述 |
---|---|
漏洞编号 | CVE-2020-1957 |
漏洞类型 | 身份验证绕过 (Authentication Bypass) |
影响组件 | 与 Spring 框架集成的 Apache Shiro 应用 |
受影响版本 | Apache Shiro < 1.5.2 (部分利用方式影响至 1.5.0 之前版本) |
CVSS 评分 | 7.5 (高危) |
漏洞披露时间 | 2020年3月23日 |
2、漏洞原理
该漏洞的根源在于 Shiro 和 Spring 框架对 URL 的解析和处理存在差异(即"差异化解析")。Shiro 的权限拦截器在判断是否需要对一个 URL 进行认证时,其解析方式可能与后续 Spring 处理该请求时的解析方式不同。攻击者正是利用这种差异,构造特殊的 URL 使得 Shiro 认为该请求不需要认证,但 Spring 最终却将其路由到需要认证的控制器(Controller)上,从而绕过安全检测。两种主要的绕过方式:
-
斜杠 (
/
) 绕过(CVE-2020-11989 等):在 Shiro 旧版本(如 1.5.0 之前)中,若配置的权限规则为/admin/*
,Shiro 的 Ant 风格路径匹配器认为此规则不匹配像/admin/xxx/
这样以斜杠结尾的路径。但 Spring 框架却可能将/admin/xxx/
和/admin/xxx
视为相同的路径。因此,访问http://example.com/admin/protected/
(注意末尾斜杠)可能绕过 Shiro 认证。 -
分号 (
;
) 绕过(CVE-2020-1957):这是 CVE-2020-1957 的主要攻击方式。对于包含;
的 URL(如/xxx/..;/admin/
),Shiro 与 Spring 的处理流程截然不同:- Shiro 的处理流程:
- 分号截断:通过WebUtils.getRequestUri()调用decodeAndCleanUriString,将分号后的内容截断,仅保留/xxx/..。
- 路径标准化:调用normalize()处理/./和/../,最终得到/xxx(假设/xxx无需认证)。
- Spring 的处理流程:
- 分号移除:通过UrlPathHelper的removeSemicolonContent方法,移除分号及其后的内容,得到/xxx/../admin。
- 路径解析:Spring 将/xxx/../admin解析为/admin,并匹配对应的路由(如/admin需认证)。
- Shiro 的处理流程:
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
本文使用Vulhub复现Shiro_认证绕过漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。
# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker
2、下载 Vulhub
将 Vulhub 项目克隆到本地,具体命令如下所示。
git clone https://github.com/vulhub/vulhub.git
cd vulhub
3、进入漏洞环境
Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。
# 进入Shiro认证绕过漏洞(CVE-2020-1957)的漏洞环境目录
cd shiro
cd CVE-2020-1957
4、启动漏洞环境
在CVE-2020-1957目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。
docker-compose up -d
如下所示命令执行后,Docker 会完成拉取一个包含shiro:1.5.1(受影响版本)的镜像。
5、查看环境状态
使用 docker ps 命令确认容器启动状态,如下所示当前运行的容器b9873c409e8e属于 Vulhub 搭建的CVE-2020-1957漏洞复现环境(容器名均为 CVE-2020-1957)。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9873c409e8e vulhub/shiro:1.5.1 "java -jar /shirodem…" 6 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp cve-2020-1957_web_1
字段 | 值 | 解释 |
---|---|---|
容器 ID | b9873c409e8e | 此容器的唯一标识符(通常为完整哈希的前12位)。用于执行针对此容器的命令(如 docker exec -it b9873c409e8e bash 进入容器)。 |
镜像 | vulhub/shiro:1.5.1 | 此容器是从哪个镜像创建的。vulhub/shiro:1.5.1 是 Vulhub 项目专门为复现此漏洞构建的镜像,它包含了一个存在 CVE-2020-1957 漏洞的 Apache Shiro 1.5.1 版本的演示应用。 |
命令 | "java -jar /shirodem…" | 容器启动时运行的初始命令。这里被截断了,完整命令很可能是 java -jar /shiro-demo.jar 或类似内容。这表明容器启动了一个 Java 应用程序,运行了一个打包好的 JAR 文件,这个 JAR 文件就是存在漏洞的 Shiro 演示应用。 |
创建时间 | 6 minutes ago | 容器是在 6 分钟前被创建(docker-compose up )的。 |
状态 | Up 5 minutes | 容器已运行了 5 分钟,Up 状态表明容器正在正常运行中,可以提供服务。 |
端口 | 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp | • 0.0.0.0:8080->8080/tcp : 将容器内部的 8080 端口映射到了宿主机的所有网络接口(IPv4)的 8080 端口。• :::8080->8080/tcp : 同上,但针对的是 IPv6 地址。结论:你可以在宿主机上通过 http://localhost:8080 或 http://<宿主机IP>:8080 来访问这个存在漏洞的 Shiro 应用。 |
名称 | cve-2020-1957_web_1 | 容器的名称。这个名字是由 Docker Compose 自动生成的,格式通常是 {目录名}_{服务名}_{序号} 。 web 是在 docker-compose.yml 文件中定义的服务名称。 |
三、渗透实战
1、访问环境
访问 启动bp,浏览器开启bp代理,访问http://192.168.59.128:8080即可进入shiro渗透环境,如下所示。
访问http://192.168.59.128:8080/admin,网页被重定向到登陆页面 。
http://192.168.59.128:8080/login.html
2、构造Payload
构造payload:/xxx/..;/admin/,成功绕过验证进入到admin账户页面。
http://[目标机IP]:[端口号]/xxx/..;/admin/
以我的环境为例,IP地址为192.168.59.128,端口号为8080,访问网页。
http://192.168.59.128:8080/xxx/..;/admin/
如下所示,认证机制被绕过,浏览器上看到的是登录成功页面。