路径遍历漏洞实战指南:5种绕过技术与自动化测试

news/2025/11/10 18:05:25/文章来源:https://www.cnblogs.com/qife122/p/19207847

路径遍历漏洞实战指南

当我刚开始学习Web安全时,路径遍历是那种看起来简单到不真实的漏洞之一。像操纵文件名这样基础的东西怎么可能造成如此严重的破坏?但在实验室花费数小时测试真实应用后,我意识到正是这种简单性让它变得如此危险。开发者会忽略它,过滤器无法捕获它,在你意识到之前,攻击者已经在读取服务器最敏感的文件了。

在本文中,我将带你了解什么是路径遍历,在哪里可以找到它,如何用五种不同的绕过技术进行测试,最后是如何使用Python自动化测试。让我们开始吧。

什么是路径遍历?

路径遍历,也称为目录遍历,是一种允许攻击者访问存储在Web根文件夹外部的文件和目录的漏洞。通过操纵文件路径引用,攻击者可以浏览服务器的目录结构并读取任意文件。

最常见的目标?Linux系统上的/etc/passwd文件。这是一个包含用户账户信息的标准文件,是完美的概念验证,因为它可以被任何用户读取,并确认你已成功遍历目录结构。

影响范围从信息泄露(源代码、配置文件、凭据)到完全服务器入侵(如果攻击者可以写入文件或访问敏感应用逻辑)。

在哪里可以找到路径遍历?

路径遍历漏洞通常出现在处理文件操作的功能中。以下是最常见的查找位置:

  • 图像加载器:基于文件名参数显示图像的应用程序(如产品图片、头像或图库查看器)
  • 文件下载功能:任何允许用户通过指定文件名或路径下载文件的端点
  • 文档查看器:PDF查看器、报告生成器或任何动态加载文档的功能
  • 模板引擎:基于用户输入加载模板的系统
  • 文件上传处理器:有时文件名本身可以在上传过程中被操纵
  • 包含/要求语句:特别是在较旧的PHP应用程序中,用户输入被传递给include()require()

关键是查找任何似乎引用文件的参数:filenamefilepathtemplatepagedocument,甚至是自定义参数名称,如imgdocresource

测试路径遍历:5个真实场景

现在让我们进入实践。我将向你展示在PortSwigger的Web Security Academy实验室练习时遇到的五个不同场景。每个场景代表不同的防御机制以及如何绕过它们。

场景1:简单情况

第一个场景是最直接的。应用程序接受一个filename参数并直接使用它来加载图像。没有过滤器,没有验证,只是纯粹信任用户输入。

易受攻击的请求如下:

GET /image?filename=product.jpg

要利用它,我只需将文件名替换为路径遍历序列:

GET /image?filename=../../../etc/passwd

../告诉服务器向上移动一个目录。通过将三个这样的序列链接在一起,我从images目录导航,经过Web根目录,进入系统的/etc目录。

我是如何发现的:我在Burp Suite中拦截了图像请求,注意到filename参数,并立即用经典的遍历payload进行测试。响应返回了/etc/passwd的完整内容。完全没有抵抗。

场景2:绝对路径绕过

第二个场景更棘手。应用程序完全阻止了像../这样的遍历序列。任何使用它们的尝试都会导致错误或请求被拒绝。

但问题是:如果应用程序阻止相对路径,那么绝对路径呢?

与其尝试向上导航目录,不如直接告诉服务器确切的位置:

GET /image?filename=/etc/passwd

它起作用了。应用程序太专注于阻止../,以至于忘记了验证绝对路径。

我是如何发现的:在我最初的../ payload被阻止后,我尝试了不同的变体。当我使用绝对路径/etc/passwd时,应用程序愉快地提供了文件。这教会了我过滤器通常是不完整的——它们阻止一件事但忘记了另一件事。

场景3:非递归剥离

第三个场景有一个过滤器,可以从输入中剥离../序列。乍一看,这似乎是一个可靠的防御。但过滤器有一个致命缺陷:它只运行一次。

我的意思是,如果我发送../../../etc/passwd,过滤器会移除../序列,留下etc/passwd,这不会起作用。

但是如果我嵌套序列呢?如果我发送....//而不是../呢?

当过滤器从....//中移除../时,它再次留下了../。所以我的payload变成了:

GET /image?filename=....//....//....//etc/passwd

过滤器剥离了中间字符,但剩余字符形成了有效的遍历序列。

我是如何发现的:在意识到过滤器正在移除../后,我尝试了不同的模式。嵌套方法起作用了,因为过滤器不是递归的——它只扫描输入一次,并且不检查移除后剩下的内容。

场景4:双重URL编码

第四个场景更加复杂。应用程序阻止了路径遍历序列,然后在使用输入之前对其执行URL解码。

