作者:且听安全
原文链接: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 种服务进行检查,即JiraPathService
、WebworkService
和JiraSeraphSecurityService
:
JiraPathService
用于处理/secure/admin/
请求,需要管理员访问:
WebworkService
从actions.xml
文件webwork
中读取权限定义:
其getRequiredRoles
函数代码如下:
最后是JiraSeraphSecurityService
,从插件Atlassian-plugin.xml
文件中读取webwork
接口权限定义:
动态调试可知经过多次getRequiredRoles
函数执行,最后调用了WebworkPluginSecurityServiceHelper.getRequiredRoles
函数,而且这个函数代码与WebworkService.getRequiredRoles
相同:
该函数从request
请求中提取 URI ,搜索最后一个/
所在的位置,提取接口名称得到targetURL
。如果 URL 输入为/secure/PerformOAuth2Authorization.jspa
,那么targetURL
为PerformOAuth2Authorization.jspa
:
在actionMapper
中搜索对应的Action
名称,这里得到为PerformOAuth2Authorization
:
根据rolesMap
得到接口的权限为admin
,接口需要管理员登录:
介绍完功能代码,最后还要重点 Mark 一下,getRequiredRoles
中获取 URL 的方式为getRequestURI
:
*.jspa的处理
查看atlassian-jira/WEB-INF/web.xml
文件Servlet
定义,*.jspa
由com.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
可能检查Xsrf
、checkWebSudoStatus
等要素:
直接查找官方文档,在编写插件时可以使用webwork1
元素添加roles-required
属性:
Atlassian 插件通常为 jar 或者 ocr 格式,为了验证绕过,根据官方发布的插件影响列表下载 Insight 8.9.10 版本,找到一个webwork1
元素:
成功绕过后台限制:
受影响的其他页面
JIRA 默认组件中一些可能绕过的功能,(尚未调试分析每个接口功能):
还有很多其他 URL ,需要绕过 XSRF:
部分接口可通过请求直接返回错误栈:
修复方式
典型的插件修补过程:
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1896/