当前位置: 首页 > news >正文

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)) { // 执行文件读取逻辑 }

总结

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

http://www.jsqmd.com/news/984703/

相关文章:

  • Android Kotlin尾递归深度解析:优化无限的可能
  • VS2022在Release平台调试
  • 2026年口碑好的江门大基数减重/江门健身管理/江门健身口碑排行 - 行业平台推荐
  • Qt5.12在Win10上安装后,别忘了做这几件事!环境配置与第一个‘Hello World’项目实战
  • 别再只用Numba了!Python JIT加速实战:NumPy循环优化与Pandas避坑指南
  • 手机整机接地设计与验证
  • 基于 Simulink 的电动汽车防溜坡功能(ARS)中的电机零扭矩闭环保持控制仿真实战教程
  • 推理篇第17节:实战——Llama 3部署:使用TensorRT-LLM搭建推理服务
  • N100软路由(五) 成型与加固--AP模式Mesh组网与网络优化
  • 别再乱用v-if了!用Vue3自定义指令优雅实现按钮权限控制
  • Kotlin高阶函数在Android开发中的高级应用:面试指南与最佳实践
  • 2026年氨分解产品行业技术格局与主流供应商综合评估 - 优质品牌商家
  • 基于 Simulink 的新能源商用车主驱电机弱磁扩速控制策略仿真实战教程
  • Qt 5.12.6 在 Windows 10 上安装,为什么我强烈推荐你用 MinGW 而不是 MSVC?
  • MySQL大表优化终极方案:单表数据量上限、卡顿解决、分表分库实战教程
  • 从一次CANoe测试失败案例,聊聊CAPL变量作用域那些容易忽略的细节
  • Qt 5.12.6在Win10上安装,为什么我建议你选MinGW而不是MSVC?新手避坑指南
  • 搜索技能——anysearch技能
  • SPDX+Syft+Policy引擎打造合规流水线
  • 深入解析Kotlin中的Lambda表达式:Android开发的核心技巧
  • 软考网络工程师备考:用华为eNSP搞定这5个必考实验(含完整命令)
  • 陈,震惊分析实验系统 震惊实验视频分析系统
  • Elastic Agent独立模式实战:手把手教你用Kibana配置Nginx日志采集(附API Key避坑指南)
  • 给STM32F4配上网络:用RT-Thread Nano和LWIP搭建轻量级TCP服务器
  • 从零搭建一个企业网:手把手教你用eNSP模拟真实网络规划(防火墙+NAT+VLAN)
  • 代码随想录 打卡第五十二天
  • 别再手动对齐代码了!手把手教你配置VSCode的Verilog-Format插件(附配置文件下载)
  • 为什么dubbo和openFeign都是通过动态代理的方式发起调用
  • 别再只用v-if了!用Vue3自定义指令封装一个权限按钮组件(附完整代码)
  • 平基土石方三维计算软件功能更新至V0.3.2