news 2026/6/10 3:40:40

Web 安全:路径遍历(Path Traversal)攻防全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Web 安全:路径遍历(Path Traversal)攻防全解析

一、漏洞定义与危害

路径遍历(也常称目录遍历,Directory Traversal)是 Web 应用中高危文件操作类漏洞。攻击者可利用该缺陷绕过服务端目录访问控制规则,读取服务器文件系统内任意文件,部分场景下还能结合写入权限实现权限接管。

主要风险影响

  1. 窃取业务源码、配置文件,梳理应用架构与业务逻辑;
  2. 读取数据库账号、API 密钥、环境变量等核心凭据;
  3. 访问操作系统敏感文件,例如 Linux 下/etc/passwd、Windows 下C:\windows\win.ini
  4. 若服务端开放文件写入权限,攻击者可篡改系统配置、植入后门,最终实现远程代码执行(RCE),完全控制服务器。

二、漏洞成因与基础利用

该漏洞的核心根源是服务端无条件信任用户可控输入,直接将输入内容拼接后调用底层文件系统 API

在常规业务场景中,应用常通过 URL 参数动态加载文件,示例请求:/loadImage?filename=218.png后端采用基础目录 + 用户输入的拼接逻辑组合文件路径,伪代码如下:filePath = "/var/www/images/" + user_input

主流操作系统将../(Windows 系统为..\)定义为上级目录跳转符。当攻击者修改filename参数为../../../etc/passwd,拼接后完整路径为/var/www/images/../../../etc/passwd。 文件系统会逐层解析目录跳转指令,脱离预设的/var/www/images/目录限制,读取系统根目录下的etc/passwd文件,完成攻击。

三、常见防御手段及对应绕过方案

实战中应用会部署各类输入过滤规则,但多数防御仅做表层字符拦截,因解析逻辑错位可被轻松绕过,以下为典型场景:

1. 简单过滤../→ 绝对路径绕过

防御逻辑:检测并删除请求中的../跳转字符。绕过原理:主流文件系统 API 识别绝对路径时,会直接忽略前置拼接的基础目录。利用载荷filename=/etc/passwd

2. 单次字符串替换过滤 → 嵌套跳转序列绕过

防御逻辑:仅执行一次字符串替换,清除../,不做循环检测。绕过原理:单次删除后,剩余字符会重新组合成有效的目录跳转符。利用载荷....//....\/

3. 多层解码导致的漏洞 → 双重 URL 编码绕过

防御逻辑:WAF 或前置网关完成字符检测后,应用层再次对请求内容执行 URL 解码。绕过原理:HTTP 请求到达服务端时,Web 容器会自动完成一次 URL 解码,二次解码机制会放大编码载荷的利用空间。利用载荷%252e%252e%252f../双重编码) 解析流程:容器首次解码得到%2e%2e%2f,过滤规则未匹配明文../予以放行;应用二次解码还原为../,触发路径遍历。

4. 路径前缀校验 → 合法目录内回溯绕过

防御逻辑:强制要求输入内容必须以预设基础目录开头。绕过原理:输入前缀满足校验规则后,仍可使用跳转符回溯脱离目录。利用载荷filename=/var/www/images/../../../etc/passwd

5. 文件后缀名校验 → 空字节截断绕过

防御逻辑:校验文件名后缀,仅允许.png.jpg等指定格式。绕过原理:Java、PHP、Python 等高级语言依靠自身规则判定字符串长度,而底层 C 语言 API 以空字节%00(十六进制0x00)作为字符串终止位,两者解析规则存在差异。利用载荷filename=../../../etc/passwd%00.png业务层校验到后缀.png判定合法,底层文件读取接口遇到%00截断字符串,最终读取/etc/passwd

四、企业级标准化防御方案

路径遍历需从架构设计代码校验两层落地防御,杜绝单点防护失效问题。

1. 架构层:杜绝用户输入直连文件接口

最优解决方案为使用间接对象引用。后端不对外暴露真实文件路径,使用 UUID、数据库自增 ID 等唯一标识映射物理文件。用户仅传递标识参数,服务端通过映射表查询硬编码的安全路径,再执行文件读取。

2. 代码层:双层校验机制

若业务必须传递文件名,采用白名单校验 + 路径规范化校验组合防御,摒弃不安全的黑名单拦截。

  1. 严格白名单校验:通过正则表达式限制输入格式,仅允许合法字符与指定后缀,示例规则:^[a-zA-Z0-9_-]+\.(png|jpg)$
  2. 路径规范化校验:拼接基础目录与用户输入后,调用系统 API 解析出文件标准绝对路径,校验该路径是否严格处于预设基础目录范围内,防止目录逃逸。

Java 核心防御示例:

java

运行

File file = new File(BASE_DIRECTORY, userInput); // 解析为系统标准绝对路径 String canonicalPath = file.getCanonicalPath(); // 校验路径边界 if (canonicalPath.startsWith(BASE_DIRECTORY)) { // 执行文件读取逻辑 }

总结

路径遍历漏洞的本质是输入管控缺失多层组件解析规则差异。黑名单过滤、单次字符替换等浅层防御均存在绕过风险。 安全防护需优先优化架构设计,从源头隔离用户输入与文件系统;无法改造架构时,必须落地白名单 + 路径标准化的双重校验,构建闭环防御体系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 3:20:59

UE5本地化UMG图表工具:纯C++实现的曲线/饼图/环图/柱状图组件包

本文还有配套的精品资源,点击获取 简介:一套专为Unreal Engine 5打造的原生UMG图表解决方案,所有图表均通过C底层实现,不依赖WebBrowser或外部渲染层,确保运行时性能稳定、加载迅速。包含四大核心可视化组件&#x…

作者头像 李华
网站建设 2026/6/10 3:16:35

Python配置管理与环境变量

Python配置管理与环境变量一、环境变量基础import os# 读取环境变量 db_host os.environ.get(DB_HOST, localhost) db_port int(os.environ.get(DB_PORT, 5432)) debug os.environ.get(DEBUG, false).lower() in (true, 1, yes)# 必需的环境变量 def require_env(name): val…

作者头像 李华