这实际上是Web应用程序中的常见模式:解码输入,验证它,然后使用它。但顺序很重要。

如果应用程序在验证后解码,我可以通过双重编码我的payload来绕过过滤器。方法如下:

  • 正常:../
  • URL编码一次:%2e%2e%2f
  • URL编码两次:%252e%252e%252f

当我发送双重编码版本时,验证看到%252e%252e%252f,它看起来不像遍历序列。它通过验证。然后应用程序解码一次,将其变成%2e%2e%2f。最后,当应用程序使用它时,Web服务器再次解码,将其变成../

我的payload:

GET /image?filename=..%252f..%252f..%252fetc/passwd

我是如何发现的:我注意到我的正常遍历序列被阻止了,但当我尝试URL编码时,行为略有变化。这告诉我应用程序正在进行某种解码。然后我尝试了双重编码,它完全绕过了过滤器。

场景5:路径验证绕过

第五个场景是最现实的。应用程序验证提供的路径是否以预期目录开头:/var/www/images/

这实际上是一个好的安全实践,但实施不正确。应用程序检查前缀,但没有随后规范化路径。

因此,我可以通过包含预期前缀来满足验证,然后从中遍历出来:

GET /image?filename=/var/www/images/../../../etc/passwd

应用程序看到开头的/var/www/images/并批准了它。但是当路径被解析时,../序列从该目录导航回/etc

我是如何发现的:我注意到应用程序拒绝了不以/var/www/images/开头的路径。所以我在payload中包含了该前缀,然后在它后面添加了遍历序列。验证通过,遍历起作用。

奖励场景:空字节绕过(遗留系统)

还有一个值得一提的技术,尽管它只在较旧的系统上有效。一些应用程序验证文件名是否以特定扩展名结尾,如.png.jpg

在遗留系统(特别是较旧的PHP版本)上,你可以使用空字节(%00)绕过此限制。空字节在底层的C函数中终止字符串,因此之后的所有内容都被忽略。

Payload:

GET /image?filename=../../../etc/passwd%00.png

应用程序看到末尾的.png并批准了它。但是当实际读取文件时,空字节在/etc/passwd处截断了字符串。

注意:这不再适用于现代系统,但对于旧应用程序仍然值得了解。

如何修复路径遍历

既然我们已经看到了如何利用路径遍历,让我们谈谈如何修复它。

最佳解决方案:根本不要在文件路径中使用用户输入。相反,使用在服务器端映射到文件名的ID或索引。例如:

GET /image?id=123

服务器在数据库中查找ID 123并检索相应的文件名。用户从不控制实际路径。

如果必须使用用户输入

  1. 根据允许文件的白名单进行验证
  2. 规范化路径(解析所有../和符号链接)
  3. 验证规范化路径是否仍在预期目录内
  4. 使用防止遍历的安全文件API

以下是Java中的示例:

File file = new File(BASE_DIRECTORY, userInput);
String canonicalPath = file.getCanonicalPath();
if (!canonicalPath.startsWith(BASE_DIRECTORY)) {throw new SecurityException("Invalid file path");
}

这确保了无论攻击者使用什么技巧,最终路径都必须在基础目录内。

最后思考

路径遍历是那种表面上看起来简单但在现实世界中有无尽变体的漏洞之一。每个应用程序都实现自己的过滤器和验证,这意味着你需要有创造力和持久性。

最重要的是:始终以道德方式测试。只测试你有权限测试的应用程序,无论是通过漏洞赏金计划、渗透测试任务,还是像PortSwigger的Web Security Academy这样的实践实验室。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:LLMs-from-scratch :KV 缓存

实用指南:LLMs-from-scratch :KV 缓存pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

前置和后置的区别

1、前置式返回的引用,效率会高一点 2、后置式返回的常对象,内部需要一个临时对象,效率相对低一些 备注: 1、前置式和后置式都没有参数,为了加以区分,再后置式增加int自变量,默认值为0 2、对于后置式返回常对象,…

2025年11月太阳能板/光伏板/电池板/单晶硅/多晶硅板前十厂家排名:深圳精益太阳能板领跑行业

文章摘要 本文基于2025年太阳能板行业发展趋势,分析了全球太阳能板市场的竞争格局,重点介绍了前十强品牌的排名、技术优势及服务特点。行业发展迅猛,高效、稳定、环保成为核心需求,本文提供详细排名和品牌信息,并…

TCP报文中的时间戳有什么作用

以上仅供参考,如有疑问,留言联系

响应式编程 - reactor 初识

Reactor 3 是一个围绕该规范构建的库,将响应式编程Reactive Streams范式引入JVM。 在本课程中,你将熟悉 Reactor API。那么,让我们快速介绍一下响应式流和响应式编程中更通用的概念。 package com.qinrenjihe;impor…

