CVE-2022-31813:Apache HTTP Server HTTP转发地址Forword与mod_proxy漏洞利用
字数 1933 2025-08-24 16:48:07

Apache HTTP Server mod_proxy 漏洞分析 (CVE-2022-31813) 教学文档

1. 漏洞概述

CVE-2022-31813是Apache HTTP Server中mod_proxy模块的一个安全漏洞,影响版本从2.2.1到2.4.53。该漏洞允许攻击者通过精心构造的HTTP请求,绕过X-Forwarded标头的安全机制,可能导致IP欺骗、身份验证绕过等安全问题。

2. 背景知识

2.1 反向代理与X-Forwarded标头

现代Web架构通常使用反向代理来保护应用程序服务器。这带来了源IP地址管理问题,因为应用程序看到的请求IP是代理服务器的IP而非真实客户端IP。

解决方案是使用以下非标准标头:

  • X-Forwarded-For: 客户端IP地址及中间代理IP
  • X-Forwarded-Host: 原始Host标头值
  • X-Forwarded-Proto: 原始请求协议(HTTP/HTTPS)

2.2 逐跳(Hop-by-Hop)标头

HTTP协议定义了逐跳标头机制,指示代理哪些标头应被立即处理和删除,而非转发。默认逐跳标头包括:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade

其他标头可通过Connection标头显式指定为逐跳标头。

3. 漏洞分析

3.1 漏洞原理

mod_proxy在处理请求时存在两个问题:

  1. 添加X-Forwarded标头的代码(ap_proxy_create_hdrbrgd)在清除逐跳标头的代码(ap_proxy_clear_connection)之前执行
  2. 当X-Forwarded标头被列为逐跳标头时,mod_proxy会先添加这些标头,然后立即删除它们

3.2 代码分析

关键代码位于modules/proxy/proxy_util.c:

// 添加X-Forwarded标头 (约4050行)
if (dconf->add_forwarded_headers) {
    if (PROXYREQ_REVERSE == r->proxyreq) {
        apr_table_mergen(request_headers, "X-Forwarded-For", r->useragent_ip);
        if ((buf = apr_table_get(r->headers_in, "Host"))) {
            apr_table_mergen(request_headers, "X-Forwarded-Host", buf);
        }
        apr_table_mergen(request_headers, "X-Forwarded-Server", r->server->server_hostname);
    }
}

// 清除逐跳标头 (约4083行)
static int ap_proxy_clear_connection(request_rec *r, apr_table_t *headers) {
    // ...
    apr_table_do(find_conn_headers, &x, headers, "Connection", NULL);
    apr_table_unset(headers, "Connection");
    if (x.array) {
        for (i = 0; i < x.array->nelts; i++) {
            const char *name = APR_ARRAY_IDX(x.array, i, const char *);
            apr_table_unset(headers, name);
        }
    }
    // ...
}

3.3 漏洞影响

攻击者可构造如下请求:

curl -H "Connection: close, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Server" target_url

导致后端应用程序接收到的请求不包含任何X-Forwarded标头,误认为请求直接来自代理服务器。

4. 攻击场景

4.1 IP地址欺骗

当应用程序和Apache反向代理在同一主机时,攻击可使请求显示为来自localhost,可能绕过基于IP的访问控制。

4.2 主机注入/过滤器绕过

通过删除X-Forwarded-Host标头,可能访问后端服务器的默认虚拟主机,这些主机通常不对外开放。

4.3 拒绝服务

可滥用速率限制或反暴力破解机制,导致反向代理IP被列入黑名单。

4.4 框架特定影响

不同Web框架对X-Forwarded标头的处理方式不同:

ExpressJS

  • 使用trust proxy设置处理X-Forwarded标头
  • 无标头时使用代理服务器IP

Flask

  • 默认不信任X-Forwarded标头
  • 使用Werkzeug中间件处理
  • 无标头时保留实际请求值

Django

  • 自1.1版本移除了对X-Forwarded-For的支持
  • 推荐使用django-ipware
  • 高度可配置,但容易配置错误

Tomcat

  • 默认不考虑X-Forwarded标头
  • 提供RemoteIPValve处理
  • 无标头时保留受信任代理地址

5. 实际案例

CVE-2022-1388 (F5 BIG-IP漏洞)利用链中使用了类似技术:

Connection: X-F5-Auth-Token, X-Forwarded-Host

通过删除X-Forwarded-Host标头,使Jetty服务器将请求视为本地请求,从而绕过认证。

6. 修复方案

该漏洞已在Apache HTTPD 2.4.54版本中修复。修复方案包括调整标头处理顺序或修改逐跳标头处理逻辑。

7. 时间线

