[Checkmarx掃描漏洞處理] - Path traversal

[Checkmarx掃描漏洞處理] - Path traversal

當要下載/瀏覽的檔案路徑是經由組合出來的時候,就可能會有Path traversal的問題。

因為只要變更路徑為[../]就可以瀏覽上一層的資料夾,使用者就可以任意讀取網站內的檔案。

解決方法就是在讀取前先驗證檔案路徑是否符合瀏覽條件,因專案需求,驗證規則為檔案存在於根目錄下的任一資料夾即可

以遞迴的方式一層一層往下找檔案:

private string GetValidPathPart(string rootPath, string filePath)
{
    string result = "";
    string sFilePath = Path.GetFullPath(filePath);
    string sFileName = Path.GetFileName(sFilePath).Replace("/", "").Replace("\\", "");
    string sDirPath = Path.GetDirectoryName(sFilePath);
    string rDirPath = Path.GetDirectoryName(rootPath);

    if (rDirPath.ToLower() == sDirPath.ToLower() && File.Exists(Path.Combine(rDirPath, sFileName)))
    {
        result = sFilePath;
    }
    else
    {
        string[] dirs = Directory.GetDirectories(rootPath);
        foreach (string dir in dirs)
        {
            if (dir.ToLower() == sDirPath.ToLower() && File.Exists(Path.Combine(dir, sFileName)))
            {
                result = sFilePath;
                break;
            }
            else
            {
                result = GetValidPathPart(dir, filePath);
            }
        }
    }
    return result;
}

傳入的rootPath為要驗證的根目錄路徑,filePath則是組好的檔案路徑,

只要組好的檔案有存在於根目錄下任一資料夾(不限階層)即回傳該檔案路徑,否則回傳空字串。

如此就可以通過Checkmarx檢測囉~

P.S. 因本專案因framework版本問題,故用傳統的迴圈處理,也可以用Linq找檔案,做法可參考以下連結。

參考資料

https://dotblogs.com.tw/shadow/2017/11/09/153304