应直接扫描日志中未解码的原始URI字段(%r),覆盖明文及各类编码变种的路径穿越特征,如%2e%2e%2f、%c0%ae%c0%ae%2f等,并在Apache接入层用mod_security配合REQUEST_URI和SecUnicodeMapFile主动拦截,而非仅依赖日志告警。

直接查日志里带编码的路径穿越特征,比盯着明文../有效得多——真实攻击几乎从不用明文点点斜杠。
重点匹配解码前的原始 URI 字段(%r)
Apache 默认在 %r 字段记录的是未解码的原始请求行,所以 URL 编码字符(如 %2e%2e%2f)会原样保留。这意味着你必须整行扫描 %r,不能只 grep 路径部分,因为攻击可能藏在 query string 里,例如:
GET /api/download?file=..%2F..%2Fetc%2Fshadow HTTP/1.1POST /upload HTTP/1.1 ... body: path=%c0%ae%c0%ae%2fproc%2fself%2fenviron
推荐用 awk '{print }' 提取 %r 字段再过滤,或用 grep -E 直接全行匹配。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
必须覆盖的编码变种与绕过写法
攻击者常混用大小写、双字节、超范围 UTF-8 等方式绕过简单规则。以下正则模式应全部纳入扫描:
-
../(明文,虽少但不可忽略) -
%2e%2e%2f、%2E%2E%2F(小写/大写 URL 编码) -
%c0%ae%c0%ae%2f(UTF-8 超范围绕过,%c0%ae被某些解析器视为.) -
..\、%2e%2e%5c(Windows 风格路径分隔符) -
%u002e%u002e%u002f(Unicode 编码,部分旧模块仍支持)
别只靠日志告警,得在接入层主动拦截
日志发现是事后响应,真正能拦住请求的是 Apache 接入层规则。mod_security 是最直接的选择,但要注意几点:
- 规则必须放在全局作用域(如
<Directory "/">),不能仅限<LocationMatch>,否则 query 中的攻击会被跳过 - 用
REQUEST_URI变量而非REQUEST_FILENAME,因路径穿越发生在解析前 - 启用
SecUnicodeMapFile并配置 UTF-8 映射,否则%c0%ae类绕过无效 - 示例规则:
SecRule REQUEST_URI "@rx ../" "id:1001,deny,status:403,msg:'Path traversal detected'"
警惕“成功”响应背后的越权事实
很多路径穿越请求返回 200,日志里看不到 403/404,不代表安全——它们可能已被后端应用(如 PHP 的 file_get_contents())直接处理并吐出敏感内容。要特别注意:
- 错误日志中出现
open_basedir restriction、failed to open stream: No such file等提示,说明越权已触发但被拦截 - 访问日志中连续出现 302 跳转:第一个请求 302 到某路径,第二个请求又 200 返回文件内容,这是典型绕过手法
- 返回体含
/etc/passwd结构、SSH 密钥、数据库连接串等,哪怕状态码是 200,也是已失陷信号

















