CVE-2021-41773和CVE-2021-42013漏洞分析
字数 1140 2025-08-03 16:42:44
Apache HTTP Server 路径穿越漏洞分析 (CVE-2021-41773 & CVE-2021-42013)
漏洞概述
这两个漏洞是Apache HTTP Server中的路径穿越漏洞,允许攻击者通过精心构造的URL访问服务器文件系统中的任意文件。CVE-2021-41773影响2.4.49版本,而CVE-2021-42013影响2.4.50版本。
CVE-2021-41773 漏洞分析
漏洞成因
漏洞存在于Apache HTTP Server 2.4.49版本的ap_normalize_path函数中:
- 该函数在对路径参数进行规范化时会先进行URL解码
- 然后判断是否存在
../的路径穿越符 - 漏洞点在于对
%2e(解码为.)的处理不完善
具体问题代码:
if (path[l] == '%' && apr_isxdigit(path[l + 1]) && apr_isxdigit(path[l + 2])) {
const char c = x2c(&path[l + 1]);
if (apr_isalnum(c) || (c && strchr("-._~", c))) {
l += 2;
path[l] = c;
}
}
当路径中存在%2e./形式时会被检测到,但.%2e/形式则不会被检测为路径穿越符,因为:
- 遍历到第一个
.字符时,检测到后面是%2而不是./ - 因此不会将其当作路径穿越符处理
漏洞利用
攻击者可以使用以下形式的payload进行利用:
/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
或:
/icons/%2e%2e/%2e%2e/%2e%2e/etc/passwd
漏洞修复
Apache在2.4.50版本中修复了此漏洞,主要修改了ap_normalize_path函数,增加了对.%2e形式的检测:
if ((path[n] == '.' || (decode_unreserved
&& path[n] == '%'
&& path[++n] == '2'
&& (path[++n] == 'e'
|| path[n] == 'E')))
&& IS_SLASH_OR_NUL(path[n + 1])) {
// 处理路径穿越
}
CVE-2021-42013 漏洞分析
漏洞成因
尽管2.4.50版本修复了CVE-2021-41773,但仍然存在二次解码问题:
-
在处理HTTP请求时,
ap_process_request_internal函数会:- 先调用
ap_normalize_path进行一次URL解码 - 然后调用
ap_unescape_url进行二次解码
- 先调用
-
攻击者可以使用双重编码绕过:
- 第一次编码:
%%32e→%2e - 第二次编码:
%2e→.
- 第一次编码:
处理流程示例:
原始输入: /icons/.%%32e/.%%32e/.%%32e/.%%32e/etc/passwd
第一次解码后: /icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
第二次解码后: /icons/../../../../etc/passwd
漏洞利用
攻击payload示例:
curl -v --path-as-is http://target:8080/icons/.%%32e/.%%32e/.%%32e/.%%32e/etc/passwd
漏洞修复
Apache在2.4.51版本中进行了多处修改,核心修复包括:
- 在
ap_normalize_path中加强了对URL编码的校验 - 如果检测到非标准URL编码(
%后不跟两个十六进制字符),则返回编码错误
修复代码:
if (decode_unreserved && path[l] == '%') {
if (apr_isxdigit(path[l + 1]) && apr_isxdigit(path[l + 2])) {
const char c = x2c(&path[l + 1]);
if (TEST_CHAR(c, T_URI_UNRESERVED)) {
l += 2;
path[l] = c;
}
}
else {
ret = 0; // 无效编码
}
}
防护建议
-
及时升级到Apache HTTP Server 2.4.51或更高版本
-
如果无法立即升级,可以:
- 禁用CGI功能
- 使用mod_rewrite等模块限制可疑的URL模式
- 设置严格的目录访问权限
-
监控服务器日志中可疑的路径穿越尝试
总结
这两个漏洞展示了Web服务器路径处理中的常见安全问题:
- 不完全的输入验证
- 多重解码导致的逻辑绕过
- 规范化处理顺序不当
理解这些漏洞有助于开发更安全的路径处理逻辑,并强调了在Web应用开发中进行彻底输入验证的重要性。