Apache HTTP Server 请求走私漏洞 (CVE-2023-25690) 分析与利用
漏洞概述
CVE-2023-25690 是 Apache HTTP Server (httpd) 中的一个请求走私漏洞,影响版本从 2.4.0 到 2.4.55。该漏洞存在于特定配置下的 mod_proxy 模块中,当与 RewriteRule 或 ProxyPassMatch 结合使用时,可能导致请求走私攻击。
漏洞原理
根本原因
漏洞源于 Apache 的变量替换机制在处理代理请求时的缺陷。当满足以下条件时,攻击者可以构造恶意请求:
- 启用了 mod_proxy 模块
- 配置了特定的 RewriteRule 或 ProxyPassMatch 规则
- 这些规则匹配了用户提供的 URL 的某些部分
在这种情况下,变量替换会导致代理请求目标错误,从而允许请求拆分和走私。
技术细节
当使用包含反向引用的 RewriteRule 或 ProxyPassMatch 时,例如:
RewriteRule "^/here/(.*)" "http://example.com:8080/elsewhere?$1" [P]
ProxyPassMatch "^/here/(.*)" "http://example.com:8080/elsewhere?$1"
攻击者可以构造包含换行符的恶意请求,导致代理请求被错误解析。例如:
GET /here/%0aHost:%20foo.com HTTP/1.1
在处理时,反向引用会包含换行符,导致代理请求的 Host 头被修改,从而可能绕过安全限制或导致缓存污染。
影响版本
- Apache HTTP Server 2.4.0 至 2.4.55
漏洞利用
前置条件
- 服务器启用了 mod_proxy 模块
- 配置中包含 RewriteRule 或 ProxyPassMatch 规则,且使用了反向引用 (\(1, \)2 等)
- 反向引用被用于构造代理目标 URL
利用方法
请求走私示例
假设有以下配置:
RewriteEngine On
RewriteRule "^/proxy/(.*)" "http://backend/$1" [P]
攻击者可以发送如下恶意请求:
GET /proxy/%0aHost:%20evil.com HTTP/1.1
Host: vulnerable.com
后端服务器实际收到的请求可能变为:
GET / HTTP/1.1
Host: evil.com
缓存投毒示例
通过精心构造的请求,攻击者可以:
- 毒化代理或 CDN 缓存
- 使缓存服务器存储恶意内容
- 当其他用户请求相同资源时,返回被污染的响应
权限绕过示例
利用请求走私,攻击者可能:
- 绕过基于 Host 头的访问控制
- 访问本应被限制的内部服务
- 绕过身份验证机制
缓解措施
官方补丁
升级到 Apache HTTP Server 2.4.56 或更高版本,该版本修复了此漏洞。
临时解决方案
如果无法立即升级,可以采取以下措施:
- 检查并修改 RewriteRule 和 ProxyPassMatch 配置,避免使用用户输入直接构造代理目标
- 对反向引用中的数据进行严格过滤,移除换行符等特殊字符
- 限制 mod_proxy 的使用范围,仅代理必要的路径
配置示例
不安全的配置:
RewriteRule "^/proxy/(.*)" "http://backend/$1" [P]
安全的配置:
RewriteRule "^/proxy/([a-zA-Z0-9-_./]+)" "http://backend/$1" [P]
检测方法
手动检测
- 检查服务器是否使用了 mod_proxy
- 检查 RewriteRule 和 ProxyPassMatch 配置
- 查找使用反向引用 (\(1, \)2 等) 构造代理目标的规则
自动化检测
可以使用以下工具检测潜在的漏洞配置:
- Apache 配置扫描工具
- 自定义脚本检查 httpd.conf 和 .htaccess 文件
- 漏洞扫描器如 Nessus, Qualys 等
深入分析
变量替换机制
Apache 在处理 RewriteRule 和 ProxyPassMatch 时,会对反向引用进行变量替换。当用户输入包含特殊字符(如换行符)时,这些字符会被保留在替换后的字符串中,导致请求解析异常。
代理请求构造
在构造代理请求时,Apache 会:
- 解析原始请求
- 应用重写规则
- 构造新的代理请求
- 发送到后端服务器
漏洞出现在第3步,当构造代理请求时,未正确处理包含特殊字符的反向引用。
实际案例
假设有以下配置:
ProxyPassMatch "^/api/(.*)" "http://internal-api/$1"
攻击者可以发送:
GET /api/%0aX-Forwarded-Host:%20evil.com%0a%0aGET%20/%20HTTP/1.1%0aHost:%20internal-api HTTP/1.1
这可能导致两个请求被发送到后端服务器,其中第二个请求可能绕过安全检查。
开发建议
- 避免直接使用用户输入构造代理目标
- 对反向引用中的数据进行严格过滤
- 考虑使用更安全的替代方案,如 API 网关
- 实施最小权限原则,限制代理功能的范围
总结
CVE-2023-25690 是一个严重的请求走私漏洞,影响广泛使用的 Apache HTTP Server。通过精心构造的请求,攻击者可以绕过安全限制、毒化缓存或访问内部服务。管理员应立即升级到修复版本或实施缓解措施,开发者应审查相关配置以避免类似漏洞。