[.net mvc] Path Traversal 風險

公司專案最近到中期了,開始做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 的問題了

---------------------------------

以上如果有誤,歡迎留言交流讓我學習

謝謝~