应直接查日志中..%2f、%2e%2e%2f等编码路径穿越特征,因攻击者极少用明文../;apache默认记录解码前uri,需匹配各类编码变种并整行扫描%r字段。

直接查日志里带编码的路径穿越特征,比盯着明文../有效得多——真实攻击几乎不用明文点点斜杠。
重点匹配解码前的原始 URI 字段(%r)
Apache 默认记录的是未解码的原始请求 URI,所以攻击者常用的 %2e%2e%2f、..%2F、%c0%ae%c0%ae%2f(UTF-8 超范围绕过)都会原样留在 access.log 的 %r 字段中。别只扫日志行末状态码或 IP,必须整行扫描 $1(即 %r 对应字段)。
- 常用 grep 命令示例:
grep -E "\.\./|\.\.%2[fF]|%2e%2e%2[fF]|%c0%ae%c0%ae%2f" /var/log/apache2/access.log - 若用 awk 处理自定义格式日志,确保提取的是第一个字段(即
%r),例如:awk '$1 ~ /\.\./ || $1 ~ /%2e%2e%2f/ {print}' access.log - 注意大小写和 URL 编码变种:如
%2E%2E%2F、%5c%5c(双反斜杠)、..\/(混合写法)都得纳入正则覆盖范围
警惕 query string 里的隐藏穿越参数
攻击常藏在 GET 或 POST 的查询参数中,比如:/api/download?file=..%2F..%2Fetc%2Fshadow 或 /index.php?page=php://filter/convert.base64-encode/resource=..%2F..%2Fconfig.php。这类请求在日志里仍是 200 状态,但后端已执行越权读取。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不能只查 URI 路径部分,要整行匹配,尤其关注含
?file=、?path=、?page=、?url=的请求 - 配合
grep -i "file=" access.log | grep -E "\.\.|%2e"快速定位可疑参数组合 - 发现高频类似模式(如同一 IP 多次请求不同
..%2f拼接路径),极可能是自动化探测
别被 200/302 状态码误导
很多路径穿越请求返回 200,并非成功防御,而是后端应用(如 PHP 的 file_get_contents())自己解析并读取了敏感文件;还有些会触发 302 跳转,日志里只记两次跳转,但第二次响应体可能已泄露 /etc/passwd 内容。
- 查 error.log 同步辅助判断:
grep -i "open_basedir\|failed to open stream\|No such file or directory" /var/log/apache2/error.log—— 这类报错往往是穿越已触发但被 PHP 层拦截的痕迹 - 留意返回内容长度异常大的 200 请求(可用
awk '{print $NF, $10}' access.log | sort -nr | head查响应字节数 Top) - 对含
302且跳转目标含%2e或明显路径穿越结构的请求,人工抽样检查响应体
避免监控盲区:日志轮转与采集陷阱
logrotate 配置不当或日志采集延迟,会让低频探测完全逃过监控。比如 copytruncate 可能导致 tail -F 丢掉最后几秒日志;Filebeat 若设 close_inactive: 1m,小流量服务的日志文件易被提前关闭,造成偏移错乱。
- logrotate 推荐改用
create 640 root root+delaycompress,不依赖copytruncate - 用 Filebeat 时,
close_inactive建议设为5m以上,scan_frequency不低于10s - 对低 QPS 服务,禁用日志采样(如 ELK 的 sampling filter),否则单日仅几次的探测行为基本不会被捕获