日期 事件
2022-05-10 向HTTPD安全团队报告问题
2022-05-18 初步被拒绝,后提供更多细节
2022-05-30 问题被采纳
2022-06-08 补丁发布
2022-06-09 CVE发布

8. 防御建议

  1. 升级到Apache HTTPD 2.4.54或更高版本
  2. 应用程序不应仅依赖X-Forwarded标头进行安全决策
  3. 配置Web框架时正确设置信任代理
  4. 实施多层防御机制,不只依赖IP地址验证

9. 参考链接

  1. Abusing HTTP Hop-by-Hop Request Headers
  2. F5 BIG-IP Remote Code Execution Vulnerability CVE-2022-1388
Apache HTTP Server mod_ proxy 漏洞分析 (CVE-2022-31813) 教学文档 1. 漏洞概述 CVE-2022-31813是Apache HTTP Server中mod_ proxy模块的一个安全漏洞,影响版本从2.2.1到2.4.53。该漏洞允许攻击者通过精心构造的HTTP请求,绕过X-Forwarded标头的安全机制,可能导致IP欺骗、身份验证绕过等安全问题。 2. 背景知识 2.1 反向代理与X-Forwarded标头 现代Web架构通常使用反向代理来保护应用程序服务器。这带来了源IP地址管理问题,因为应用程序看到的请求IP是代理服务器的IP而非真实客户端IP。 解决方案是使用以下非标准标头: X-Forwarded-For : 客户端IP地址及中间代理IP X-Forwarded-Host : 原始Host标头值 X-Forwarded-Proto : 原始请求协议(HTTP/HTTPS) 2.2 逐跳(Hop-by-Hop)标头 HTTP协议定义了逐跳标头机制,指示代理哪些标头应被立即处理和删除,而非转发。默认逐跳标头包括: Connection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgrade 其他标头可通过Connection标头显式指定为逐跳标头。 3. 漏洞分析 3.1 漏洞原理 mod_ proxy在处理请求时存在两个问题: 添加X-Forwarded标头的代码( ap_proxy_create_hdrbrgd )在清除逐跳标头的代码( ap_proxy_clear_connection )之前执行 当X-Forwarded标头被列为逐跳标头时,mod_ proxy会先添加这些标头,然后立即删除它们 3.2 代码分析 关键代码位于 modules/proxy/proxy_util.c : 3.3 漏洞影响 攻击者可构造如下请求: 导致后端应用程序接收到的请求不包含任何X-Forwarded标头,误认为请求直接来自代理服务器。 4. 攻击场景 4.1 IP地址欺骗 当应用程序和Apache反向代理在同一主机时,攻击可使请求显示为来自localhost,可能绕过基于IP的访问控制。 4.2 主机注入/过滤器绕过 通过删除X-Forwarded-Host标头,可能访问后端服务器的默认虚拟主机,这些主机通常不对外开放。 4.3 拒绝服务 可滥用速率限制或反暴力破解机制,导致反向代理IP被列入黑名单。 4.4 框架特定影响 不同Web框架对X-Forwarded标头的处理方式不同: ExpressJS 使用 trust proxy 设置处理X-Forwarded标头 无标头时使用代理服务器IP Flask 默认不信任X-Forwarded标头 使用Werkzeug中间件处理 无标头时保留实际请求值 Django 自1.1版本移除了对X-Forwarded-For的支持 推荐使用django-ipware 高度可配置,但容易配置错误 Tomcat 默认不考虑X-Forwarded标头 提供RemoteIPValve处理 无标头时保留受信任代理地址 5. 实际案例 CVE-2022-1388 (F5 BIG-IP漏洞)利用链中使用了类似技术: 通过删除X-Forwarded-Host标头,使Jetty服务器将请求视为本地请求,从而绕过认证。 6. 修复方案 该漏洞已在Apache HTTPD 2.4.54版本中修复。修复方案包括调整标头处理顺序或修改逐跳标头处理逻辑。 7. 时间线 | 日期 | 事件 | |------------|------| | 2022-05-10 | 向HTTPD安全团队报告问题 | | 2022-05-18 | 初步被拒绝,后提供更多细节 | | 2022-05-30 | 问题被采纳 | | 2022-06-08 | 补丁发布 | | 2022-06-09 | CVE发布 | 8. 防御建议 升级到Apache HTTPD 2.4.54或更高版本 应用程序不应仅依赖X-Forwarded标头进行安全决策 配置Web框架时正确设置信任代理 实施多层防御机制,不只依赖IP地址验证 9. 参考链接 Abusing HTTP Hop-by-Hop Request Headers F5 BIG-IP Remote Code Execution Vulnerability CVE-2022-1388