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指令用于输出变量:
echo指令:输出单个变量的值printenv指令:输出所有变量的值
关键问题:
echo指令正确转义了XSS值printenv指令未对输出进行正确转义
利用前提条件
要成功利用此漏洞,必须满足以下条件:
- 在Apache Tomcat中启用SSI支持(全局或特定Web应用程序),默认情况下不启用
- Web应用程序中存在包含"printenv" SSI指令的文件(通常为.shtml文件)
- 攻击者能够访问该文件
漏洞复现步骤
环境准备
- 在Windows中安装Java运行时环境(JRE)
- 下载并解压存在漏洞的Tomcat版本
配置修改
- 修改
conf/context.xml文件,在第19行添加上下文权限:
<Context privileged="true">
- 修改
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指令的输出中添加编码,如提交的补丁所示。
供应商回应
供应商认为此漏洞风险较低的原因:
- 默认情况下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文档