[工具使用] 目录遍历漏洞

1589 3
HK.JH 2022-2-13 23:46:02 来自手机 | 显示全部楼层 |阅读模式
1. 目录遍历是什么
目录遍历(也称为文件路径遍历)是一个web安全漏洞,它允许攻击者读取正在运行应用程序的服务器上的任意文件。这可能包括应用程序代码和数据、后端系统的凭据和敏感的操作系统文件。在某些情况下,攻击者可能能够写入服务器上的任意文件,允许他们修改应用程序数据或行为,并最终完全控制服务器。

2. 通过目录遍历读取任意文件
考虑一个购物应用程序显示待售商品图像。图片通过如下的HTML加载:

<img src="/loadImage?filename=218.png">
loadImage URL接受filename参数并返回指定文件的内容。image文件本身存储在磁盘上的位置/var/www/images/。为了返回image,应用程序将请求的文件名附加到这个基本目录,并使用文件系统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上,../和..\ 都是有效的目录遍历序列,而检索标准操作系统文件的等效攻击将是:

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
3. 利用文件路径遍历漏洞的常见障碍
许多将用户输入放到文件路径中的应用程序都实现了某种针对路径遍历攻击的防御,而这些防御通常可以被绕过。

如果应用程序从用户提供的文件名中删除或阻止目录遍历序列,那么可以使用各种技术绕过防御。

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

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

您可能能够使用各种编码,例如..% c0%af或. .%252f,绕过过滤器。

如果应用程序要求用户提供的文件名必须以预期的基本文件夹(例如/var/www/images)开头,那么可以在适当的遍历序列之后包含所需的基本文件夹。例如:

filename=/var/www/images/../../../etc/passwd
如果应用程序要求用户提供的文件名必须以预期的文件扩展名(如.png)结束,那么可以使用空字节在所需扩展名之前有效地终止文件路径。例如:

filename=../../../etc/passwd%00.png
4. 如何防止目录遍历攻击
防止文件路径遍历漏洞的最有效方法是避免将用户提供的输入完全传递给文件系统api。可以重写许多这样做的应用程序函数,以更安全的方式交付相同的行为。

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

应用程序应该在处理用户输入之前验证它。理想情况下,验证应该与允许值的白名单进行比较。如果这对于所需的功能是不可能的,那么确保输入只包含允许的内容,比如纯字母数字字符。

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

下面是一个简单的Java代码示例,以验证基于用户输入的文件的规范路径:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
   // process file
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行