第一次接觸到目錄遍歷漏洞仍是在 ThinkJS 2 的時候。代碼以下圖,目的是當用戶訪問的 URL 是靜態資源的時候返回靜態資源的地址。其中 pathname
就是用戶訪問的 URL 中的路徑,咱們發現代碼中只是簡單的解碼以後就在22行將其與資源目錄作了拼接,這就是很是明顯的目錄遍歷漏洞了。linux
爲何這麼說呢?假設用戶訪問的 URL 是 http://xxx.com/../../../xxx.jpg
的話最終返回的文件地址就會變成 think.RESOURCE_PATH
的上三層目錄中的文件了。而這種利用網站的安全缺陷來列出服務器目錄或者文件的方式就成爲目錄遍歷漏洞(Directory traversal),也稱之爲路徑遍歷漏洞(英文:Path traversal)。git
目錄遍歷在英文世界裏又名../ 攻擊(Dot dot slash attack)、目錄攀登(Directory climbing)及回溯(Backtracking)。其部分攻擊手段也可劃分爲規範化攻擊(Canonicalization attack)。
via: wikipedia
目錄遍歷最大的危害是可以讓任意用戶訪問系統的敏感文件,繼而攻陷整個服務器。例如獲取linux下的/etc/passwd文件後可能會破解出root用戶的密碼等。github
能夠看到大部分狀況下問題的關鍵就是 ../
目錄跳轉符,因此防護的第一要務就是它進行過濾。除了過濾以外,還能夠針對最終的文件路徑進行判斷,確保請求文件完整目錄後的頭N個字符與文檔根目錄徹底相同,若是相同則返回內容,不然則多是攻擊地址不予返回。安全
回到文章開頭說的那個代碼問題,最終就是經過上述方法修復的,對最終的文件地址進行規範化後判斷開頭是否包含 RESOURCE_PATH
目錄,若是不包含則返回空。服務器