中间件常见漏洞之Jetty

简介: 中间件常见漏洞之Jetty

0x01 Jetty简介

Jetty是一个提供HHTP服务器、HTTP客户端和javax.servlet容器的开源项目。

简单来讲,Jetty就是一个开源HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运行时环境。比如Java web应用最常用的Servlet容器Tomcat。由于其轻量、灵活的特性,Jetty也被应用于一些知名产品中,例如ActiveMQ、Maven、Spark、GoogleAppEngine、Eclipse、Hadoop等。Jetty工程简介Jetty所有顶级目录简介:

为什么使用Jetty异步的Servlet,支持更高的并发量模块化的设计,更灵活,更容易定制,也意味着更高的资源利用率在面对大量长连接的业务场景下,Jetty默认采用的NIO模型是更好的选择将Jetty嵌入到应用中,使一个普通应用可以快速支持HTTP服务Jetty比较适合微服务(轻量级)运行Jetty执行以下代码,Jetty会在默认8080端口运行

    cd $JETTY_HOME
    java -jar start.jar

    若执行成功会输出以下信息

    2023-03-08 17:24:44.806:INFO::main: Logging initialized @334ms
    2023-03-08 17:24:44.858:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended. See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html
    2023-03-08 17:24:44.995:INFO:oejs.Server:main: jetty-9.3.0.v20150601
    2023-03-08 17:24:45.012:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.3.0.v20150601/webapps/] at interval 1
    2023-03-08 17:24:45.030:INFO:oejs.ServerConnector:main: Started ServerConnector@19dfb72a{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
    2023-03-08 17:24:45.030:INFO:oejs.Server:main: Started @558ms

    你可以通过浏览器访问http://localhost:8080.。然而在$JETTY_HOME/webapps目录下并没有部署任何web应用,所以你将会看到一个Jetty提供的404错误页面,并不推荐在$JETTY_HOME下运行Jetty,而是建议运行一个Jetty基础应用。错误页面如下


    Jetty的基本架构Jetty的框架比较简单,核心组件主要是由Server和Handler组成。其中Server的Handler是其比较重要的一个数据模型,Jetty中所有的组件都是基于Handler来实现的。Tomcat最顶层是Service,控制了服务器的整个生命周期,每一个Service由一个Container和多个Connector组成,形成一个独立完整的处理单元,对外请求。Jetty的核心是Server,整体包含了多个Handle,还有一个Connector组成,Connector负责接受请求,将请求分配给一个队列去进行处理。Jetty的架构设计要比tomcat的更清晰,简单。

    与Tomcat的对比1.Jetty比较容易贴合第三方框架,比如你可以直接用Spring配置一个Jetty服务器2.直接将Jetty作为提供HTTP服务的组件,嵌入到应用中(SpringBoot也嵌入了Tomcat)3.Jetty是面向Handler的架构,而Tomcat是面向容器的架构4.Jetty默认采用NIO技术,而Tomcat默认是BIO5.Jetty高度模块化,可以很灵活的管理拓展组件,而Tomcat对其他组件的管理则相对困难6.Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。而且按需加载组件,减少了服务器的内存开销,内部默认采用NIO异步处理等特性提高了服务器性能。配置更加的灵活、简单、开发效率快、扩展性强。7.从技术上来说的话,Jetty不是一个功能全面的J2EE服务器,缺少很多对J2EE功能的支持。而Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的请求服务。它自身扩展了大量的J2EE特性来满足各种企业项目应用的需求,对于很多的Java web项目来说,我们可能并不需要这么多高级特性,从一定程度上浪费了很多的资源。基础应用例子标准的Jetty应用,有一个demo-base的文件夹,可以不在$JETTY_HOME下运行Jetty,在demo-base文件夹下执行以下命令:

      cd $JETTY_HOME/demo-base/
      java -jar $JETTY_HOME/start.jar

      成功运行将有如下信息输出:

      2023-03-08 17:24:24.161:INFO::main: Logging initialized @308ms
      2023-03-08 17:24:24.431:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:24.434:INFO:oejs.Server:main: jetty-9.3.0.v20150601
      2023-03-08 17:24:24.457:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/webapps/] at interval 1
      2023-03-08 17:24:24.826:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@c038203{/,file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/webapps/ROOT/,AVAILABLE}{/ROOT}
      2023-03-08 17:24:24.929:WARN::main: test-jaas webapp is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:24.978:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@46238e3f{/test-jaas,file:///tmp/jetty-0.0.0.0-8080-test-jaas.war-_test-jaas-any-9105214562680121772.dir/webapp/,AVAILABLE}{/test-jaas.war}
      2023-03-08 17:24:25.162:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:25.208:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@6b67034{/async-rest,[file:///tmp/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-1023939491558622183.dir/webapp/, jar:file:///tmp/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-1023939491558622183.dir/webapp/WEB-INF/lib/example-async-rest-jar-9.3.0.v20150601.jar!/META-INF/resources],AVAILABLE}{/async-rest.war}
      2023-03-08 17:24:25.311:WARN::main: test-jndi webapp is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:25.386:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@8b96fde{/test-jndi,file:///tmp/jetty-0.0.0.0-8080-test-jndi.war-_test-jndi-any-1692053319754270133.dir/webapp/,AVAILABLE}{/test-jndi.war}
      2023-03-08 17:24:25.508:WARN::main: test-spec webapp is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:25.594:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@69930714{/test-spec,[file:///tmp/jetty-0.0.0.0-8080-test-spec.war-_test-spec-any-5518740932795802823.dir/webapp/, jar:file:///tmp/jetty-0.0.0.0-8080-test-spec.war-_test-spec-any-5518740932795802823.dir/webapp/WEB-INF/lib/test-web-fragment-9.3.0.v20150601.jar!/META-INF/resources],AVAILABLE}{/test-spec.war}
      2023-03-08 17:24:25.781:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@3eb7fc54{/proxy,file:///tmp/jetty-0.0.0.0-8080-xref-proxy.war-_xref-proxy-any-3068657547009829038.dir/webapp/,AVAILABLE}{/xref-proxy.war}
      2023-03-08 17:24:25.786:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.MovedContextHandler@59662a0b{/oldContextPath,null,AVAILABLE}
      2023-03-08 17:24:25.951:WARN::main: test webapp is deployed. DO NOT USE IN PRODUCTION!
      2023-03-08 17:24:26.248:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@4f83df68{/test,file:///tmp/jetty-0.0.0.0-8080-test.war-_test-any-5238659347611323540.dir/webapp/,AVAILABLE}{/test.war}
      2023-03-08 17:24:26.255:INFO:oejs.ServerConnector:main: Started ServerConnector@5a9c4ad9{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
      2023-03-08 17:24:26.259:INFO:oejus.SslContextFactory:main: x509={jetty.eclipse.org=jetty} wild={} alias=null for SslContextFactory@23941fb4(file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/etc/keystore,file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/etc/keystore)
      2023-03-08 17:24:26.269:INFO:oejs.ServerConnector:main: Started ServerConnector@5d908d47{SSL,[ssl, http/1.1]}{0.0.0.0:8443}
      2023-03-08 17:24:26.270:INFO:oejs.Server:main: Started @2417ms

      现在可以通过浏览器访问 http://localhost:8080, 此时可以看到一个Jetty的欢迎页面,页面上包含几个简单的例子,欢迎页面如下

      注:

      示例的web应用程序不一定是安全,所以不建议部署在生产环境上。你可以通过以下命令查看示例应用的配置信息

        cd $JETTY_HOME/demo-base/
        java -jar $JETTY_HOME/start.jar --list-modules
        java -jar %JETTY_HOME/start.jar --list-config
          --list-modules:此命令将返回当前服务所有可用的模块,同时也会显示本地的模块,信息包括模块实现的顺序,依赖模块以及相应的jar信息
          --list-config:显示运行环境和配置文件等信息


          改变Jetty的端口通过在启动命令中设置jetty.http.port属性的值,可以让Jetty运行在修改后的端口上。

            cd $JETTY_BASE
            java -jar $JETTY_HOME/start.jar jetty.http.port=8081

            另外,可以将要设置的端口属性添加到start.ini或者start.d/http.ini文件中。默认情况,在start.d/http.ini文件中定义的jetty.http.port属性可以被修改成另一个值。

            配置属性信息通过如下方式获得1.首先去start.d/http.ini文件中找jetty.http.port=8080配置信息,若找到配置端口即为指定端口2.据模块modules/http.mod文件找到指定配置默认为etc/jetty-http.xml,在此配置文件中有jetty.http.port配置信息,若找到即为此端口配置3.若上面两个都没有,则随机一个没有使用的端口

            为HTTPS & HTTP2增加SSL

            可通过如下命令,添加并激活HTTPS和HTTP2模块

            java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2
            java -jar $JETTY_HOME/start.jar
            2023-03-08 17:27:45.933:INFO:oejs.ServerConnector:main: Started ServerConnector@6f1fba17{SSL,[ssl, alpn, h2, http/1.1]}{0.0.0.0:8443}

            --add-to-startd:此命令在ini文件中设置有效的配置信息,使HTTPS和HTTP2支持SSL连接输入java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2命令后会提示下载一些jar包,输入y按回车,最终提示信息如下,说明操作成功:

            修改Jetty的HTTPS端口你可以通过增加jetty.ssl.port启动参数来修改HTTPS的端口信息 例如:5500

              cd $JETTY_BASE
              java -jar $JETTY_HOME/start.jar jetty.ssl.port=5500

              除了在命令行增加参数的方法外,还可以在start.ini和start.d/*.ini文件中进行配置,所以如果用户使用--add-to-startd命令来使HTTPS生效,同样也可以在start.d/https.ini文件中进行修改。

              更多的start.jar操作选项start.jar的工作是用来翻译命令行内容的,start.ini和start.d目录(包含其中的*.ini文件)生成一个classpath环境,各种属性和配置可以使用Jetty相应的xml进行配置,更多的使用方法可以通过使用命令来获得帮助


              java -jar $JETTY_HOME/start.jar --help

              部署Web应用

              Jetty支持热部署,可以自动部署webapps目录下的项目。标准的war文件和Jetty配置文件放置在webapps目录下,通过以下规则进行热部署1.例如一个包含 WEB-INF/ 子文件夹的example/文件夹做为一个标准的web应用进行部署,否则就按静态资源部署,context路径为/example(访问路径:http://localhost:8080/example/);若文件夹名字为ROOT,则访问路径为/;若文件夹名字末尾为.d则此文件夹被忽略(除非被特殊的配置文件引用)2.若一个文件example.war被部署在webapps下,则context路径为example/,如果名字为ROOT则访问路径为/,如果example.war文件和example/文件夹同时存在,只有war文件会被部署(这个文件会被当做一个没有被解压的目录来使用)3.一个像example.xml的配置文件,若文件中是标准的配置信息,也会被部署,文件中必须包含context path,如果context path和example.xml同时存在,只有example.xml会被部署。如果你有一个标准的web应用,可以直接将其拷贝到webapps文件夹下进行热部署。

              Jetty示例Web Application

              demo-base/webapps文件下的项目包含如下部署和附加的的文件:

              ROOT/:这个文件夹包含各种静态资源。包含Jetty欢迎页面,默认访问路径为/
              test.d:一个包含附加配置文件的文件夹,被test.xml使用用来为test.war增加额外的配置
              test.xml:一个context配置文件,用来配置和部署test.war,包含上下文环境和test.d里面的配置附加的配置信息
              test.war:在test.xml里面配置的示例web程序
              async-rest.war:一个异步示例的web应用程序
              test-jaas.war:一个使用JAAS身份验证的web应用程序。
              test-jaas.xml:用来配置test-jaas.war的配置文件
              test-jndi.war:一个使用JNDI的示例应用
              test-jndi.xml:用来配置test-jndi.war的配置文件
              test-spec.war:一个使用注解,ServletContainerInitializers 和Servlet 3.0/3.1规范的示例应用
              test-spec.xml:用来配置test-spec.war的配置文件
              xref-proxy.war:使用代理的一个示例应用
              example-moved.xml:一个演示MovedContextHandler重定向使用的示例应用

              异步Servlet

              异步Servlet是Servlet3.0出来的新特性。在并发量较大的情况下,若一个Servlet处理较慢,则会导致所有Servlet需要排队等待之前的Servlet线程处理完后才能继续执行。在加入异步Servlet之后,可以在处理时间较长的Servlet中增加单独的工作线程专门处理该业务,然后Servlet线程继续处理其他的Servlet请求

              0x02 Jetty漏洞复现

              CVE-2021-28169-敏感信息泄露漏洞简介:在9.4.40, 10.0.2, 11.0.2版本前,Jetty Servlets中的ConcatServlet、WelcomeFilter类存在多重解码问题,如果开发者主动使用了这两个类,攻击者可以利用其访问WEB-INF目录下的敏感文件,造成配置文件及代码泄露。影响版本:

                jetty 9.4.40
                jetty 10.0.2
                jetty 11.0.2

                漏洞复现访问8080端口,是一个初始的example页面,尝该页面使用到了ConcatServlet来优化静态文件的加载,正常通过/static?/WEB-INF/web.xml无法访问到敏感文件web.xml.

                对字母“W"进行双重URL编码,即可绕过限制进行访问:


                /static?/%2557EB-INF/web.xml

                CVE-2021-28164  敏感信息泄露

                漏洞简介:

                在Jetty9.4.37版本中,为了符合RFC3986中的规范,选择性地支持可能有歧义解释的URI,默认模式允许URL编码,简单看下RFC3986(替代RFC2396)的规定

                其大致意思是:

                .和..称为点段,都是为路径名层次结构中的相对引用而定义的,它们在一些操作系统文件目录结构中分别代表当前目录和父目录。但是与文件系统不同的是,这些点段仅在 URI 路径中解释层次结构,并作为解析过程的一部分被删除。也就是说在解析URI路径时,需要先处理.和..,Jetty为了符合这种处理方式,却导致了一系列的漏洞产生,首先是在9.4.39版本中修复了CVE-2021-28164,然后出现了新的绕过,其又在9.4.43版本中修复了CVE-2021-34429。

                漏洞利用CVE-2021-28164漏洞利用访问docker搭建的漏洞环境(8080端口),是一个简单的初始化页面。直接访问/WEB-INF/web.xml 会响应一个404d 页面

                执行攻击payload读取web.xml。payload: /%2e/WEB-INF/web.xml

                CVE-2021-34429 修复绕过-敏感信息泄露基本绕过原理:可以使用一些编码字符来制作URI,以访问WEB-INF目录的内容和/或绕过一些安全限制。默认合规模式允许带有包含 %u002e 段的 URI 的请求访问WEB-INF目录中的受保护资源。例如,/%u002e/WEB-INF/web.xml可以检索 web.xml 文件的请求。这可能会泄露有关 Web 应用程序实现的敏感信息。同样,编码的空字符可能会阻止正确的规范化,因此/.%00/WEB-INF/web.xml也会检索 web.xml 文件。复现过程:照常访问/WEB-INF/web.xml,响应404.使用%u002e绕过:

                使用空字符绕过:

                目录
                相关文章
                |
                2月前
                |
                安全 应用服务中间件 PHP
                中间件漏洞
                中间件漏洞
                |
                7月前
                |
                开发框架 安全 中间件
                38、中间件漏洞解析-IIS6.0
                38、中间件漏洞解析-IIS6.0
                78 0
                |
                安全 NoSQL 前端开发
                weblogic中间件漏洞总结(三)
                weblogic中间件漏洞总结
                557 8
                weblogic中间件漏洞总结(三)
                |
                安全 Oracle Java
                weblogic中间件漏洞总结(二)
                weblogic中间件漏洞总结
                307 8
                weblogic中间件漏洞总结(二)
                |
                安全 Oracle Java
                weblogic中间件漏洞总结(一)
                weblogic中间件漏洞总结
                222 8
                weblogic中间件漏洞总结(一)
                |
                开发框架 安全 .NET
                38、中间件漏洞解析-IIS6.0
                38、中间件漏洞解析-IIS6.0
                104 4
                38、中间件漏洞解析-IIS6.0
                |
                缓存 负载均衡 安全
                中间件常见漏洞之Nginx
                中间件常见漏洞之Nginx
                1990 0
                |
                负载均衡 安全 Oracle
                中间件常见漏洞之weblogic 1
                中间件常见漏洞之weblogic
                260 0
                |
                安全 前端开发 网络协议
                中间件常见漏洞之Tomcat
                中间件常见漏洞之Tomcat
                430 0
                |
                SQL 安全 中间件
                中间件常见漏洞之IIS 2
                中间件常见漏洞之IIS
                325 0