[toc]

CVE-2022-42252 Apache Tomcat - Request Smuggling

漏洞描述

Apache Tomcat 是一个 Java Web 应用程序服务器。

在 tomcat 中,如果设置 rejectIllegalHeader 为 false(不是默认值)用来忽略无效的 HTTP 头或者在反向代理配置 Tomcat,那么 Tomcat 不会拒绝包含无效内容长度 HTTP 头的请求,攻击者可能利用此漏洞造成请求走私。

1
2
3
Description:
If Tomcat was configured to ignore invalid HTTP headers via setting
rejectIllegalHeader to false (the default for 8.5.x only), Tomcat did not reject a request containing an invalid Content-Length header making a request smuggling attack possible if Tomcat was located behind a reverse proxy that also failed to reject the request with the invalid header.
漏洞名称 Apache Tomcat 请求走私漏洞
漏洞类型 HTTP 请求的解释不一致性(HTTP 请求私运)
发现时间 2022-11-01
漏洞影响广度 广
MPS 编号 MPS-2022-58907
CVE 编号 CVE-2022-42252
CNVD 编号 -

影响范围

org.apache.tomcat:tomcat@[10.1.0-M1, 10.1.1)

org.apache.tomcat:tomcat@[10.0.0-M1, 10.0.27)

org.apache.tomcat:tomcat@[8.5.0, 8.5.83)

org.apache.tomcat:tomcat@[9.0.0-M1, 9.0.68)

1
2
3
4
5
Versions Affected:
Apache Tomcat 10.1.0-M1 to 10.1.0
Apache Tomcat 10.0.0-M1 to 10.0.26
Apache Tomcat 9.0.0-M1 to 9.0.67
Apache Tomcat 8.5.0 to 8.5.52

修复方案

升级 org.apache.tomcat:tomcat 到 10.1.1 或更高版本

升级 org.apache.tomcat:tomcat 到 10.0.27 或更高版本

升级 org.apache.tomcat:tomcat 到 8.5.83 或更高版本

升级 org.apache.tomcat:tomcat 到 9.0.68 或更高版本

Reference

Requests with invalid content-length should always be rejected · apache/tomcat@4c7f4fd (github.com)

Apache Httpd AJP请求走私 CVE-2022-26377 漏洞分析 | CN-SEC 中文网

Apache Tomcat HTTP请求走私 (CVE-2021-33037)

漏洞信息

Apache Tomcat 在某些情况下没有正确解析 HTTP 传输编码请求标头,导致在与反向代理一起使用时可能出现请求走私。具体来说:如果客户端声明它只接受 HTTP/1.0 响应,Tomcat 会错误地忽略传输编码标头;Tomcat 尊重身份编码;并且 Tomcat 不能确保分块编码(如果存在)是最终编码。

影响版本:

Apache Tomcat 10.0.0-M1-10.0.6

Apache Tomcat 9.0.0.M1-9.0.46

Apache Tomcat 8.5.0-8.5.66

环境搭建

Tomcat-9.0.46

搭建步骤同上

漏洞分析

org.apache.coyote.http11.Http11Processor中的prepareRequest函数下个断点,此函数作用就是在读取到请求头后,设置request filters

其中的一段逻辑是判断transfer-encoding,并且添加到inputFilters中,但只有http11会进入这段处理,从而导致了走私

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (http11) {
MessageBytes transferEncodingValueMB = headers.getValue("transfer-encoding");
if (transferEncodingValueMB != null) {
List<String> encodingNames = new ArrayList<>();
if (TokenList.parseTokenList(headers.values("transfer-encoding"), encodingNames)) {
for (String encodingName : encodingNames) {
// "identity" codings are ignored
addInputFilter(inputFilters, encodingName);
}
} else {
// Invalid transfer encoding
badRequest("http11processor.request.invalidTransferEncoding");
}
}
}

传入HTTP/1.1可以正常解析TE,接收的post数据是p

但如果传入HTTP/1.0,TE就不会被解析,会用CL来判断请求体

image-20221104160933518

官方修复

Process T-E header from both HTTP 1.0 and HTTP 1.1. clients · apache/tomcat@05f9e8b (github.com)

image-20221104160417455

复现

apache

apache收到的报文是正常

image-20221104161927360

但是转发出去的时候apache自动解析成了HTTP/1.1,并且自己计算了正确的CL来代替TE

image-20221104162035849

这样一来就没法触发tomcat得这个漏洞,得到的回显还是正常的

image-20221104162215691

Nginx

大概也不行,原文就没有复现成功

HAProxy

Traefik

Caddy

腾讯云 CDN

Aliyun CDN

Reference

Apache Tomcat HTTP请求走私(CVE-2021-33037)漏洞分析 - 先知社区 (aliyun.com)

(208条消息) Tomcat HTTP请求走私(CVE-2021-33037)_Iwanturoot的博客-CSDN博客