文件上傳漏洞所需的條件
一是文件可上傳(感覺這一句是廢話)。
二是上傳文件路徑可知,如果路徑不可知就沒法訪問,亦無法配合諸如文件包含漏洞進行文件執行。
三是上傳文件可以被訪問。
四是上傳文件可以被執行,當然這一步也不是必需的,比如配合文件包含漏洞。
繞過姿勢
文件上傳校驗姿勢
- 客戶端javascript校驗(一般只校驗後綴名)
- 服務端校驗
- 文件頭content-type字段校驗(image/gif)
- 文件內容頭校驗(GIF89a)
- 後綴名黑名單校驗
- 後綴名白名單校驗
- 自定義正則校驗
- WAF設備校驗(根據不同的WAF產品而定)
0X00:前端js檢查後綴名
(1)、禁用瀏覽器端的js功能
直接刪除代碼中onsubmit事件中關於文件上傳時驗證上傳文件的相關代碼。
(2)、Firebug修改源碼
直接更改文件上傳JS代碼中允許上傳的文件擴展名你想要上傳的文件擴展名。
(3)、Burpsuite抓包修改後綴名
(4)、本地表單提交
0X01:服務端MIME類型檢測 contentType
Burpsuite抓包修改contentType的值
0X02:目錄路徑檢測
(1)、用0x00進行截斷(php5.3.4以下+magic_qoute_gpc爲off時,魔術符號會將 ’、”、null(%00)加反斜槓轉義 )
(2)、在路徑中設置一個.asp的文件,利用解析漏洞(IIS6.0+ASP解析漏洞)
將path變量的值改爲x.asp
當文件夾名爲XX.asp時,文件夾中的文件都會以asp的格式來解析,這是利用了IIS的解析漏洞
0X03:服務端擴展名檢測
(1)、基於黑名單的檢測
A、文件名大小寫繞過
B、名單列表繞過 asp格式的,黑名單裏面沒有asa cer的
C、特殊文件名繞過
x.asp_ 下劃線爲一個空格(需要在burp裏面改以繞過驗證),windows會自動去掉後面的點和空格
D、0x00截斷繞過
asp 程序有此漏洞 x.asp_.jpg(下劃線爲00截斷符) 檢測時gettype()從後往前,判定爲jpg,保存時一00截斷符爲界,將asp最爲後綴名存入。
E、htaccess文件重寫
重寫過濾規則,允許asp格式的
(2)、基於白名單的
A、0x00截斷繞過
B、解析調用/漏洞繞過
5、服務端文件內容檢測
0X03:文件內容檢測
(1)、文件幻數檢測(文件頭)
JPG :FF D8
GIF:47 49 46
PNG:89 50 4E
在幻數後面加上自己的一句話就可
(2)、文件相關信息檢測
圖像文件 getimagesize() 只需要僞造好文件頭就可 在文件首部加入GIF89a
(3)、文件加載檢測
代碼注入繞過:找一個空白區進行代碼的填充
解決方案
1、文件上傳的目錄設置爲不可執行
2、判斷文件類型:強烈推薦白名單方式。此外,對於圖片的處理,可以使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。
3、使用隨機數改寫文件名和文件路徑:一個是上傳後無法訪問;再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因爲重命名而無法攻擊。
4、單獨設置文件服務器的域名:由於瀏覽器同源策略的關係,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。