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函数中:

  1. 该函数在对路径参数进行规范化时会先进行URL解码
  2. 然后判断是否存在../的路径穿越符
  3. 漏洞点在于对%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,但仍然存在二次解码问题:

  1. 在处理HTTP请求时,ap_process_request_internal函数会:

    • 先调用ap_normalize_path进行一次URL解码
    • 然后调用ap_unescape_url进行二次解码
  2. 攻击者可以使用双重编码绕过:

    • 第一次编码:%%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版本中进行了多处修改,核心修复包括:

  1. ap_normalize_path中加强了对URL编码的校验
  2. 如果检测到非标准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; // 无效编码
    }
}

防护建议

  1. 及时升级到Apache HTTP Server 2.4.51或更高版本

  2. 如果无法立即升级,可以:

    • 禁用CGI功能
    • 使用mod_rewrite等模块限制可疑的URL模式
    • 设置严格的目录访问权限
  3. 监控服务器日志中可疑的路径穿越尝试

总结

这两个漏洞展示了Web服务器路径处理中的常见安全问题:

  • 不完全的输入验证
  • 多重解码导致的逻辑绕过
  • 规范化处理顺序不当

理解这些漏洞有助于开发更安全的路径处理逻辑,并强调了在Web应用开发中进行彻底输入验证的重要性。

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 (解码为 . )的处理不完善 具体问题代码: 当路径中存在 %2e./ 形式时会被检测到,但 .%2e/ 形式则不会被检测为路径穿越符,因为: 遍历到第一个 . 字符时,检测到后面是 %2 而不是 ./ 因此不会将其当作路径穿越符处理 漏洞利用 攻击者可以使用以下形式的payload进行利用: 或: 漏洞修复 Apache在2.4.50版本中修复了此漏洞,主要修改了 ap_normalize_path 函数,增加了对 .%2e 形式的检测: CVE-2021-42013 漏洞分析 漏洞成因 尽管2.4.50版本修复了CVE-2021-41773,但仍然存在二次解码问题: 在处理HTTP请求时, ap_process_request_internal 函数会: 先调用 ap_normalize_path 进行一次URL解码 然后调用 ap_unescape_url 进行二次解码 攻击者可以使用双重编码绕过: 第一次编码: %%32e → %2e 第二次编码: %2e → . 处理流程示例: 漏洞利用 攻击payload示例: 漏洞修复 Apache在2.4.51版本中进行了多处修改,核心修复包括: 在 ap_normalize_path 中加强了对URL编码的校验 如果检测到非标准URL编码( % 后不跟两个十六进制字符),则返回编码错误 修复代码: 防护建议 及时升级到Apache HTTP Server 2.4.51或更高版本 如果无法立即升级,可以: 禁用CGI功能 使用mod_ rewrite等模块限制可疑的URL模式 设置严格的目录访问权限 监控服务器日志中可疑的路径穿越尝试 总结 这两个漏洞展示了Web服务器路径处理中的常见安全问题: 不完全的输入验证 多重解码导致的逻辑绕过 规范化处理顺序不当 理解这些漏洞有助于开发更安全的路径处理逻辑,并强调了在Web应用开发中进行彻底输入验证的重要性。