
2024年最佳天氣API
return respond('Access denied');
}
比較簡單,對吧?
正如我們之前提到的,路徑遍歷攻擊并不是非常復雜。相反,它們依賴于糟糕的訪問控制實現或更新不良的代碼導致的邊緣情況漏洞。
然而,它們可能非常危險,我們應盡可能地減輕它們的影響。
好消息是,這并不難。
幸運的是,我們可以采取許多措施來彌補安全方面的可能漏洞。我們在此列出了一些。
但是,如何在您的應用程序中允許某種程度的遍歷呢?在某些情況下,您可能希望應用程序允許用戶在不同的文件夾中找到文件,例如個人資料圖片和文章,它們都位于各自的文件夾中。
您可以實現硬編碼路徑驗證,例如請求特定資源時使用的變量。但是,這樣做可能會使自己遭受前綴路徑遍歷攻擊。
如果用戶可以在應用程序中輸入點和斜線而不驗證生成的字符串,則攻擊者可以自由遍歷目錄。
為了緩解這種情況,我們需要驗證用戶輸入不包含這些字符并將其刪除或直接顯示錯誤。
像這樣簡單的事情就可以了:
public bool IsPathTraversing(string path) {
bool result = false;
if (String.IsNullOrWhiteSpace(path)) {
return result;
}
// Url decode to reveal sneaky encoded attempts e.g. '%2f' (/) or '%2e%2e%2f' (../)
var decodedPath = HttpUtility.UrlDecode(path);
if (decodedPath.Contains("/") ||
decodedPath.Contains(@"\") ||
decodedPath.Contains("$") ||
decodedPath.Contains("..") ||
decodedPath.Contains("?")) {
result = true;
}
return result;
}
安全列表是一種簡單且相對有效的方法,可以減少漏洞利用的可能性。當然,您不會總是能夠使用它,但您應該盡可能使用它。
安全列表的一個簡單示例是驗證用戶輸入是否符合預定義的某個標準。例如,如果您已將應用程序編碼為僅創建和處理包含小寫字母數字字符的文件,則可以驗證用戶是否僅輸入此類字符。
protected string readFile(string location) {
Regex regex = new Regex(@"([a-zA-Z0-9\s_\\.\-:])+(.dat)$");
Match match = regex.Match(location);
if (match.Success) {
if (File.Exists(location)) {
using (StreamReader reader = new StreamReader(location)) {
return reader.ReadToEnd();
}
} else {
return "File not found";
}
} else {
return "File name not valid";
}
}
通過向用戶輸入添加此驗證,您可以獲得額外的保護層來抵御惡意攻擊。
最后,解決所有這些差距并為我們可能面臨的所有潛在漏洞創建一個強大的解決方案的一種方法是實施一個包含所有這些測試并創建安全的最終路徑字符串的通用驗證方案。
解決方案的一個例子看起來像這樣。
protected string readFile(string location) {
Regex regex = new Regex(@"([a-zA-Z0-9\s_\\.\-:])+(.dat)$");
Match match = regex.Match(location);
if (match.Success) {
if (File.Exists(location) && Path.GetFullPath(location).StartsWith(@"C:\Applications\Documents", StringComparison.OrdinalIgnoreCase)) {
using (StreamReader reader = new StreamReader(location)) {
return reader.ReadToEnd();
}
} else {
return "File not found";
}
} else {
return "File name not valid";
}
}
正如您所看到的,我們已經整合了所有已經討論過的檢查和驗證,以涵蓋任何可能對我們系統濫用的行為。
盡管看起來很簡單,但必須確保我們執行良好的路徑遍歷安全策略并覆蓋應用程序中盡可能多的潛在漏洞。
技術將繼續發展,更加強大和全面的解決方案將緩解這些問題。
然而,請不要忘記,只要我們采取徹底而富有創意的方法,我們總能彌補系統的不足。
鑒于 .NET 是一個如此成熟和強大的平臺,有多種方法可以解決這個問題。只需確保找到滿足您需求的方法并充分測試您的方法和實現即可。
文章來源:.NET Path Traversal Guide: Examples and Prevention