NodeJS路徑遍歷攻擊:示例及預(yù)防,如etc/passwd
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
讓我們來(lái)看看什么是路徑遍歷攻擊,以及在Node.js中可以采用哪些方法來(lái)阻止這種攻擊。 構(gòu)建一個(gè)安全而健壯的應(yīng)用程序需要考慮的因素很多,并非一件容易的事情。要確保覆蓋所有潛在的漏洞是一項(xiàng)十分艱巨的任務(wù),這需要大量的經(jīng)驗(yàn)和指導(dǎo)。在這些漏洞中,有一個(gè)和系統(tǒng)目錄訪問(wèn)安全相關(guān)的漏洞,它通常會(huì)在程序進(jìn)行路徑遍歷時(shí)受到攻擊。 理解這一點(diǎn)有助于你找到解決問(wèn)題的辦法。網(wǎng)絡(luò)上有大量相關(guān)的資源可以幫助你解決該問(wèn)題,本文只是諸多資源中的一個(gè)。 本文旨在介紹路徑遍歷攻擊的原理,以及使用Node.js可以采取哪些方法來(lái)阻止這類攻擊。首先,我們將簡(jiǎn)要介紹什么是路徑遍歷攻擊,然后將探討一些常見(jiàn)的示例,最后介紹如何修復(fù)這些漏洞。通過(guò)本文的介紹,你應(yīng)該對(duì)路徑訪問(wèn)遍歷有一個(gè)基本的了解,并能夠在你的程序中阻止相關(guān)的漏洞。 請(qǐng)注意,本文是專門(mén)針對(duì)Node.js開(kāi)發(fā)人員的。因此,我們希望你對(duì)Node.js開(kāi)發(fā)棧有一個(gè)基本的了解。如果你還沒(méi)有嘗試過(guò),請(qǐng)查看Node.js指南以獲得更多的信息。 路徑遍歷介紹什么是路徑遍歷攻擊?它是一種利用服務(wù)器端糟糕的訪問(wèn)控制漏洞而實(shí)現(xiàn)的攻擊,特別是對(duì)文件的訪問(wèn)。在這類攻擊中,攻擊者試圖通過(guò)向應(yīng)用程序中注入無(wú)效或惡意的內(nèi)容來(lái)訪問(wèn)服務(wù)器上受限制的文件??梢园阉醋魇荢QL注入,但針對(duì)的是系統(tǒng)目錄而不是數(shù)據(jù)庫(kù)。 很明顯,能夠訪問(wèn)服務(wù)器上未經(jīng)授權(quán)的文件,其后果可想而知。攻擊者一旦獲取了這種權(quán)限,他就可以在我們的系統(tǒng)中造成非常嚴(yán)重的破壞,從而危及用戶信息。 下面讓我們更加深入地研究導(dǎo)致此漏洞的原因,以及你的服務(wù)器運(yùn)行什么樣的系統(tǒng)是何等重要?,F(xiàn)在,讓我們先看看幾個(gè)路徑遍歷攻擊的示例。 路徑遍歷攻擊示例你可能會(huì)問(wèn),一個(gè)典型的路徑遍歷攻擊是什么樣的? 其實(shí)很簡(jiǎn)單: ../../etc/passwd 出乎你的預(yù)料,對(duì)嗎? 路徑遍歷攻擊的核心思想就是找到一種方法,訪問(wèn)開(kāi)發(fā)人員和應(yīng)用程序不希望你訪問(wèn)的文件夾。因此,如果你對(duì)如何訪問(wèn)路徑和Linux命令行有所了解的話,你就可以在不受保護(hù)的應(yīng)用程序中進(jìn)行相應(yīng)的操作,從而實(shí)現(xiàn)路徑遍歷攻擊。 下面是一些具體的例子。 相對(duì)路徑攻擊相對(duì)路徑攻擊本質(zhì)上就和我們上面所描述的一樣。如果應(yīng)用程序缺少有效的用戶輸入驗(yàn)證,攻擊者可以利用該漏洞試圖訪問(wèn)服務(wù)器中受限制的文件。這樣情況下,passwd文件中包含我們?cè)诜?wù)器上的密鑰就有可能被泄露。 當(dāng)然,你可以增強(qiáng)用戶輸入驗(yàn)證,以減輕這種漏洞所帶來(lái)的風(fēng)險(xiǎn)。一種簡(jiǎn)單的方法是使用path.normalize()并對(duì)用戶輸入進(jìn)行特殊字符過(guò)濾——順便說(shuō)一下,你應(yīng)該始終對(duì)用戶輸入的內(nèi)容進(jìn)行過(guò)濾和驗(yàn)證——這可以避免許多問(wèn)題。 有毒的Null字節(jié)攻擊在HTTP請(qǐng)求中,通過(guò)在字符串的末尾添加NULL字節(jié)和\0,攻擊者可以繞開(kāi)用戶輸入驗(yàn)證和過(guò)濾,從而訪問(wèn)未經(jīng)授權(quán)的文件和目錄。 那會(huì)是怎樣的呢?就像這樣: /../../../../../../../../../../../../../../../../etc/passwd%00 請(qǐng)注意末尾的%00。我們的驗(yàn)證程序最終可能會(huì)將其翻譯為\0.txt\0,從而允許訪問(wèn)passwd文件。 為了阻止此類攻擊,你只需要添加下面的代碼對(duì)用戶輸入的內(nèi)容進(jìn)行驗(yàn)證: if (user_input.indexOf('\0') !== -1) { return respond('Access denied'); } 還算簡(jiǎn)單,對(duì)吧? 路徑遍歷攻擊其實(shí)并不復(fù)雜。正如我們前面所提到的,它依賴于糟糕的訪問(wèn)控制邏輯的實(shí)現(xiàn)或者一些邊界值判斷。不過(guò)這些漏洞可能非常危險(xiǎn),我們應(yīng)該盡可能地阻止或減少這些漏洞的發(fā)生,好消息是要做到這一點(diǎn)并不難。 其它阻止Node.js中路徑遍歷攻擊的方法當(dāng)然,還有許多方法可以用來(lái)增強(qiáng)我們應(yīng)用程序的安全性。JavaScript已經(jīng)足夠成熟,它提供了大量的文檔用以指導(dǎo)我們采用不同的方法來(lái)減少攻擊,這里我將列出其中一部分。 路徑前綴驗(yàn)證在應(yīng)用程序中只允許某種級(jí)別的遍歷會(huì)怎么樣?在某些情況下,你可能希望應(yīng)用程序允許用戶在不同的文件夾中查找文件——例如,個(gè)人資料圖片和文章都存放在不同的文件夾中。你可以在代碼中進(jìn)行硬編碼來(lái)驗(yàn)證路徑字符串,就像請(qǐng)求特定資源時(shí)使用的變量一樣,但是這樣做可能導(dǎo)致前綴路徑遍歷攻擊。 如果用戶被允許在應(yīng)用程序中輸入點(diǎn)和斜線等字符,那么攻擊者就可以自由地遍歷目錄。為了阻止這種情況的發(fā)生,我們需要驗(yàn)證用戶的輸入并過(guò)濾掉這些字符,或者直接顯示錯(cuò)誤信息。 白名單白名單是一種直接有效的方法,它可以減少漏洞被利用的可能性。當(dāng)然,你不能指望白名單一定能派上用場(chǎng),但在需要的時(shí)候總是能起到一定的作用。 一個(gè)簡(jiǎn)單的例子是驗(yàn)證用戶輸入的內(nèi)容是否符合某個(gè)預(yù)定義的標(biāo)準(zhǔn)。例如,如果你規(guī)定應(yīng)用程序只允許創(chuàng)建和處理路徑中包含小寫(xiě)字母和數(shù)字字符的文件,那么你就可以驗(yàn)證用戶輸入的內(nèi)容中只包含這類字符。 if (!/^[a-z0-9]+$/.test(user_input)) { return respond('Access denied'); } 通過(guò)添加以上驗(yàn)證方法,你可以針對(duì)惡意攻擊添加一層額外的防護(hù)。 路徑連接最后,我們將實(shí)現(xiàn)一個(gè)通用的驗(yàn)證方案,為我們可能面臨的所有這些漏洞提供一個(gè)較為健壯的方法,最終生成一個(gè)安全的路徑字符串。 這個(gè)解決方案的代碼看起來(lái)是這樣的: 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; } 正如你所看到的,我們將前面討論過(guò)的所有檢查和驗(yàn)證方法合并到一起,包括可能對(duì)系統(tǒng)造成的任何風(fēng)險(xiǎn)。 寫(xiě)在最后JavaScript是一種成熟而健壯的語(yǔ)言,因此有無(wú)數(shù)種方法可以解決這個(gè)問(wèn)題。然而這些方法都不是最完美的,只有滿足你的需求并進(jìn)行了充分測(cè)試的方法才是最好的。 雖然解決方法看起來(lái)很簡(jiǎn)單,但要確保執(zhí)行良好的路徑遍歷安全策略十分重要。我們需要盡可能地覆蓋應(yīng)用程序中的潛在缺口。當(dāng)然,技術(shù)在不斷更新,將來(lái)會(huì)出現(xiàn)更強(qiáng)大、更全面的解決方案來(lái)防止此類問(wèn)題的發(fā)生。只要我們的方法有效且具備創(chuàng)造性,我們總會(huì)堵住系統(tǒng)中存在的漏洞。 原文地址:Node.js Path Traversal Guide: Examples and Prevention 轉(zhuǎn)自https://www.cnblogs.com/jaxu/p/18179224 該文章在 2025/7/14 9:12:50 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |