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地址及中间代理IPX-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:
// 添加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. 防御建议
- 升级到Apache HTTPD 2.4.54或更高版本
- 应用程序不应仅依赖X-Forwarded标头进行安全决策
- 配置Web框架时正确设置信任代理
- 实施多层防御机制,不只依赖IP地址验证