跳转到帖子

漏洞库实战条目:Apache HTTP Server 2.4.49 路径穿越漏洞(CVE-2021-41773)验证、内网影响与修复

精选回复

发布于

本文作为漏洞库中的实战验证条目,针对 Apache HTTP Server 2.4.49 路径穿越漏洞 CVE-2021-41773,覆盖版本确认、低风险验证、日志定位、权限边界判断及修复检查。测试仅适用于已获得授权的主机和站点,验证时不执行命令、不上传文件,也不读取业务敏感数据。

一、漏洞背景与适用范围

CVE-2021-41773 影响 Apache HTTP Server 2.4.49。由于路径规范化处理不完整,攻击者可能通过编码后的路径跳转到站点目录之外,读取 Web 进程有权限访问的文件。在启用 CGI 且配置允许执行脚本的情况下,风险可能进一步扩大。Apache 2.4.50 的修复并不完整,实际修复版本应至少升级到 2.4.51。

该漏洞的影响取决于三个条件:Apache 版本、请求路径映射方式,以及运行用户对文件系统的权限。即使验证能够读取系统文件,也不能直接等同于已经获得服务器控制权,应继续确认 Web 进程用户、目录权限和 CGI 配置。

二、问题定位与版本确认

优先在服务器本地确认版本,避免仅依赖 HTTP 响应头。不同发行版的包名略有差异,以下命令适用于常见 Linux 环境:

apachectl -v
httpd -v

# Debian/Ubuntu
 dpkg-query -W -f='${Package} ${Version}\n' apache2 2>/dev/null

# RHEL/CentOS/Rocky/AlmaLinux
rpm -q httpd 2>/dev/null

# 查看实际运行进程与启动参数
ps -eo user,pid,ppid,args | grep '[a]pache2\|[h]ttpd'

如果只能进行远程黑盒测试,可记录 Server 响应头作为线索,但不能将其作为唯一证据。生产环境通常会通过 ServerTokens Prod 隐藏小版本,版本判断应结合资产清单、软件包信息或主机侧核验。

三、低风险漏洞验证

验证目标应选择测试站点或专门准备的无敏感文件。下面的请求只验证路径是否被异常解析,不包含命令执行、写文件或利用 CGI 的内容。建议先使用一个不存在的路径观察返回,再使用测试目录进行对比。

目标='

# 先记录正常响应
curl -k -i --path-as-is "$目标/does-not-exist" -o normal.txt

# 仅发送路径穿越验证请求;不要替换为真实敏感文件
curl -k -i --path-as-is "$目标/cgi-bin/.%2e/.%2e/.%2e/.%2e/var/www/html/.vuln-test-marker" -o traversal.txt

# 对比状态码、Content-Length、响应体特征
sed -n '1,20p' normal.txt
sed -n '1,20p' traversal.txt

--path-as-is 用于避免客户端提前规范化 URL。验证时不要直接请求 /etc/passwd、应用配置文件或数据库凭据文件;在授权测试环境中,可以由运维人员预先在站点目录外放置内容无害的标记文件,并在测试结束后删除。

判定依据不能只看 200 状态码。应同时确认:请求路径包含编码后的上级目录;响应内容与站点根目录外的测试标记一致;Web 访问日志中存在对应请求;服务器版本或补丁状态与受影响范围相符。若返回 403、404 或统一错误页,通常说明该路径映射未触发漏洞,但仍需结合反向代理、WAF 和后端 Apache 的实际日志判断。

四、技术分析与权限边界

漏洞本质是 URL 路径在别名、目录映射或 CGI 路径处理前后没有被一致地规范化。攻击者构造包含编码点段的路径后,可能突破预期的目录边界。是否能够读取文件,取决于 Apache 子进程运行账号以及目标文件的 UNIX 权限。

在主机侧重点确认以下内容:

  • Apache 工作进程是否以专用低权限账号运行,例如 www-data 或 apache,避免使用 root 直接处理请求。
  • 站点目录、上传目录和备份目录是否存在对 Web 账号的写权限。
  • 是否启用 CGI,相关目录是否包含可执行脚本。
  • 是否存在反向代理、Alias、容器挂载或软链接,使 Web 目录之外的文件进入可访问范围。
# 查看 Apache 关键目录与 CGI 配置
apachectl -t -D DUMP_RUN_CFG 2>/dev/null | egrep -i 'ServerRoot|DocumentRoot|ScriptAlias|User|Group'
grep -RniE 'ScriptAlias|ExecCGI|AllowOverride|Require all granted|Alias' /etc/apache2 /etc/httpd 2>/dev/null

# 查看站点目录权限,示例路径请按实际环境替换
namei -l /var/www/html
find /var/www -maxdepth 3 -type d -perm -0002 -ls 2>/dev/null

# 查看 Apache 进程实际身份
ps -eo user,group,pid,args | grep '[a]pache2\|[h]ttpd'

如果发现 Web 账号可写入站点目录,应将其作为独立风险处理:漏洞读取能力与可写目录组合后,可能形成文件篡改、持久化或进一步影响应用的链路。授权测试中应停止在“读取证明”阶段,不上传 WebShell,不修改启动项,也不尝试提权;只记录权限关系并交由系统负责人复核。

