当前位置: 首页 > 后端技术 > Node.js

Directorytraversal

时间:2023-04-03 19:56:48 Node.js

WebSecurity的Directorytraversal在本节中,我们将介绍什么是目录遍历,描述如何执行路径遍历攻击和绕过常见障碍,并阐明如何防止路径遍历漏洞。什么是目录遍历?目录遍历(也称为文件路径遍历)是一种Web安全漏洞,可能允许攻击者读取运行应用程序的服务器上的任意文件。这可能包括应用程序代码和数据、后端系统的凭据以及与操作系统相关的敏感文件。在某些情况下,攻击者可能能够写入服务器上的任意文件,从而允许他们修改应用程序数据或行为并最终完全控制服务器。通过目录遍历读取任意文件假设应用程序通过以下HTML加载图像:![](/loadImage?filename=218.png)此loadImageURL通过文件名参数返回指定文件的内容,假设图像本身是存储在磁盘路径/var/www/images/中。基于此基本路径和请求的文件名,应用程序返回具有以下路径的图像:/var/www/images/218.png如果应用程序没有采取任何防御措施来防止目录遍历攻击,攻击者可以请求类似的URL到以下从服务器的文件系统中检索任意文件:https://insecure-website.com/loadImage?filename=../../../etc/passwd这将导致文件返回路径:/var/www/images/../../../etc/passwd../表示上级目录,所以这个文件实际上是:/etc/passwd在Unix操作系统上,这个文件是一个内容对于服务器标准文件中注册用户的详细资料信息。在Windows系统中,..\和../的作用相同,都代表上级目录,所以标准的操作系统文件可以通过以下方式获取:https://insecure-website.com/loadImage?文件名=..\..\..\windows\win.ini利用文件路径遍历漏洞的常见障碍许多将用户输入放入文件路径的应用程序实现了某种针对路径遍历攻击的防御措施,但是这些通常可以被规避。如果应用程序从用户输入的文件名中剥离或阻止..\目录遍历序列,则可以使用各种技巧来绕过防御。您可以使用来自系统根目录的绝对路径,例如filename=/etc/passwd来直接引用文件,而无需使用..\形式的任何遍历序列。也可以嵌套遍历序列,比如....//或....\/,即使内联序列被剥离,也可以恢复为简单的遍历序列。您还可以使用各种非标准编码,例如..%c0%af或..%252f来绕过输入过滤器。如果应用要求用户提供的文件名必须以指定的文件夹开头,比如/var/www/images,可以通过使用一个序列后跟遍历来绕过,比如:filename=/var/www/images/../../../etc/passwd如果应用程序要求用户提供的文件名必须以指定后缀结尾,例如.png,则可以使用空字节有效地终止文件路径之前文件名=../../../etc/passwd%00.png如何防御目录遍历攻击防御文件路径遍历漏洞最有效的方法是避免通过用户提供的直接完整地输入到文件系统API。可以重写实现此功能的应用程序的许多部分,以更安全的方式提供相同的行为。如果将用户输入传递给文件系统API被认为是不可避免的,您应该同时使用以下两层防御:应用程序对用户输入执行严格验证。理想情况下,白名单只允许明确指定的值。如果那不可能,那么您应该验证输入是否仅包含允许的内容,例如纯字母数字字符。验证用户输入后,应用程序应将输入附加到基目录,使用平台文件系统API规范化路径,然后验证规范化路径是否以基目录开头。下面是一个简单的Java代码示例,它根据用户输入验证规范路径: