
使用Python調用免費歸屬地查詢API
路徑遍歷(或雙斜杠)攻擊是一種惡意行為,旨在誘騙 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),則應用程序將返回所請求文件的內容(如果未實施適當的控制)。
路徑遍歷攻擊是一種允許黑客遍歷目錄并讀取或寫入系統上的任何文件的攻擊。黑客可以通過利用不充分的輸入驗證技術來實現這一點。為了能夠成功進行路徑遍歷攻擊,黑客需要滿足以下任何條件:
利用目錄遍歷漏洞最常用的技術是使用附加到易受攻擊的參數的相對路徑。如果參數未正確清理,攻擊者可以從系統中讀取任意文件。
文件擴展名驗證是解決該問題的一種常用方法。然而,許多人忽視了這樣做的危險性。文件擴展名驗證永遠無法替代檢查參數是否試圖訪問其他格式的文件,并且可以使用文件末尾的 Null Byte 輕松繞過。
一些開發人員嘗試轉義或僅替換字符串中的 ../,但這不是一個正確的解決方法,可以通過對轉義字符進行編碼來繞過。在這種情況下,可以對 ../ 進行編碼并通過 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 應用程序更容易受到攻擊,因為它們是在線的。因此,確保它們的安全至關重要。
以下是四條建議:
最重要的最佳實踐之一是保持軟件更新,并在新補丁發布后立即更新。
構建管道是 DevOps 流程的重要組成部分。它允許開發團隊編譯新開發的代碼并將其推送到生產服務器。但是,這個過程可能非常脆弱,特別是如果你沒有正確配置它。
這就是StackHawk 的 DAST 掃描儀的作用所在。您可以將其與 CI/CD 管道集成,從而自動化掃描過程并盡早發現漏洞,包括路徑遍歷、SQL 注入、跨站點腳本等。
這是許多企業忽視的一個簡單步驟。
要求使用攻擊者無法輕易猜到的復雜密碼至關重要。
如果您尚未為您的企業創建密碼策略,您應該立即創建。
HTTPS 是一種在用戶和服務器之間傳遞數據時對其進行加密的協議,以確保沒有人可以攔截它。