0x00 漏洞概述
任意文件上傳漏洞主要是由於程序員在開發文件上傳功能時,沒有考慮對文件格式后綴的合法性進行校驗或只考慮在應用前端(Web 瀏覽器端)通過 javascript 進行后綴校驗,攻擊者可上傳一個包含惡意代碼的動態腳本(如 jsp、asp、php、aspx 文件后綴)到服務器上,攻擊者訪問該腳本時服務器將對包含惡意代碼的動態腳本解析,最終執行相應的惡意代碼。該漏洞最終將可能直接影響應用系統的服務器安全,攻擊者可通過所上傳的腳本完全控制服務器。
0x01測試方法
對文件上傳頁面進行測試,有多種上傳測試方式判斷是否存在任意文件上傳漏洞。
方式一:直接上傳
在上傳過程中,直接選擇動態腳本后綴的文件,如 asp、php、jsp、aspx 等文件格式,觀察是否上傳成功。

方式二:繞過JS上傳
當上傳頁面在前端采用 javascript 進行文件后綴限制時,可通過 HTTP 抓包工具進行改包上傳,如上傳 jpg 后綴,通過HTTP 抓包工具捕捉到以下請求數據包,將數據包的 filename 參數值從 oneword_pass.jpg 修改為 oneword_pass.php 並重新進行上傳提交即可繞過javascript 驗證。


方式三:截斷后綴上傳
部分上傳功能在對后綴名進行驗證時存在缺陷,導致在文件寫入過程中產生錯誤,導致可通過十六進制截斷符(%00)對后綴進行截斷。如下圖,上傳處理時將對檢測到%00 並對.jpg 字符串進行截斷刪除,最終文件名為 oneword_pass.php 導致可成功上傳動態腳本到服務器上。

方式四:繞過 Content-Type 檢查上傳
部分上傳頁面只對文件類型進行驗證,導致可通過改包的方式上傳動態腳本到服務器上。如下圖,通過修改 Content-Type 的參數值為 image/jpg,程序將認為本次提交的為圖片格式類型,並不進行后綴驗證,最終成功繞過 Content-Type 檢查上傳動態腳本到服務器上。

0x02防護思路
1、前端,加強文件檢查過濾,相關強度可以參考DVWA等級源碼。
2、過程中,針對上傳文件進一步做處理,如圖片的價水印、縮略圖,無異常后才保存到后台;針對文件命名做限制,須由系統生成,不允許用戶自定義。
3、后台,限制上傳文件目錄無法直接訪問,設置該目錄不解析jsp等腳本語言。
