作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/fEhzBTl3SVVE072ubwi6EA

前言

在上篇分析CVE-2022-26135Atlassian Jira Mobile Plugin SSRF漏洞之后,發現在此之前,jira也曾爆出過身份驗證繞過漏洞,CVE編號為cve-2022-0540。趁著環境還熱乎,對其產生的原理和代碼進行一波分析和學習。

漏洞描述

Atlassian Jira是澳大利亞Atlassian公司的一套缺陷跟蹤管理系統。該系統主要用于對工作中各類問題、缺陷進行跟蹤管理。攻擊者可利用此漏洞向目標系統發送特制的HTTP請求,以使用受影響的配置繞過 WebWork 操作中的身份驗證和授權要求。

利用范圍

Jira

  • Jira 所有版本 < 8.13.18
  • Jira 8.14.x、8.15.x、8.16.x、8.17.x、8.18.x、8.19.x
  • Jira 8.20.x < 8.20.6
  • Jira 8.21.x

Jira Service Management

  • Jira Service Management 所有版本 < 4.13.18
  • Jira Service Management 4.14.x、4.15.x、4.16.x、4.17.x、4.18.x、4.19.x
  • Jira Service Management 4.20.x < 4.20.6
  • Jira Service Management 4.21.x

漏洞分析

環境搭建

本次環境使用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  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 ${CATALINA_OPTS}"' >> /opt/atlassian/jira/bin/setenv.sh

5005為idea debug端口;atlassian-agent.jar項目地址:https://github.com/hgqapp/atlassian-agent,使用maven編譯為jar文件即可。

后續創建容器根據提示配置。

圖片

調試源碼:將以下三個文件夾設置為Libraries。

\atlassian-jira-software-8.13.17-standalone\lib
\atlassian-jira-software-8.13.17-standalone\atlassian-jira\WEB-INF\classes
\atlassian-jira-software-8.13.17-standalone\atlassian-jira\WEB-INF\lib

前置知識

在漏洞分析之前,先簡單了解一下Jira相關的背景知識。

WebWork

Jira使用MVC框架WebWork來處理用戶發起的WEB請求。每個請求都是使用WebWork action來處理,在其中又使用了其他的utility and Manager classes來完成一個任務。作為響應返回給客戶端的HTML大部分都是View層的JSP生成的。URL中的”.jspa”后綴標識其后端對應的是一個JSP文件。

Seraph

Seraph是一個開源認證框架,主要由Atlassian開發和維護。Jira、Confluence的登錄認證是都由Seraph來負責的。Seraph是通過Servlet的Filter實現的。Seraph的功能只是用來在給定一個Web請求的情況下,將該請求與特定用戶相關聯。

動態分析

通過前置知識可以了解到Seraph是一個開源認證框架,也是jira核心身份驗證機制。Seraph是通過Servlet和Filter實現的。

查看Filter,發現com.atlassian.jira.security.JiraSecurityFilter.class

在doFilter中調用父方法super.doFilter

圖片

com.atlassian.seaph.filter.SecurityFilter#doFilter

這里處于atlassian-seaph-4.0.4.jar中filter也就是seraph過濾器,它會根據請求用戶權限進行判斷,進一步確定所需要的角色,確定是否需要認證。

圖片

持續跟進,發現會通過循環會出現三種Service

JiraPathService

圖片

JiraPathService是處理:如果請求的 servlet 路徑以 /secure/admin/ 開頭,那其角色權限必須是admin(管理員權限)。

圖片

WebworkService

圖片

WebworkService則是在actions.xml文件中獲取角色所需要的webwork配置。

圖片

經過調試,會多次進入getRequiredRoles函數,其中獲取URl的方式為getRequestURL。

圖片

繼續跟進發現在通過getRequestURL方式提取請求URL后,會通過提取最后一個/后面的接口產生一個targetURL,這里傳入的是/secure/InsightPluginShowGeneralConfiguration.jspa,而targetURL為/InsightPluginShowGeneralConfiguration.jspa

圖片

JiraSeraphSecurityService

圖片

繼續往下就是第三個服務JiraSeraphSecurityService,作用是在所有插件的 atlassian-plugin.xml 文件中獲取角色所需的 webwork 操作配置。

圖片

在跟進JiraSeraphSecurityService時,發現會調用WebworkPluginSecurityServiceHelper.getRequiredRoles,和WebworkService.getRequiredRoles代碼是相同的。

圖片

接口權限必須是admin。

圖片

在com.atlassian.jira.web.dispatcher.JiraWebworkActionDispatche中會對jspa進行處理。

service函數會從請求中獲取Action名稱,后續使用/和。jspa切割字符來獲取ActionName。

圖片

圖片

在webwork.dispatcher.GenericDispatcher#executeAction函數,會對Action進行檢查。

圖片

系列Action工廠。

圖片

如上分析,其實目前已經知道在Filter中提取URL的方法是getRequestURL,在Servlet中使用getServletPatch。

在URL加入上“;”,傳入/secure/InsightPluginShowGeneralConfiguration.jspa;那么在Filter中無法找到InsightPluginShowGeneralConfiguration.jspa;對應的Action,后續進入Servlrt處理,而getServletPath會將;刪除,這樣也就繞過了Filter層的認證。

圖片

但實際效果上,這樣還需要進行驗證才能訪問資源。

圖片

繼續動態調試發現。

在LookupAliasActionFactoryProxy同樣進行了權限檢查。

圖片

參考了其他大佬分析的文章,了解到在編寫插件的時候可使用webwork1元素添加roles-required屬性。這里直接使用受影響的插件insight8.9.10進行復現。

添加角色屬性可參考https://developer.atlassian.com/server/jira/platform/webwork/

漏洞復現

在官網上下載插件Insight8.9.10版本。

圖片

圖片

上傳成功后,在未登錄的情況下,訪問/secure/InsightPluginUpdateGeneralConfiguration.jspa;

圖片

成功繞過登錄認證限制。

修復建議

受影響用戶可將產品更新至最新安全版本,具體參考官網公告: https://jira.atlassian.com/browse/JRASERVER-73650

參考材料

1.https://jira.atlassian.com/browse/JRASERVER-73650 2.https://developer.atlassian.com/server/jira/platform/webwork/ 3.https://marketplace.atlassian.com/apps/1212137/insight-asset-management/version-history 4.https://blog.viettelcybersecurity.com/cve-2022-0540-authentication-bypass-in-seraph/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1961/