ubuntu16.04安装CUDA驱动 - 小

背景:项目需要使用PyTorch ,调用这两个命令nvidia-smi nvcc --version安装cuda,先安装显卡驱动 检查显卡型号:lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce …

深入解析:统一高效图像生成与编辑!百度新加坡国立提出Query-Kontext,多项任务“反杀”专用模型

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月太阳能板生产厂家排名前十榜单:深圳精益太阳能板引领行业

摘要 随着全球对可再生能源需求的增长,太阳能板行业在2025年持续创新与扩张。本文基于权威市场数据和行业报告,精选出前十名太阳能板生产厂家,重点推荐深圳精益太阳能板作为榜首。榜单结合技术参数、用户口碑和品牌…

reactor 初识

package com.qinrenjihe;import org.jspecify.annotations.NonNull; import reactor.core.publisher.Flux;public class Main {// 创建一个空的 Fluxstatic Flux<@NonNull String> emptyFlux() {return Flux.emp…

QOJ6608 Descent of Dragons

为什么这题放在了 NOIP T2?自闭了……修改只会使值从 \(x\) 变成 \(x+1\),这个对整体的值域变化是非常小的。 对于一个阈值 \(lim\),考虑 \(01\) 序列 \(A_{lim}\),\(A_{lim,i}=[a_i\ge lim]\)。 对于一次修改,实…

2026年HR 数字化转型趋势:AI如何帮助HR从招聘到绩效全流程人效提升 48%?

根据艾瑞咨询 2025 年《中国 HR SaaS 行业研究报告》显示,预计 2025 年国内 HR SaaS 市场规模将突破 240 亿元,其中 AI 技术贡献的价值占比超 60%。这一数据背后,是 AI 正在彻底重塑 HR 全价值链 —— 从招聘的简历…

Windows利用批处理脚本判断端口, 启动tomcat

以下是一个完整的 Windows 批处理脚本,用于检查指定端口是否被占用,并根据结果选择是否启动 Tomcat。如果端口被占用,还可以选择结束占用端口的进程,再启动 Tomcat。批处理脚本代码batch@echo off :: 设置需要检查…

2025最新实测对比:5款热门工程项目管理系统 协同能力与实用体验深度测评

最近花了两个月时间,我们把市面上主流的5款工程项目管理系统都实际用了一遍。 说实话,这个测评做得挺烧脑的,光是测试数据就整理了十几个G。今天就把最真实的体验分享给大家,希望能帮正在选型的工程公司少走点弯路…

2025年双轴拌馅机实力厂家权威推荐榜单:调味料拌馅机/酱菜搅拌机/翻斗式拌馅机源头厂家精选

在食品工业自动化升级与标准化生产需求持续增长的背景下,双轴拌馅机作为肉制品、酱菜、调味品等食品加工的核心设备,其搅拌均匀性与生产效率直接影响产品品质与生产成本。根据食品机械行业数据显示,全球食品搅拌设备…

2025年终绩效,AI面谈系统让沟通效率翻倍,主管再也不用熬夜写总结

“又要准备绩效面谈了,光整理员工半年的绩效数据、目标完成情况就花了 2 天,面谈时还得边聊边记,生怕漏了关键信息,晚上还得熬夜补总结……” 这是很多企业主管在绩效周期内的真实写照。传统绩效面谈往往陷入 “形…

vue实现T型二维表格

图片实现T形2维表,上下滚动,T形左右可以各自水平滚动底部和顶部水平滚动保持一致实现excle复制粘贴T形左右宽度各自撑开代码如下<template><div class="fixed-table-container"ref="tableCo…

antd table 列表树形结构展示

// 原始数据(子节点字段为 subNodes) const rawData = [{key: 1,name: 父节点,subNodes: [{ key: 1-1, name: 子节点 },],}, ];// 转换函数:递归将 subNodes 改为 children const transformData = (data: any) =>…

2025年深圳救护车运转公司权威推荐榜单:正规救护车出租/急救车出租/出租救护车源头公司精选

在医疗服务需求多元化与人口老龄化趋势加速的背景下,深圳救护车运转服务市场正经历着从基础运输向专业化、分级化的转型升级。行业数据显示,社会对非急救转运服务的需求持续上升,尤其是在康复出院、跨省转院、异地就…

对隐式类型转换保持警觉

操作符重载引起的隐式类型转换 缺点:可能导致非预期的函数被调用 解决:以功能对等的另一个函数取代类型转换操作符 举例: class Rational{ public: Rational(int num = 0,int deno = 1):num_(num),deno_(deno){}; o…

es中批量删除数据

创建bulk_delete.json 文件 {"delete":{"_index":"vivian-scene-warn-history","_type":"warnHistory","_id":"5befb3a1b25c4841bca3637efc36a320&…