首页 > 编程语言 >NodeJS路径遍历:示例及预防

NodeJS路径遍历:示例及预防

时间:2024-05-08 10:55:43浏览次数:61  
标签:遍历 .. NodeJS 攻击 路径 示例 应用程序 漏洞

  让我们来看看什么是路径遍历攻击,以及在Node.js中可以采用哪些方法来阻止这种攻击。

  构建一个安全而健壮的应用程序需要考虑的因素很多,并非一件容易的事情。要确保覆盖所有潜在的漏洞是一项十分艰巨的任务,这需要大量的经验和指导。在这些漏洞中,有一个和系统目录访问安全相关的漏洞,它通常会在程序进行路径遍历时受到攻击。

  理解这一点有助于你找到解决问题的办法。网络上有大量相关的资源可以帮助你解决该问题,本文只是诸多资源中的一个。

  本文旨在介绍路径遍历攻击的原理,以及使用Node.js可以采取哪些方法来阻止这类攻击。首先,我们将简要介绍什么是路径遍历攻击,然后将探讨一些常见的示例,最后介绍如何修复这些漏洞。通过本文的介绍,你应该对路径访问遍历有一个基本的了解,并能够在你的程序中阻止相关的漏洞。

  请注意,本文是专门针对Node.js开发人员的。因此,我们希望你对Node.js开发栈有一个基本的了解。如果你还没有尝试过,请查看Node.js指南以获得更多的信息。

路径遍历介绍

  什么是路径遍历攻击?它是一种利用服务器端糟糕的访问控制漏洞而实现的攻击,特别是对文件的访问。在这类攻击中,攻击者试图通过向应用程序中注入无效或恶意的内容来访问服务器上受限制的文件。可以把它看作是SQL注入,但针对的是系统目录而不是数据库。

  很明显,能够访问服务器上未经授权的文件,其后果可想而知。攻击者一旦获取了这种权限,他就可以在我们的系统中造成非常严重的破坏,从而危及用户信息。

  下面让我们更加深入地研究导致此漏洞的原因,以及你的服务器运行什么样的系统是何等重要。现在,让我们先看看几个路径遍历攻击的示例。

路径遍历攻击示例

  你可能会问,一个典型的路径遍历攻击是什么样的?

  其实很简单:

../../etc/passwd

  出乎你的预料,对吗?

  路径遍历攻击的核心思想就是找到一种方法,访问开发人员和应用程序不希望你访问的文件夹。因此,如果你对如何访问路径和Linux命令行有所了解的话,你就可以在不受保护的应用程序中进行相应的操作,从而实现路径遍历攻击。

  下面是一些具体的例子。

相对路径攻击

  相对路径攻击本质上就和我们上面所描述的一样。如果应用程序缺少有效的用户输入验证,攻击者可以利用该漏洞试图访问服务器中受限制的文件。这样情况下,passwd文件中包含我们在服务器上的密钥就有可能被泄露。

  当然,你可以增强用户输入验证,以减轻这种漏洞所带来的风险。一种简单的方法是使用path.normalize()并对用户输入进行特殊字符过滤——顺便说一下,你应该始终对用户输入的内容进行过滤和验证——这可以避免许多问题。

有毒的Null字节攻击

  在HTTP请求中,通过在字符串的末尾添加NULL字节和\0,攻击者可以绕开用户输入验证和过滤,从而访问未经授权的文件和目录。

  那会是怎样的呢?就像这样:

/../../../../../../../../../../../../../../../../etc/passwd%00

  请注意末尾的%00。我们的验证程序最终可能会将其翻译为\0.txt\0,从而允许访问passwd文件。

  为了阻止此类攻击,你只需要添加下面的代码对用户输入的内容进行验证:

if (user_input.indexOf('\0') !== -1) {
return respond('Access denied');
}

  还算简单,对吧?

  路径遍历攻击其实并不复杂。正如我们前面所提到的,它依赖于糟糕的访问控制逻辑的实现或者一些边界值判断。不过这些漏洞可能非常危险,我们应该尽可能地阻止或减少这些漏洞的发生,好消息是要做到这一点并不难。

其它阻止Node.js中路径遍历攻击的方法

  当然,还有许多方法可以用来增强我们应用程序的安全性。JavaScript已经足够成熟,它提供了大量的文档用以指导我们采用不同的方法来减少攻击,这里我将列出其中一部分。

路径前缀验证

  在应用程序中只允许某种级别的遍历会怎么样?在某些情况下,你可能希望应用程序允许用户在不同的文件夹中查找文件——例如,个人资料图片和文章都存放在不同的文件夹中。你可以在代码中进行硬编码来验证路径字符串,就像请求特定资源时使用的变量一样,但是这样做可能导致前缀路径遍历攻击。

  如果用户被允许在应用程序中输入点和斜线等字符,那么攻击者就可以自由地遍历目录。为了阻止这种情况的发生,我们需要验证用户的输入并过滤掉这些字符,或者直接显示错误信息。

白名单

  白名单是一种直接有效的方法,它可以减少漏洞被利用的可能性。当然,你不能指望白名单一定能派上用场,但在需要的时候总是能起到一定的作用。

  一个简单的例子是验证用户输入的内容是否符合某个预定义的标准。例如,如果你规定应用程序只允许创建和处理路径中包含小写字母和数字字符的文件,那么你就可以验证用户输入的内容中只包含这类字符。

