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/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。

环境搭建

  1. 开启docker环境
    docker-compose build
    docker-compose up -d
    在这里插入图片描述
  2. 访问ip:8080进行安装,选择第二个
    在这里插入图片描述
  3. 按照提示继续即可

在这里插入图片描述在这里插入图片描述在这里插入图片描述4. 生成JIRA使用许可证
在这里插入图片描述5. 生成之后找到License Key,回到页面填上License Key继续安装
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
6. 至此,安装完毕

在这里插入图片描述

漏洞复现

  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漏洞:
    在这里插入图片描述3. 通过bupsuit进行请求如下,在响应中可以看到探测失败则会显示响应500:
    在这里插入图片描述

POC验证:

使用方法:python3 poc.py -u http://192.168.60.244:8080
在这里插入图片描述

修复建议

升级到8.4.0及以上版本

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值