漏洞概述

Apache 在2017年9月19日发布并修复了CVE-2017-12616CVE-2017-12615两个高危漏洞,并且在Apache Tomcat 7.0.81进行了修复。

Tomcat 安全漏洞发布地址:
https://tomcat.apache.org/security-7.html

CVE-2017-12616(信息泄露):允许未经身份验证的远程攻击者查看敏感信息。如果tomcat开启VirtualDirContext有可能绕过安全限制访问服务器上的JSP文件源码。Apache security Team在2017年8月10号已经识别该漏洞,2017年9月19日已经发布修复该漏洞最新版本的tomcat 7.0.81。影响范围为:7.0.0 to 7.0.80

CVE-2017-12615(远程代码执行漏洞):360观星实验室(360-sg-lab)在2017年7月26向apache security Team报告了该漏洞。Tomcat7服务器允许进行HTTP PUTs操作(例如通过设置初始化参数readonly默认值为false),攻击者通过构造的恶意请求可以上传JSP的webshell,webshell可以在服务器上执行任意的操作。影响范围为:7.0.0-7.0.79

Apache security team本次发布的两个漏洞涉及到tomcat两个重要的处理Http请求的Servlet,分别为org.apache.catalina.servlets.DefaultServlet和org.apache.jasper.servlet.JspServlet。其中DefaultServlet主要用于处理静态资源如html、image等。JspServlet用于处理动态页面请求如JSP、JSPX等。


图1 conf/web.xml配置

什么时候调用哪个Servelt?这个决定取决于tomcat请求路由核心组件org.apache.tomcat.util.http.mapper.Mapper,Mapper定义了多个规则判断客户端的请求该使用哪个Servlet。

CVE-2017-12616(信息泄露)

漏洞触发的先决条件是需要在conf/server.xml配置VirtualDirContex参数,默认情况下tomcat7并不会对该参数进行配置。VirtualDirContex主要使用场景是在IDE开发环境,生产环境tomcat官方不建议开启。正常情况下一般不会配置该参数开启,因此该漏洞显得有点鸡肋。


图2 VirtualDirContext类关系图

VirtualDirContextFileDirContext的子类,它允许在单独的一个webapp应用下对外暴露出多个文件系统的目录。实际项目开发过程中,为了避免拷贝静态资源(如images等)至webapp目录下,tomcat推荐的做法是在server.xml配置文件中建立虚拟子目录。


图3 项目结构

例如:我们项目的webapp目录为F:\site\cve-2017-12616,静态资源的目录为F:\site\images。现在我们想将两个目录合并为一个名义上的一个目录,需要在tomcat的conf/server.xml的<Host></host>节点下增加虚拟目录配置。

<Context path="/site" docBase="F:\site\cve-2017-12616\src\main\webapp" reloadable="true" debug="1">
  <!-- 配置项目的资源 -->
  <Resources className="org.apache.naming.resources.VirtualDirContext" extraResourcePaths="/WEB-INF/classes=F:/site/cve-2017-12616/target/classes,/images=F:/site/images" />
  <!-- 配置项目的 classpath -->
  <Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="/WEB-INF/classes=F:/site/cve-2017-12616/target/classes" />
  <!-- 扫描 jar 的内容 -->
  <JarScanner scanAllDirectories="true" />
</Context>

这个时候我们tomcat7服务器重启,打开浏览器访问以下地址,实际上就是完整在浏览器上展示出一张图片。


图4 通过虚拟目录访问静态资源

让我们重新回到漏洞本身,tomcat开启VirtualDirContext有可能绕过安全限制访问服务器上的JSP源码。如果我们临时对外开放了一个目录/temp=F:/site/cve-2017-12616/src/main/webapp,且该目录包含了很多敏感的JSP代码,那么敏感信息在不用授权的情况下将被泄露出去。因此生产环境不建议开启。另外tomcat本质上是Servlet容器引擎,tomcat访问所有资源都用Servlet来实现的,它的优势不在于处理静态资源,性能与响应时间与专门处理静态资源的服务器相比有差距。静态资源一般由前端代理服务器如nginx、apache来进行处理。

<Resources className="org.apache.naming.resources.VirtualDirContext" 
extraResourcePaths="/WEB-INF/classes=F:/site/cve-2017-12616/target/classes,/images=F:/site/images,/temp=F:/site/cve-2017-12616/src/main/webapp" />

JspServlet负责处理所有JSP和JPSX类型的动态请求,DefautServelt负责处理静态资源请求。因此,就算我们构造请求直接上传JSP webshell显然是不会成功的。

图5 构造请求

该漏洞实际上是利用了windows下文件名解析的漏洞来触发的。精心构造的恶意请求会绕过JspServelt,从而由DefaultServlet来处理该请求。

图6 DefaultServlet

点击收藏 | 0 关注 | 0
  • 动动手指,沙发就是你的了!
登录 后跟帖