热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何更加精确的检测TomcatAJP文件包含漏洞(CVE20201938)

研究在SpringMVCBoot,Shiro,Stru

通过上篇文章《CVE-2020-1938:Tomcat AJP协议文件包含漏洞分析》,我们知道这个漏洞出现在Tomcat默认的两个Servlet,一个是DefaultServelt,可以任意文件读取。第二个是JspServlet,可以用于文件读取和代码执行。


所以我们漏洞利用的关键是让精心构造的数据包最终让这两个Servlet处理。但是在真实环境下的Web项目情况很复杂,会添加自定义的ServletFilter,使用各种框架和组件。它们的ServletFilter匹配规则会影响我们构造的数据包处理流向,导致我们无法检查成功。本文我们会针对常见的5种情况并一一解决!



 0x01 

知识储备 



在分析前我们需要对Tomcat匹配规则优先级有一个了解,匹配的优先级如下,优先级从上到下:


  1. 精确匹配(例如:/admin/index.html

  2. 路径匹配 (例如:/*)

  3. 拓展名匹配 (例如:*.jsp,*.jspx)

  4. 缺省匹配 (比如:/


具体的匹配细节可以查看Tomcat源码org.apache.catalina.mapper.Mapper#internalMapWrapper()



 0x02 

情况一:原生Servlet环境下 



Tomcat下存在多个默认的web项目,由于它们没有使用任何框架,所以借助它们来检查再好不过了。


  1. docs

  2. examples

  3. host-manager

  4. manager


当没有默认的web项目,我们只能检查ROOT下的项目了。在使用原生Servlet开发的web应用中,我们要考虑的是开发人员自定义filter和自定义servlet对漏洞影响。


按照开发经验,一般过滤器是不会过滤.js,.css,.ico等静态文件后缀的url,同时自定义的Servlet也不会去处理这些url。所以我们可以构造类似如下请求来绕过它们带来的影响。



 0x03 

情况二:Sping mvc环境下 



Spring MVC的经典配置如下(图搞错了改不了,看博客原文吧)

虽然覆盖掉了DefaultServlet的匹配路径,但是*.jsp,*.jspx依然会交给JspServlet处理,所以我们可以构造如下请求让JspServlet来触发漏洞。


这里顺便回答下上一篇文章提的问题

问题:如果已经知道某个contoller使用的是jsp为视图模版来渲染数据,我们能否通过它来触发漏洞?


答:其实是不可以的。因为spring mvc会将模版渲染后,交给JspServlet去处理之前,会调用org.apache.catalina.core.ApplicationDispatcher#doInclude方法对3个include属性进行重新赋值,也就是把我们之前设置的值覆盖掉了不再可控!



 0x04 

情况三:Spring boot环境下 



Srping boot结合Tomcat来部署有两种方式,分别是外置内嵌


5.1 内嵌Tomcat

我们先来说内嵌,它是默认的部署方式。顾名思义就是spring boot内部代码来调用Tomcat提供Web服务。这种方式默认AJP是不开启的。


若开启AJP,DefaultServlet的匹配路径也会将org.springframework.web.servlet.DispatcherServlet覆盖,而JspServlet这个是没有被注册的,因为该类在jasper.jar中,Spring boot默认的依赖中没有。


这里值得一提的是有一种情况是可以触发漏洞的,当Spring boot需要以JSP为视图模版时,jasper.jar需要被引入。通过调试Spring boot发现会自动注册一个将*.jsp*.jspxJspservlet的处理的mapper,具体参考以下两处源码。


org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#prepareContext

org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory#shouldRegisterJspServlet


5.2 外置Tomcat

外置就是把SpringBoot项目打成war,部署到tomcat的webapps目录下。这种情况下的检测和Spirng MVC情况一样。

 

所以综合来看,内置情况下只有配置开启了AJP并引入了jasper.jar才可以被利用,这种情况较少。外置情况下可以直接利用,这种情况也较少。所以我认为Spring boot出现该漏洞的可能性不大。



 0x05 

情况四:shiro环境下 



经典配置下shiro过滤器会对所有路径进行过滤,对url的访问权限有如下5个属性。


  • anon: 无需认证即可访问

  • authc: 需要认证才可访问
  • user: 点击“记住我”功能可访问
  • perms: 拥有权限才可以访问
  • role: 拥有某个角色权限才能访问

假设配置如下,在未登录情况下只能访问被配置为anon权限的login.jsp,访问其他链接都会302跳转至登录页面。所以只能请求这个页面来触发漏洞。

但我们在自动化中如何发现被配置为anon权限的URL呢?实验室的@背影师傅给了一条很重要的提示,可以通过该漏洞设置request对象属性shiroFilter: 1来“关闭”shiro的拦截功能。

如果request对象的属性名alreadyFilteredAttributeName的值不为空,那么将直接交给Tomcatservlet处理,相当于关闭了shiro的拦截!

alreadyFilteredAttributeName变量等于shiro过滤器名+.FILTERED。通过查看代码发现shiroFilter其实是web.xml设置的shiro过滤器名,这是由开发人员自定义的,故带来了新的问题。若不知道shiro过滤器名怎么办呢?


通过调试shiro,发现请求会被上面说的5种权限过滤器,依次匹配并处理。最重要的是它们的名字固定!于是按照同样的方法,都给它们设置上已过滤flag,即可绕过shiro的限制。具体请求构造如下:


 0x06 

情况五:Struts2环境下 



以下分析的是Struts2 2.5.22
使用Struts2框架一般需要设置如下的全局过滤器

该过滤器默认会将后缀为.action的URL请求,交给Struts2Action处理,而其他后缀就交给Tomcat默认Servlet处理,漏洞利用需要让其走后者。

然而在请求路径的获取上Struts2有别于其他环境,这是导致漏洞利用方式稍有不同。它通过request对象的javax.servlet.include.servlet_path属性获取,而不是request.getServletPath()
org.apache.struts2.dispatcher.mapper.DefaultActionMapper#getUri()

所以我们在这里必须设置该属性值为非空非.action的后缀test.jsp,才能让Tomcat的JspServlet来处理。但是如果我们还是使用原来的方式读/WEB-INF/web.xml是行不通的,因为最终构造的路径如下是错误的。

那我们能否将javax.servlet.include.path_info设置为/../WEB-INF/web.xml来吃掉1.jsp形成正确路径呢?答案是可以的!


可能看过我之前漏洞分析文章的朋友会说,不是说路径里不能使用../进行跳目录么?其实是可以跳目录,只是不能跳出webapps而已。这里重新说明下路径校验函数normalized()的功能。

该方法的功能是中和掉路径中的./../,比如/a/.//b/../c就会被中和为/a/c。如果最后依然存在../在开头,才会返回null,最终抛出非法路径的异常。
所以在Struts2框架下检测该漏洞,需要构造如下请求来绕过。



 0x07 

扫描演示 



最后便可以将以上各个场景的特点综合起来,编写扫描工具了。这里我搭建了SpringMVC + Shiro的环境进行演示。可以发现其他的url都重定向了,只有针对shiro构造的请求是200,并成功触发漏洞!



 0x08 

最后的话 



1. 本文只对每种环境较新版本进行分析,所以提供的扫描方案不可能适配所有版本环境,算是对精确检测做一个抛砖引玉。
2. 每种环境下的检测方案,只考虑使用Tomcat默认存在缺陷的两个Servlet(JspServletDefaultServlet)来检测,更完美的方案应该是去找每种环境下其他存在缺陷的Servlet。


推荐阅读
  • 标题: ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
author-avatar
目目目目目目目目目目目目
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有