CVE-2019-0221—Apache Tomcat SSI printenv指令中的XSS
字数 1264 2025-08-27 12:33:22

Apache Tomcat SSI printenv指令XSS漏洞分析(CVE-2019-0221)

漏洞概述

Apache Tomcat在其SSI(Server Side Includes)实现中存在跨站脚本(XSS)漏洞,当使用"printenv"指令时未能正确转义输出,导致攻击者可注入恶意脚本。该漏洞被分配CVE编号CVE-2019-0221,风险等级被供应商评为"低风险"。

受影响版本

  • Tomcat 9: 9.0.0.M1至9.0.17(9.0.18不受影响)
  • Tomcat 8: 8.5.0至8.5.39
  • Tomcat 7: 7.0.0至7.0.93

修复版本

  • Tomcat 9: 9.0.19及以上
  • Tomcat 8: 8.5.40及以上
  • Tomcat 7: 7.0.94及以上

漏洞详情

SSI功能简介

服务器端包含(SSI)是一种简单的脚本语言,用于实现以下功能:

  • 包含文件
  • 回显变量的值
  • 显示文件的基本信息

SSI特定的环境变量可以是:

  • 用户设置的变量
  • 包含传入HTTP请求信息的变量

漏洞根源

Tomcat提供了两个SSI指令用于输出变量:

  1. echo指令:输出单个变量的值
  2. printenv指令:输出所有变量的值

关键问题

  • echo指令正确转义了XSS值
  • printenv指令未对输出进行正确转义

利用前提条件

要成功利用此漏洞,必须满足以下条件:

  1. 在Apache Tomcat中启用SSI支持(全局或特定Web应用程序),默认情况下不启用
  2. Web应用程序中存在包含"printenv" SSI指令的文件(通常为.shtml文件)
  3. 攻击者能够访问该文件

漏洞复现步骤

环境准备

  1. 在Windows中安装Java运行时环境(JRE)
  2. 下载并解压存在漏洞的Tomcat版本

配置修改

  1. 修改conf/context.xml文件,在第19行添加上下文权限:
<Context privileged="true">
  1. 修改conf/web.xml以启用SSI servlet(可全局或针对特定应用)

创建测试文件

webapps/ROOT/ssi/printenv.shtml中放置以下内容:

<html><head><title></title><body>
Echo test: <!--#echo var="QUERY_STRING_UNESCAPED" --><br/><br/>
Printenv test: <!--#printenv -->
</body></html>

启动Tomcat

cd bin
catalina run

触发XSS

使用以下URL触发XSS(可能需要使用Firefox):

http://localhost:8080/ssi/printenv.shtml?%3Cbr/%3E%3Cbr/%3E%3Ch1%3EXSS%3C/h1%3E%3Cbr/%3E%3Cbr/%3E

或:

http://localhost:8080/printenv.shtml?%3Cscript%3Ealert(%27xss%27)%3C/script%3E

观察点

  • echo指令的输出会被正确转义
  • printenv指令的输出不会被转义,导致XSS执行

修复方案

修复方法是在printenv指令的输出中添加编码,如提交的补丁所示。

供应商回应

供应商认为此漏洞风险较低的原因:

  1. 默认情况下SSI是禁用的
  2. 使用SSI的情况较少
  3. printenv命令也不常用

安全建议

  1. 升级到不受影响的Tomcat版本:

    • Tomcat 9: 9.0.19+
    • Tomcat 8: 8.5.40+
    • Tomcat 7: 7.0.94+
  2. 如果无法立即升级,可考虑:

    • 禁用SSI功能
    • 审查并移除所有使用printenv指令的SSI文件

参考链接

Apache Tomcat SSI printenv指令XSS漏洞分析(CVE-2019-0221) 漏洞概述 Apache Tomcat在其SSI(Server Side Includes)实现中存在跨站脚本(XSS)漏洞,当使用"printenv"指令时未能正确转义输出,导致攻击者可注入恶意脚本。该漏洞被分配CVE编号CVE-2019-0221,风险等级被供应商评为"低风险"。 受影响版本 Tomcat 9: 9.0.0.M1至9.0.17(9.0.18不受影响) Tomcat 8: 8.5.0至8.5.39 Tomcat 7: 7.0.0至7.0.93 修复版本 Tomcat 9: 9.0.19及以上 Tomcat 8: 8.5.40及以上 Tomcat 7: 7.0.94及以上 漏洞详情 SSI功能简介 服务器端包含(SSI)是一种简单的脚本语言,用于实现以下功能: 包含文件 回显变量的值 显示文件的基本信息 SSI特定的环境变量可以是: 用户设置的变量 包含传入HTTP请求信息的变量 漏洞根源 Tomcat提供了两个SSI指令用于输出变量: echo 指令:输出单个变量的值 printenv 指令:输出所有变量的值 关键问题 : echo 指令正确转义了XSS值 printenv 指令未对输出进行正确转义 利用前提条件 要成功利用此漏洞,必须满足以下条件: 在Apache Tomcat中启用SSI支持(全局或特定Web应用程序),默认情况下不启用 Web应用程序中存在包含"printenv" SSI指令的文件(通常为.shtml文件) 攻击者能够访问该文件 漏洞复现步骤 环境准备 在Windows中安装Java运行时环境(JRE) 下载并解压存在漏洞的Tomcat版本 配置修改 修改 conf/context.xml 文件,在第19行添加上下文权限: 修改 conf/web.xml 以启用SSI servlet(可全局或针对特定应用) 创建测试文件 在 webapps/ROOT/ssi/printenv.shtml 中放置以下内容: 启动Tomcat 触发XSS 使用以下URL触发XSS(可能需要使用Firefox): 或: 观察点 : echo 指令的输出会被正确转义 printenv 指令的输出不会被转义,导致XSS执行 修复方案 修复方法是在 printenv 指令的输出中添加编码,如提交的补丁所示。 供应商回应 供应商认为此漏洞风险较低的原因: 默认情况下SSI是禁用的 使用SSI的情况较少 printenv 命令也不常用 安全建议 升级到不受影响的Tomcat版本: Tomcat 9: 9.0.19+ Tomcat 8: 8.5.40+ Tomcat 7: 7.0.94+ 如果无法立即升级,可考虑: 禁用SSI功能 审查并移除所有使用 printenv 指令的SSI文件 参考链接 原始漏洞报告 CVE-ID: CVE-2019-0221 Apache SSI文档