五、日志留痕与排查方法

Apache 默认访问日志通常位于 /var/log/apache2/access.log 或 /var/log/httpd/access_log。重点检索编码点段、cgi-bin、异常 400/403/404,以及同一来源地址在短时间内的大量路径请求。

# Debian/Ubuntu
zgrep -hE '(%2e|%2E|\.\./|cgi-bin)' /var/log/apache2/access.log* 2>/dev/null | tail -n 100

# RHEL 系列
zgrep -hE '(%2e|%2E|\.\./|cgi-bin)' /var/log/httpd/access_log* 2>/dev/null | tail -n 100

# systemd 环境下查看 Apache 服务日志
journalctl -u apache2 --since '24 hours ago' 2>/dev/null | grep -Ei '%2e|\.\./|cgi-bin'
journalctl -u httpd --since '24 hours ago' 2>/dev/null | grep -Ei '%2e|\.\./|cgi-bin'

排查时应保留请求时间、源 IP、Host、完整 URI、状态码、响应大小、User-Agent 和上游代理标识,并与 WAF、负载均衡及主机审计日志对齐。若已经确认存在异常访问,应进一步检查站点目录近期文件变更、Apache 配置变更、计划任务和异常外联,但不要因为单条扫描请求就直接认定已经入侵。

六、修复与复测建议

  • 将 Apache HTTP Server 升级到 2.4.51 或发行版提供的包含修复补丁的最新安全版本,并重启服务使新二进制生效。
  • 在升级前临时关闭不需要的 CGI、ScriptAlias 和不必要的 Alias 映射;不要把 WAF 规则当作永久修复。
  • 收紧 Web 进程权限,确保其不能写入代码目录、配置目录和系统敏感路径;上传目录应与可执行目录分离。
  • 检查反向代理是否保留原始编码路径,确保前后端路径规范化策略一致。
  • 修复后重新执行版本核验和无害标记文件测试,并确认访问日志中能够完整记录请求。
# 修复后的基本检查
apachectl -v
apachectl -t
systemctl restart apache2 2>/dev/null || systemctl restart httpd
systemctl is-active apache2 2>/dev/null || systemctl is-active httpd

# 确认配置语法和进程版本
apachectl -t -D DUMP_MODULES 2>/dev/null | grep -Ei 'cgi|alias'

七、风险结论

该漏洞的确认应以“受影响版本或补丁状态 + 可重复的无害路径验证 + 日志证据”作为闭环。仅凭 Server 头、扫描器指纹或 404 响应不能直接判定漏洞存在。完成修复后,还应复核 Web 进程权限、CGI 开关、Alias 配置和站点目录写权限,避免形成新的权限边界问题。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
漏洞验证与修复流程示意图
漏洞成因、验证条件与修复闭环示意

这个条目建议把“版本命中”和“实际可利用性”分开写。CVE-2021-41773 只影响 Apache HTTP Server 2.4.49;升级到 2.4.50 也不算彻底修复,因为随后还有 CVE-2021-42013,生产环境应直接升级到 2.4.51 或发行版提供的安全回补版本。

排查时先确认实际运行版本和编译模块,不要只看安装包版本:

httpd -v
httpd -M
apachectl -S
ps -ef | grep '[h]ttpd'

验证建议在隔离环境进行,并准备一个无敏感信息的 canary 文件,通过异常路径访问时观察是否能越过站点根目录。不要直接读取 /etc/passwd 等系统文件,也不要在生产环境反复尝试。重点看响应状态、返回内容长度,以及 access/error 日志中是否出现异常编码路径:

tail -f /var/log/httpd/access_log /var/log/httpd/error_log
# Debian/Ubuntu 常见路径:
tail -f /var/log/apache2/access.log /var/log/apache2/error.log

影响评估不能只停留在“能读文件”。如果启用了 mod_cgi 或 mod_cgid,并且 CGI 目录、脚本权限和请求路径组合满足条件,还要进一步评估是否存在命令执行风险;同时检查 Alias、ScriptAlias、反向代理路径和容器挂载目录,确认 Web 进程账户能访问哪些内网配置、密钥和云凭据。建议按 Web 进程身份核对权限:

ps -o user,group,cmd -C httpd
find /var/www /etc/apache2 /etc/httpd -xdev -type f -perm -004 -ls
grep -RniE 'Alias|ScriptAlias|ExecCGI|Require all granted' \
  /etc/apache2 /etc/httpd 2>/dev/null

修复后除了升级,还应重启并确认实际进程已经加载新版本:

# Debian/Ubuntu
apt update
apt install --only-upgrade apache2
systemctl restart apache2
apachectl -v

# RHEL/CentOS 系
yum update httpd
systemctl restart httpd
httpd -v

临时缓解可以收紧目录授权,避免对根目录使用过宽的 Require all granted,并在 WAF 或反向代理层拦截异常的点号段、双重 URL 编码和路径规范化前后的不一致请求。但这只能降低暴露面,不能替代升级。修复后应从访问日志中检索 2021 年公开利用常见的编码路径,结合 Web、主机和身份认证日志排查是否有文件读取、CGI 调用、凭据访问及后续横向行为。

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。