if (!/^[a-z0-9]+$/.test(user_input)) {
return respond('Access denied');
}

  通过添加以上验证方法,你可以针对恶意攻击添加一层额外的防护。

路径连接

  最后,我们将实现一个通用的验证方案,为我们可能面临的所有这些漏洞提供一个较为健壮的方法,最终生成一个安全的路径字符串。

  这个解决方案的代码看起来是这样的:

var root = '/var/www/';
exports.validatePath = (user_input) => {
if (user_input.indexOf('\0') !== -1) {
return 'Access denied';
}
if (!/^[a-z0-9]+$/.test(user_input)) {
return 'Access denied';
}
var path = require('path');
var safe_input = path.normalize(user_input).replace(/^(\.\.(\/|\\|$))+/, '');
var path_string = path.join(root, safe_input);
if (path_string.indexOf(root) !== 0) {
return 'Access denied';
}
return path_string;
}

  正如你所看到的,我们将前面讨论过的所有检查和验证方法合并到一起,包括可能对系统造成的任何风险。

写在最后

  JavaScript是一种成熟而健壮的语言,因此有无数种方法可以解决这个问题。然而这些方法都不是最完美的,只有满足你的需求并进行了充分测试的方法才是最好的。

  虽然解决方法看起来很简单,但要确保执行良好的路径遍历安全策略十分重要。我们需要尽可能地覆盖应用程序中的潜在缺口。当然,技术在不断更新,将来会出现更强大、更全面的解决方案来防止此类问题的发生。只要我们的方法有效且具备创造性,我们总会堵住系统中存在的漏洞。

原文地址:Node.js Path Traversal Guide: Examples and Prevention

标签:遍历,..,NodeJS,攻击,路径,示例,应用程序,漏洞
From: https://www.cnblogs.com/jaxu/p/18179224

相关文章

  • 关于单向不循环链表的创建、插入、删除、遍历、检索
    关于单向不循环链表的创建、插入、删除、遍历、检索单向不循环链表公式初始化单向不循环链表构建单向不循环链表结构体//创建结构体类型typedefstructone_way_node{//数据域chardata[DATA_LEN];//指针域structone_way_node*next;}ONE_WAY_NOD......
  • 如何根据二叉树遍历结果快速绘制二叉树
    一、已知前序遍历和中序遍历(1)前序遍历(根结点--->左子树--->右子树)ABDGHCEIF(2)中序遍历(左子树--->根结点--->右子树)GDHBAEICF注意:在最后连接二叉树时,注意先完玩左子树,再连右子树二、已知前后序遍历和中序遍历(1)后序遍历(左子树--->右......
  • 已知前中后序遍历的其中两种推断出最后一种序遍历
    已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是?方法1:首先可以确定c为根d为最左子树由中序debac假设b为第2排的子树那么后序的后两位应该是bcyu本题题目后序不符合由中序debac假设e为第2排的字数那么后序的后两位应该是ec符合本题题目后序由后......
  • 目录遍历-基于Pikachu的学习
    目录遍历原理目录浏览漏洞是由于网站存在配置缺陷,存在目录可浏览漏洞,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以更容易得到网站权限,导致网站被黑。Pikachu打开题目就是两个超链接,我随便点了一个发现url发现变化,有一个参数值titl......
  • openGauss 并发写入示例
    并发写入示例本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。CREATETABLEtest(idint,namechar(50),addressvarchar(255));相同表的INSERT和DELETE并发相同表的并发INSERT相同......
  • 105. 106. 从中序与后序遍历序列构造二叉树
    https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/思路和106.从中序与后序遍历序列构造二叉树相同/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoder......
  • LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例
    嵌入模型是大型语言模型检索增强生成(RAG)的关键组成部分。它们对知识库和用户编写的查询进行编码。使用与LLM相同领域的训练或微调的嵌入模型可以显著改进RAG系统。然而,寻找或训练这样的嵌入模型往往是一项困难的任务,因为领域内的数据通常是稀缺的。但是这篇论文LLM2Vec,可以将......
  • 106. 从中序与后序遍历序列构造二叉树(leetcode)
    https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/要点是明白中序和后序如何构造二叉树的,并且需要理清当前递归函数的语义,不要一开始就陷入细节,而是思考整棵树与其左右子树的关系,语义是:即构造当前节点,给当前节点左右子树赋值,明......
  • 窗口程序框架示例代码
    #include<windows.h>//创建窗口程序的步骤://1.创建WinMain()主函数//2.设计窗口//3.注册窗口//4.创建窗口//5.显示窗口//回调函数,消息处理函数LRESULTCALLBACKWndProc(HWNDhwnd,//窗口句柄 UINTMessage,//消息 WPARAMwParam,//消息参数 ......
  • 大模型_2.2:Prompt示例
    1、行业洞察分析  行业洞察分析的方法论:使用麦肯锡工作法可以快速了解一个行业。Step1:通过搜索分析几十个与该行业相关的关键词,覆盖该行业的上下游,以获取全面的信息。Step2:阅读一些行业最新的研究分析报告,这些报告通常包含了行业趋势、市场规模、竞争格局等重要信息。Step......