apache mod_rewrite 安全审计需重点核查规则是否信任外部输入、绕过host校验或引发无限跳转:检查rewriterule是否直接拼接%{query_string}等可控参数导致开放重定向;验证rewritecond是否强制校验%{http_host};审计重定向状态码避免误用r=301;确认allowoverride权限与mod_rewrite启用状态。

Apache 的 mod_rewrite 本身是中性工具,但配置不当极易成为重定向漏洞(如开放重定向、Host 头劫持、无限跳转)的温床。安全审计时不能只看“有没有用 rewrite”,而要重点核查规则是否引入信任外部输入、是否绕过 Host 校验、是否暴露重定向逻辑。
检查 RewriteRule 是否直接拼接用户可控参数
开放重定向漏洞最常见于将 %{QUERY_STRING}、%{REQUEST_URI} 或正则捕获组未经校验就用于重定向目标。例如:
- 危险写法:
RewriteRule ^/go$ https://example.com/%{QUERY_STRING} [R=302,L]—— 攻击者访问/go?url=https://evil.com即可跳转到任意地址; - 安全做法:禁用此类动态拼接,或白名单校验跳转目标。若必须支持内部跳转,应严格匹配预设路径,如:
RewriteCond %{QUERY_STRING} ^url=(/login|/dashboard|/profile)$,再重定向到https://example.com/%1。
验证 RewriteCond 是否强制校验 HTTP_HOST
当重定向指向子域名或外部服务时,必须用 RewriteCond %{HTTP_HOST} 明确限定触发条件,否则子站请求也会被误重定向,引发循环或越权跳转:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 错误配置:
RewriteRule ^/old\.php$ https://new.example.com/ [R=302,L]—— 若 new.example.com 与主站共用同一 Apache 实例且加载相同 .htaccess,就会无限跳转; - 正确配置:
RewriteCond %{HTTP_HOST} ^(www\.)?old\.example\.com$ [NC]+RewriteRule ^/old\.php$ https://new.example.com/ [R=302,L],确保仅原始域名请求才触发。
审计重定向状态码与缓存风险
301 永久重定向一旦被浏览器或 CDN 缓存,后续修复极难生效,审计需特别关注:
- 所有测试阶段和临时策略必须使用 R=302,禁止在未验证前上线 R=301;
- 若已误配 301,需通知运维清理 CDN 缓存,并在客户端侧通过
Cache-Control: no-store响应头辅助降级; - 避免在重定向 URL 中携带敏感参数(如 token、session_id),防止泄露至 Referer 或服务器日志。
确认 .htaccess 权限与模块启用范围
攻击者可能通过上传恶意 .htaccess 绕过主配置,因此审计要覆盖底层防护:
- 检查主配置中对应目录是否设置
AllowOverride None或仅允许必要指令(如AllowOverride FileInfo),禁用AllowOverride All; - 运行
apache2ctl -M | grep rewrite确认 mod_rewrite 已启用——看似矛盾,实则关键:若审计发现某站点声称“禁用重写”却仍存在 .htaccess 重定向行为,说明配置失效或被绕过; - 排查是否存在未授权的 .htaccess 文件(尤其上传目录、静态资源目录),它们可能注入
RewriteRule .* https://phishing.site/ [R=302,L]类规则。









