公司專案最近到中期了,開始做CheckMarx的原碼掃描,公司也有另一種是用Acunetix工具的掃瞄,不過這部分只聽過是給他URL他就會去try裡面的所有前端的測試。
說到Path Traversal 這邊要先釐清 Web path & Physical path 的差異
其實就是差在 "/" & "\\"
~/Uploads/2dda2bbda14b88e966412cd90c7026c7
以這段Web Path 作為例子 (下方ActFolder的Web路徑)
其實就是前端(View)有時候會有需要傳遞路徑來到Controller(Action)
正常情況就是
會有一個Action 接收傳進來的web url 參數[ActFolder] 為這個範例的Web Url
[HttpPost]
public JsonResult QueryFileActFolder(string ActID, string ActFolder)
{
// 檔案上傳根目錄
string enCodeActFolder = HttpUtility.HtmlEncode(ActFolder);
string uploadFileRootPath = Server.MapPath(enCodeActFolder);
}
然後我們再透過Server.MapPath 就可以找出對應的 實體路徑(physical url)
但今天如果是有心人事,想要透過前端傳入其他奇怪的字串,如: \ or ..
想知道你實體的分層路徑,這就是 Path Traversal 風險
[HttpPost]
public JsonResult QueryFileActFolder(string ActID, string ActFolder)
{
// 檔案上傳根目錄
string enCodeActFolder = HttpUtility.HtmlEncode(ActFolder);
enCodeActFolder = enCodeActFolder.Replace(@"\", "").Replace("..", "");
string uploadFileRootPath = Server.MapPath(enCodeActFolder);
}
所以我們會在Web Url 傳進來的時候(這時的enCode也是為了防止XSS攻擊,擋下Script標籤的嘗試)
把 \ & .. Replace 掉
這樣就可以解決 Path Traversal 的問題了
---------------------------------
以上如果有誤,歡迎留言交流讓我學習
謝謝~