目录遍历
在本节中,我们将解释哪些目录遍历是什么,描述如何进行路径遍历攻击并规避常见的障碍,并阐明如何防止路径遍历漏洞。
什么是目录遍历?
目录Traversal(也称为文件路径遍历)是一个Web安全漏洞,允许攻击者读取运行应用程序的服务器上的任意文件。beplay体育能用吗这可能包括应用程序代码和数据,后端系统的凭据以及敏感的操作系统文件。在某些情况下,攻击者可能能够在服务器上写入任意文件,使其可以修改应用程序数据或行为,并最终完全控制服务器。
通过目录遍历读取任意文件
考虑一个购物申请显示要出售的物品图像。图像通过一些HTML加载如下:

这负载图
URL占用文件名
参数并返回指定文件的内容。图像文件本身存储在该位置的磁盘上/var/www/images/
。要返回图像,该应用程序将请求的文件名附加到此基本目录中,并使用文件系统API读取文件的内容。在上述情况下,该应用程序从以下文件路径读取:
/var/www/images/218.png
该应用程序没有针对目录遍历攻击实施任何防御措施,因此攻击者可以请求以下URL从服务器的文件系统中检索任意文件:
https://insecure-beplay体育能用吗website.com/loadimage?filename=../../../../../etc/passwd
这导致应用程序从以下文件路径读取:
/var/www/images/../../../../../etc/passwd
序列../
在文件路径中有效,意味着在目录结构中加强一个级别。连续三个../
序列从/var/www/images/
对于文件系统root,因此实际读取的文件是:
/etc/passwd
在基于UNIX的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息。
在窗户上,两者都../
和.. \
是有效的目录遍历序列,检索标准操作系统文件的等效攻击将是:
https://insecure-beplay体育能用吗website.com/loadimage?filename=............................ \ Windows \ Win.ini
利用文件路径遍历漏洞的常见障碍
将用户输入到文件路径中的许多应用程序对路径遍历攻击实施了某种防御,并且通常可以规避这些防御。
如果应用程序剥离或阻止用户提供的文件名的目录遍历序列,则可以使用各种技术绕过防御。
您可能能够使用文件系统根的绝对路径,例如文件名=/etc/passwd
,直接引用文件而无需使用任何遍历序列。
您可能可以使用嵌套遍历序列,例如.... //
或者.... \/
,当内部序列被剥离时,它将恢复为简单的遍历序列。
在某些情况下,例如在URL路径或文件名
a的参数Multipart/form-data
请求,Web服务器beplay体育能用吗在将输入传递给应用程序之前可能会剥离任何目录遍历序列。您有时可以通过编码URL甚至双URL编码绕过这种消毒../
角色,导致%2E%2E%2F
或者%252E%252E%252F
分别。各种非标准编码,例如..%c0%AF
或者..%EF%BC%8F
,也可以解决问题。
为了Burp Suite专业人士用户,BURP入侵者提供了预定义的有效载荷列表(模糊 - 路径遍历),其中包含可以尝试的各种编码路径遍历序列。
如果应用程序要求用户提供的文件名必须从预期的基本文件夹开始,例如/var/www/图像
,然后可能包括所需的基本文件夹,然后再进行合适的遍历序列。例如:
文件名=/var/www/images /../../../../ etc/passwd
如果应用程序要求用户提供的文件名必须以预期的文件扩展名结尾,例如.png
,然后可以使用NULL字节在所需的扩展程序之前有效终止文件路径。例如:
文件名= ../../../etc/passwd%00.png
如何防止目录遍历攻击
防止文件路径遍历漏洞的最有效方法是避免将用户提供的输入传递给文件系统API。许多这样做的应用程序功能都可以重写以更安全的方式提供相同的行为。
如果认为将用户提供的输入输入到文件系统API是不可避免的,则应将两层防御使用一起用于防止攻击:
- 该应用程序应在处理之前验证用户输入。理想情况下,验证应与允许值的白名单进行比较。如果对于所需功能不可能,则验证应验证输入仅包含允许的内容,例如纯字母数字字符。
- 验证了所提供的输入后,应用程序应将输入附加到基本目录,并使用平台文件系统API将路径化。它应该验证规范化路径是否从预期的基本目录开始。
以下是一些简单的Java代码的示例,可以根据用户输入验证文件的规范路径:
文件文件=新文件(base_directory,userInput);if(file.getCanonicalPath()。startswith(base_directory)){// process file}