目录遍历泄露如何拦截

wen 网络安全 34

本文目录导读:

目录遍历泄露如何拦截

  1. Web应用防火墙(WAF)拦截
  2. 中间件/服务器层防护
  3. 应用层代码安全(Java/Python/Node.js)
  4. 增强防御措施(覆盖编码绕过)
  5. 监控与应急响应
  6. 最佳实践组合

目录遍历漏洞(Path Traversal/Directory Traversal)的拦截可以从Web应用防火墙(WAF)配置中间件/服务器加固应用层代码安全三个维度进行综合防御,以下是具体实施方案:


Web应用防火墙(WAF)拦截

核心特征检测规则

# 基于NGINX的WAF规则示例(ModSecurity CRS核心规则集)
SecRule REQUEST_URI "@rx (?:\.\./|\.\.\\)" \
  "id:1000,phase:1,deny,status:403,msg:'Directory Traversal Attempt'"
# 路径编码绕过检测
SecRule ARGS "@rx (?:%2e%2e%2f|%2e%2e%5c|\.\.[/\\])" \
  "id:1001,phase:2,deny,t:urlDecodeUni"

云WAF配置要点(以阿里云WAF为例)

  • 开启目录遍历防护开关(默认规则库包括、等模式)
  • 自定义规则字段:Request URIGET参数 匹配正则
  • %2e%2e%2f等URL编码变形进行双重解码检测

商业WAF(CloudFlare/AWS WAF)配置

// AWS WAF SQL注入+目录遍历组合规则示例
{
  "Name": "directory-traversal-block",
  "Priority": 10,
  "Action": "BLOCK",
  "Statement": {
    "RegexPatternSetReferenceStatement": {
      "Arn": "arn:aws:wafv2:...:regex-pattern-set/directory-traversal",
      "RegexPatternSet": ["\\.\\./", "\\.\\.\\\\", "%2e%2e%2f"]
    }
  }
}

中间件/服务器层防护

Nginx配置示例

# 全局过滤目录遍历字符
if ($request_uri ~* "(\/\.\.\/|%2e%2e%2f|\.\.\\\\)") {
    return 403;
}
# 精确控制文件访问路径
location /downloads/ {
    alias /data/files/;
    # 禁止访问上层目录
    location ~ /\.\./ {
        deny all;
    }
}

Apache配置示例

# .htaccess 配置
RewriteEngine On
# 拦截../及编码变体
RewriteRule (.*)(\.\.\\/|%2e%2e%2f|..\\)(.*) - [F]
# 禁止路径穿越符号
<DirectoryMatch "/\.\./">
    Order Allow,Deny
    Deny from all
</DirectoryMatch>

Tomcat/Jetty配置

<!-- Tomcat: web.xml 禁止路径遍历 -->
<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

应用层代码安全(Java/Python/Node.js)

Java示例(规范路径校验)

import java.nio.file.Path;
import java.nio.file.Paths;
public boolean safePath(String userInput) {
    // 1. 规范化路径
    Path basePath = Paths.get("/data/uploads").normalize();
    Path resolvedPath = basePath.resolve(userInput).normalize();
    // 2. 检查是否在允许范围内
    if (!resolvedPath.startsWith(basePath)) {
        return false; // 检测到目录遍历
    }
    // 3. 检查路径编码解码
    if (userInput.contains("../") || userInput.contains("..\\")) {
        return false;
    }
    return true;
}

Python示例(白名单+严格路径解析)

import os
import posixpath
def safe_file_read(base_dir, user_input):
    # 1. 使用白名单限制访问目录
    if not base_dir.startswith('/safe/path/'):
        return 'Invalid base path'
    # 2. 规范化路径
    full_path = os.path.normpath(os.path.join(base_dir, user_input))
    # 3. 验证路径在允许范围内
    if not full_path.startswith(base_dir):
        raise ValueError("Path traversal detected")
    # 4. 额外检测编码绕过 (如 %2e%2e%2f)
    import urllib.parse
    decoded = urllib.parse.unquote(user_input)
    if '..' in decoded:
        return 'Encoding bypass attempt'
    with open(full_path, 'r') as f:
        return f.read()

Node.js示例(中间件模式)

const path = require('path');
const { URL } = require('url');
// Express中间件
function dirTraversalProtection(req, res, next) {
  const param = req.query.file || req.path;
  // 1. 规范化路径
  const fullPath = path.normalize('/app/public/' + param);
  // 2. 检查是否越界
  if (!fullPath.startsWith('/app/public/')) {
    return res.status(403).send('Directory traversal blocked');
  }
  // 3. 检测编码绕过
  const decoded = decodeURIComponent(param);
  if (decoded.includes('..') || decoded.includes('..\\')) {
    return res.status(403).send('Encoding bypass blocked');
  }
  next();
}

增强防御措施(覆盖编码绕过)

常见编码绕过模式检测

# 综合检测正则(支持16进制、双重编码)
(?:\.\.\\/|\.\.\\)  # 原始字符
| (?:%2e%2e%2f|%252e%252e%252f)  # URL编码
| (?:\.\.\\\\|%5c%5c)  # 反斜杠变体
| (?:%c0%ae%c0%ae%c0%af)  # UTF-8过载编码

中间件层双重解码

# NGINX强制对请求进行两次URL解码后匹配
location / {
  set $decoded_uri $uri;
  set $decoded_uri $decode_base64?; # 复杂场景需自定义模块
  if ( $decoded_uri ~ (\\.\\./) ) {
    return 403;
  }
}

白名单模式(推荐)

// 只允许访问预定义文件列表
Set<String> allowedFiles = Set.of("report.pdf", "images/logo.png");
public boolean isAllowedAccess(String requestPath) {
    return allowedFiles.contains(requestPath);
}

监控与应急响应

日志监控规则(ELK)

if [request] =~ /%2e%2e|\\.\\.\\// {
  mutate { add_tag => ["directory_traversal_attempt"] }
  elasticsearch { 
    index => "attack-alerts-%{+YYYY.MM.dd}" 
  }
}

实时告警指标

  • 单位时间内403状态码数量激增
  • 包含的请求占比超过0.1%
  • 同一IP不同文件的请求模式

自动封禁策略(Fail2Ban示例)

[dir_traversal]
enabled = true
filter = fail2ban-filter-dir-traversal.conf
action = iptables-allports[name=dir_traversal]
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 300
bantime = 3600

最佳实践组合

  1. 第一层:WAF/云防护快速拦截90%的简单遍历尝试
  2. 第二层:服务器配置(Nginx/Apache)阻断基础攻击
  3. 第三层:应用层代码严格路径白名单+双解码校验
  4. 第四层:日志监控捕捉0day绕过变体

特别注意:避免仅依赖黑名单(如拦截),攻击者可轻易通过/var/www/...%2e%2e%2f、等方式绕过,推荐使用白名单路径+路径规范化验证的组合方案,且对输入进行分层URL解码(至少两次)。

抱歉,评论功能暂时关闭!