作者:且听安全
原文链接:https://mp.weixin.qq.com/s/3EWju-IdsTfK7COKOK-c-w

漏洞信息

JIRA 存在 Seraph 组件认证绕过漏洞,影响范围广泛:

根据官方描述,大批量的默认和第三方插件受到影响:

关于Seraph Filter

对于认证绕过,猜测问题可能出现在 Filter 过滤上,JIRA 内部封装了数量较为庞大的 Filter 列表:

由于漏洞出现在Seraph模块,挨个查看 Filter 类,发现JiraSecurityFilter引用了com.atlassian.seraph包:

doFilter中调用super.doFilter,即SecurityFilter.doFilter

Security.doFilter根据客户端请求用户权限进行检查,进一步判定是否需要认证,needAuth变量很容易引起注意:

通过动态调试可知有 3 种服务进行检查,即JiraPathServiceWebworkServiceJiraSeraphSecurityService

JiraPathService用于处理/secure/admin/请求,需要管理员访问:

WebworkServiceactions.xml文件webwork中读取权限定义:

getRequiredRoles函数代码如下:

最后是JiraSeraphSecurityService,从插件Atlassian-plugin.xml文件中读取webwork接口权限定义:

动态调试可知经过多次getRequiredRoles函数执行,最后调用了WebworkPluginSecurityServiceHelper.getRequiredRoles函数,而且这个函数代码与WebworkService.getRequiredRoles相同:

该函数从request请求中提取 URI ,搜索最后一个/所在的位置,提取接口名称得到targetURL。如果 URL 输入为/secure/PerformOAuth2Authorization.jspa,那么targetURLPerformOAuth2Authorization.jspa

actionMapper中搜索对应的Action名称,这里得到为PerformOAuth2Authorization

根据rolesMap得到接口的权限为admin,接口需要管理员登录:

介绍完功能代码,最后还要重点 Mark 一下,getRequiredRoles中获取 URL 的方式为getRequestURI

*.jspa的处理

查看atlassian-jira/WEB-INF/web.xml文件Servlet定义,*.jspacom.atlassian.jira.web.dispatcher.JiraWebworkActionDispatcher处理:

JiraWebworkActionDispatcher.service函数从请求中获取Action名称:

使用/.jspa切割字符串获取ActionName,如果 URL 输入/secure/PerformOAuth2Authorization.jspa,那么 Action 为PerformOAuth2Authorization,注意到使用getServletPath函数:

executeAction函数中进行Action检查:

Action工厂列表如下:

再一次 Mark ,GetActionName中使用了getServletPath函数。

Seraph Filter认证绕过

通过前边的分析,我们能够得知Seraph组件在 Filter 中使用getRequestURI提取 URL ,而 Servlet 中使用getServletPath,有经验的小伙伴应该很快意识到存在一个典型的认证绕过场景。

简单的来说就是如果 URL 中包含;getServletURI结果会将分号保留,但getServletPath会自动将分号删除。以发送/secure/PerformOAuth2Authorization.jspa;为例, Seraph 组件 Filter 中调用显然找不到PerformOAuth2Authorization.jspa;对应的 Action ,从而进入 Servlet 处理,相当于完成了 Filter 层面的认证绕过:

getActionName获取的结果示例如下:

利用WebWork绕过插件认证

绕过Seraph组件Filter后,可以看到回复报文存在差异,但是还是需要认证:

调试后发现在执行LookupAliasActionFactoryProxy时同样读取了PerformOAuth2Authorization权限并进行检查:

同时其他Factory可能检查XsrfcheckWebSudoStatus等要素:

直接查找官方文档,在编写插件时可以使用webwork1元素添加roles-required属性:

Atlassian 插件通常为 jar 或者 ocr 格式,为了验证绕过,根据官方发布的插件影响列表下载 Insight 8.9.10 版本,找到一个webwork1元素:

成功绕过后台限制:

受影响的其他页面

JIRA 默认组件中一些可能绕过的功能,(尚未调试分析每个接口功能):

还有很多其他 URL ,需要绕过 XSRF:

部分接口可通过请求直接返回错误栈:

修复方式

典型的插件修补过程:


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1896/