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

漏洞概述

漏洞名称: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.pswp.cn/diannao/85351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

颠覆传统!单样本熵最小化如何重塑大语言模型训练范式?

颠覆传统&#xff01;单样本熵最小化如何重塑大语言模型训练范式&#xff1f; 大语言模型&#xff08;LLM&#xff09;的训练往往依赖大量标注数据与复杂奖励设计&#xff0c;但最新研究发现&#xff0c;仅用1条无标注数据和10步优化的熵最小化&#xff08;EM&#xff09;方法…

自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…

【MySQL】事务及隔离性

目录 一、什么是事务 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;事务的四大属性 &#xff08;三&#xff09;事务的作用 &#xff08;四&#xff09;事务的提交方式 二、事务的启动、回滚与提交 &#xff08;一&#xff09;事务的启动、回滚与提交 &am…

视觉分析明火检测助力山东化工厂火情防控

视觉分析技术赋能化工厂火情防控&#xff1a;从山东事故看明火与烟雾检测的应用价值 一、背景&#xff1a;山东化工事故中的火情防控痛点 近期&#xff0c;山东高密友道化学有限公司、淄博润兴化工科技有限公司等企业接连发生爆炸事故&#xff0c;暴露出传统火情防控手段的局…

【小程序】微信小程序备案失败,有请DeepSeek闪亮出场,看TA如何快速给出解决方案

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《小程序》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&a…

Oracle正则表达式学习

目录 一、正则表达简介 二、REGEXP_LIKE(x,匹配项) 三、REGEXP_INSTR 四、REGEXP_SUBSTR 五、REGEXP_REPLACE 一、正则表达简介 相关网址&#xff1a; https://cloud.tencent.com/developer/article/1456428 https://www.cnblogs.com/lxl57610/p/8227599.html https://…

vscode 代理模式(agent mode),简单尝试一下。

1. 起因&#xff0c; 目的: agent mode&#xff0c; 很流行&#xff0c;名气很大。简单试试效果&#xff0c;确实很强。agent mode&#xff0c; 取代人工&#xff0c;确实是前进了一大步。 2. 先看效果 效果对比&#xff0c;左边是 普通的AI 生成的&#xff0c; 右边是 代理…

贝锐蒲公英工业路由器R300A海外版:支持多国4G频段,全球组网

为更好地满足全球部署和企业出海项目的多样化需求&#xff0c;贝锐蒲公英异地组网工业路由器R300A海外版全新上市&#xff0c;并已正式上架速卖通&#xff01;无论是跨国分支机构协同办公&#xff0c;还是海外工厂设备远程运维&#xff0c;R300A海外版都能为企业提供灵活、高性…

自然图像数据集

目录 CIFAR-10 数据集CIFAR-100 数据集AFHQ 数据集FFHQ 数据集 CIFAR-10 数据集 简介&#xff1a; CIFAR-10 是一个经典的图像分类数据集&#xff0c;广泛用于机器学习领域的计算机视觉算法基准测试。它包含60000幅32x32的彩色图像&#xff0c;分为10个类&#xff0c;每类6000…

【AI面试秘籍】| 第25期:RAG的关键痛点及解决方案深度解析

今天我们来聊聊大模型领域一个非常火热的技术——RAG&#xff08;Retrieval Augmented Generation&#xff09;。RAG通过引入外部知识库&#xff0c;有效地缓解了大型语言模型&#xff08;LLM&#xff09;在处理知识密集型任务时可能出现的幻觉、知识过时等问题。然而&#xff…

精英-探索双群协同优化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)

一种多群体智能优化算法&#xff0c;其核心思想是通过两个分工明确的群体——精英群和探索群——协同工作&#xff0c;平衡算法的全局探索与局部开发能力&#xff0c;从而提高收敛精度并避免早熟收敛。 一 核心概念 在传统优化算法&#xff08;如粒子群优化、遗传算法&#xf…

Transformer相关

问题汇总 Transformer的结构自注意力机制(Self-Attention)多头自注意力前馈神经网络(Feed-Forward Network, FFN)位置编码编码器(Encoder)和解码器(Decoder)Multi-Query Attention(多查询注意力机制)Grouped-query Attention(分组查询注意力机制)FlashAttention与注…

【位运算】两整数之和(medium)

两整数之和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;代码复杂度分析 题⽬链接&#xff1a; 371. 两整数之和 题⽬描述&#xff1a; 给你两个整数 a 和 b &#xff0c;不使⽤ 运算符 和 - &#xff0c;计算并返回两…

现代密码学入门 | 现代密码学核心特点介绍

在当今互联互通的世界中&#xff0c;数字数据在全球范围内不断流动&#xff0c;安全通信和数据保护的需求从未如此迫切。现代密码学作为数字防御的先锋&#xff0c;提供了一系列复杂的技术和算法&#xff0c;以保护信息免受窥探和恶意行为的侵害。 现代密码学是从其古典前身—…

Redis分布式锁深度解析与最佳实践

1 2 Redis分布式锁实现方式确实是经典问题&#xff0c;下面我将系统性地分析这个方案及其演进过程&#xff0c;并给出生产级的解决方案。 一、基础方案及其缺陷 1. 初始实现方式 SETNX lock_key unique_value # 尝试获取锁 EXPIRE lock_key 30 # 设置过期时间 …

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…

Go语言的原子操作

当我们想要对某个变量并发安全的修改&#xff0c;除了使用官方提供的mutex&#xff0c;还可以使用sync/atomic包的原子操作&#xff0c;它能够保证对变量的读取或修改期间不被其他的协程所影响。 Golang提供的原子操作都是非侵入式的&#xff0c;由标准库sync/atmoic包提供&am…

QNAP MEMOS 域名访问 SSL(Lucky)

注意&#xff1a;下述是通过ssh、docker-compose方式安装docker的&#xff0c;不是直接在container station中安装的哈&#xff01;&#xff01;&#xff01; 一、编辑docker-compose.yml文件 用“#”号标识的&#xff0c;在保存文件的时候建议去掉&#xff0c;不然有时候会出…

C#实现远程锁屏

前言 这是一次提前下班没有锁屏进而引发的一次思考后的产物&#xff0c;思考的主要场景是当人离开电脑后&#xff0c;怎么能控制电脑锁屏&#xff0c;避免屏幕上的聊天记录被曝光。 首先想到通过系统的电源计划设置闲置超时时间熄屏&#xff0c;这可能是最接近场景的解决方案&a…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…