所有文章 > 技术杂货铺 > 什么是路径遍历
什么是路径遍历

什么是路径遍历

网络攻击的形式和方式多种多样。网络攻击者使用多种不同的技术和途径来破坏安全。其中最流行的一种是路径遍历。在这篇博文中,我们将介绍路径遍历是什么以及它的工作原理。我们还将介绍如何避免此类攻击。

什么是路径遍历?图像

什么是路径遍历?

路径遍历(或双斜杠)攻击是一种恶意行为,旨在诱骗 Web 应用程序显示用户请求目录以外的目录内容,并获取服务器上敏感文件的访问权限。例如,如果用户应该查看名为 abc.jpeg 的图像,但 Web 应用程序被诱骗显示 /var/www 中的文件,则攻击者将成功执行路径遍历攻击。

攻击者可能能够访问只有 Web 服务器所有者才能访问的文件,例如 .htaccess 文件或包含配置或身份验证数据的文件。

路径遍历会导致什么样的安全漏洞?

假设某个网站存在路径遍历漏洞。在这种情况下,攻击者将能够读取敏感文件,例如包含用户名和密码的应用程序源代码、数据库凭据,甚至私人加密密钥。在某些情况下,黑客能够将数据写入任意文件,从而允许他们为网站上传后门、上传自动执行的恶意文件等。

当路径遍历攻击执行时会发生什么?

路径遍历是访问存储在 webroot 文件夹之外的文件和目录的一种方法。

使用一个典型的例子,让我们看看路径遍历的工作原理。

假设用户正在使用一款在线购物应用,该应用每次购物时都会创建发票。访问发票时,URL 如下所示:

https://www.shopping.com/user/invoice?name=order1

此处的名称表示服务器需要发送的 PDF 发票的名称。当服务器收到文件的名称时,它会将工作目录和文件扩展名添加到文件的名称 (/var/www/invoices/order1.pdf),从服务器获取文件并将其发送回去。如果攻击者将文件名 order1.pdf 替换为恶意内容(如 ../../etc/passwd),则应用程序将返回所请求文件的内容(如果未实施适当的控制)。

成功的路径遍历攻击需要什么条件?

路径遍历攻击是一种允许黑客遍历目录并读取或写入系统上的任何文件的攻击。黑客可以通过利用不充分的输入验证技术来实现这一点。为了能够成功进行路径遍历攻击,黑客需要满足以下任何条件: 

1.缺乏相对路径检查

利用目录遍历漏洞最常用的技术是使用附加到易受攻击的参数的相对路径。如果参数未正确清理,攻击者可以从系统中读取任意文件。

2. 仅验证文件扩展名

文件扩展名验证是解决该问题的一种常用方法。然而,许多人忽视了这样做的危险性。文件扩展名验证永远无法替代检查参数是否试图访问其他格式的文件,并且可以使用文件末尾的 Null Byte 轻松绕过。 

3. 转义“点-点-斜线”(不正确的实现)

一些开发人员尝试转义或仅替换字符串中的 ../,但这不是一个正确的解决方法,可以通过对转义字符进行编码来绕过。在这种情况下,可以对 ../ 进行编码并通过 URL 传递(例如,从:http://www.example.com/?invoice=../../../../../../../../../tmp/xyz.txt 到 http://www.example.com/?invoice=../../../../../../../../../../tmp/xyz.txt?%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/tmp/xyz.txt)。

现在您了解了执行路径遍历攻击所需的条件,让我们看看黑客执行此攻击的不同方式。

执行路径遍历攻击的不同方法

黑客可以通过操纵网络服务器上的文件路径并利用其薄弱的安全性来执行路径遍历攻击。

以下是最常用的方法:

1)使用相对路径。此类攻击会添加相对于当前工作目录的文件或文件夹路径。例如,如果当前工作目录为 /home/user/public_html,攻击者可以上传恶意代码(如 ../../../../../../../../../../../../../../../../etc/passwd)来访问 /etc/passwd 文件。 

2)对转义字符进行编码。此攻击使用 URL 编码对特殊字符进行编码。例如,攻击者可以使用 %2e%2e/%2f 在每两个点后添加一个 /。 

3) 使用空字节攻击:此攻击使用空字节 (\x00) 绕过路径的常规验证。例如,攻击者可以在目录名称中添加 \x00,通过破坏正则表达式来绕过验证。这也称为空字节注入。

保护代码片段以避免路径遍历攻击

尽管路径遍历攻击已经存在了很长时间,但它们仍然是一种病毒攻击媒介。这是因为它们很容易发起,并且可以在多种情况下应用。 

以下是一些可以帮助您避免此类攻击的 JavaScript 安全代码片段。

1.规范文件路径。

const normalizeFilePath = (filePath) => {
// If filePath is a relative path, convert it to an absolute path
let normalizedFilePath = path.normalize(filePath).replace(/^(\.\.(\/|\\|$))+/, '');

if (normalizedFilePath.endsWith(path.sep)) {
// Remove trailing path separator if present
normalizedFilePath = normalizedFilePath.slice(0, -1);
}
}
2. Make sure the validating string is alphanumeric.
const checkStringAlphaNumeric = (str) => {
// Check if string is alphanumeric
return /^[a-zA-Z0-9]+$/.test(str);
}
3. Check if URL encoded characters are present.
const checkIfURLEncodedPresent = (filePath) => {
// Check if URL encoded characters are present
return /%[0-9A-F]{2}/i.test(filePath);
}

上面的代码片段适用于 JavaScript,但其他编程语言呢?让我们看看一些避免路径遍历漏洞的标准最佳实践。

防止路径遍历的主要方法

现在,您应该已经对路径遍历攻击有了一定的了解。您知道,这种攻击是指恶意攻击者试图访问您网站中本不该访问的部分。

让我们介绍一些可以防止路径遍历、保护您的 Web 服务器以及保证您的 Web 应用程序安全的方法。

1.规范文件路径。 

2.避免使用高权限用户。 

3.定期更新你的编程语言和网络服务器的版本。

4. 转义特殊字符(即使您已经对它们进行了 URL 编码)。 

5.尽量不要依赖用户提供的文件路径。

虽然路径遍历是一个严重的漏洞,但它并不是黑客利用的唯一漏洞,因此编写安全代码至关重要。让我们来看看一些有用的技巧。

避免安全漏洞的四个有用技巧

任何软件都可能存在安全漏洞。但是,Web 应用程序更容易受到攻击,因为它们是在线的。因此,确保它们的安全至关重要。

以下是四条建议: 

1. 保持软件更新

最重要的最佳实践之一是保持软件更新,并在新补丁发布后立即更新。 

2. 自动测试构建管道中的安全漏洞

构建管道是 DevOps 流程的重要组成部分。它允许开发团队编译新开发的代码并将其推送到生产服务器。但是,这个过程可能非常脆弱,特别是如果你没有正确配置它。

这就是StackHawk 的 DAST 扫描仪的作用所在。您可以将其与 CI/CD 管道集成,从而自动化扫描过程并尽早发现漏洞,包括路径遍历、SQL 注入、跨站点脚本等。

3. 执行强密码策略

这是许多企业忽视的一个简单步骤。

要求使用攻击者无法轻易猜到的复杂密码至关重要。

如果您尚未为您的企业创建密码策略,您应该立即创建。

4.使用 SSL 证书

HTTPS 是一种在用户和服务器之间传递数据时对其进行加密的协议,以确保没有人可以拦截它。

文章来源:What is Path Traversal

#你可能也喜欢这些API文章!