乐趣区

关于web:Web-Security-之-Directory-traversal

Directory traversal – 目录遍历

在本节中,咱们将介绍什么是目录遍历,形容如何执行门路遍历攻打和绕过常见阻碍,并说明如何避免门路遍历破绽。

什么是目录遍历?

目录遍历(也称为文件门路遍历)是一个 web 安全漏洞,此破绽使攻击者可能读取运行应用程序的服务器上的任意文件。这可能包含利用程序代码和数据、后端系统的凭据以及操作系统相干敏感文件。在某些状况下,攻击者可能可能对服务器上的任意文件进行写入,从而容许他们批改应用程序数据或行为,并最终齐全管制服务器。

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

假如某个应用程序通过如下 HTML 加载图像:

![](/loadImage?filename=218.png)

这个 loadImage URL 通过 filename 文件名参数来返回指定文件的内容,假如图像自身存储在门路为 /var/www/images/ 的磁盘上。应用程序基于此基准门路与申请的 filename 文件名返回如下门路的图像:

/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?filename=..\..\..\windows\win.ini

利用文件门路遍历破绽的常见阻碍

许多将用户输出放入文件门路的应用程序实现了某种应答门路遍历攻打的进攻措施,然而这些措施却通常能够被躲避。

如果应用程序从用户输出的 filename 中剥离或阻止 ..\ 目录遍历序列,那么也能够应用各种技巧绕过进攻。

你能够应用从零碎根目录开始的绝对路径,例如 filename=/etc/passwd 这样间接援用文件而不应用任何 ..\ 模式的遍历序列。

你也能够嵌套的遍历序列,例如 ....// 或者 ....\/,即便内联序列被剥离,其也能够复原为简略的遍历序列。

你还能够应用各种非标准编码,例如 ..%c0%af 或者 ..%252f 以绕过输出过滤器。

如果应用程序要求用户提供的文件名必须以指定的文件夹结尾,例如 /var/www/images,则能够应用后跟遍历序列的形式绕过,例如:

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

如果应用程序要求用户提供的文件名必须以指定的后缀结尾,例如 .png,那么能够应用空字节在所需扩展名之前无效地终止文件门路并绕过查看:

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

如何进攻目录遍历攻打

进攻文件门路遍历破绽最无效的形式是防止将用户提供的输出间接残缺地传递给文件系统 API。许多实现此性能的应用程序局部能够重写,以更平安的形式提供雷同的行为。

如果认为将用户输出传递到文件系统 API 是不可避免的,则应该同时应用以下两层进攻措施:

  • 应用程序对用户输出进行严格验证。现实状况下,通过白名单的模式只容许明确的指定值。如果无奈满足需要,那么应该验证输出是否只蕴含容许的内容,例如纯字母数字字符。
  • 验证用户输出后,应用程序应该将输出附加到基准目录下,并应用平台文件系统 API 规范化门路,而后验证规范化后的门路是否以基准目录结尾。

上面是一个简略的 Java 代码示例,基于用户输出验证规范化门路:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {// process file}

退出移动版