本文目录导读:

目录遍历漏洞(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 URI或GET参数匹配正则 - 对
%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
最佳实践组合
- 第一层:WAF/云防护快速拦截90%的简单遍历尝试
- 第二层:服务器配置(Nginx/Apache)阻断基础攻击
- 第三层:应用层代码严格路径白名单+双解码校验
- 第四层:日志监控捕捉0day绕过变体
特别注意:避免仅依赖黑名单(如拦截),攻击者可轻易通过/var/www/...、%2e%2e%2f、等方式绕过,推荐使用白名单路径+路径规范化验证的组合方案,且对输入进行分层URL解码(至少两次)。