1 文件上傳過程分析
1.1 PHP文件上傳
關於PHP中$_files數組的使用方法
1.2 PHP文件上傳源代碼
前端上傳頁面:upfile.php
上傳處理程序:upload.php
1.3 PHP文件上傳過程分析
2 文件上傳風險:
- 允許用戶上傳文件是一個巨大的安全風險。攻擊者可以通過上傳文件位置,上傳可執行的網頁木馬、一句話以及.exe 可執行文件。
- 上傳程序需要嚴格限制上傳文件的類型,一般原則上只允許上傳圖片、音樂、文檔等不可執行的文件。
2.1 文件上傳檢測控制方法
1 、通過前端JavaScript 檢測文件擴展名
2 、服務器端檢測文件傳輸類型content_type
MIME類型檢測是客戶端在上傳文件到服務端的時候,服務端對客戶端上傳的文件的content_type類型進行檢測,如果是白名單所允許的,則可以正常上傳, 否則上失敗。
3 、服務器端檢測文件擴展名
當客戶端將文件提交到服務端的時候, 服務端會根據自己設定的黑白名單對客戶端提交上來的文件擴展名進行判斷, 如果上傳的文件擴展名是黑名單里面所限制的,則不予上傳, 否則正常上傳。
strrchr() 函數查找字符串在另一個字符串中最后一次出現的位置, 並返回從該位置到字符串結尾的所有字符。
4 、服務器端文件內容檢測
服務器端文件擴展名檢測,主要利用黑名單或白名單機制的不足或者利用解析洞,00 截斷實現上傳。
- 黑名單: 只要未在黑名單重定義的, 均可以上傳。例如特殊的可執行文件.asa .cer 等可以在iiis 執行
- 白名單: 相對黑名單安全
5 、00 截斷的應用
正常傳遞符合檢測的圖片文件
通過burp攔截請求,在hex中更改字符為00
6、getimagesize() 讀取文件的格式
一般文件內容的檢測使用getimagesize() 函數檢測, 會判斷文件是否是一個有效的圖片文件, 如果是, 則允許上傳, 否則的話, 不允許上傳。
2.2 繞過方法:
- 將webshell擴展名更改為允許類型,如.jpg
- 利用burp攔截請求,攔截請求后修改文件名為.php文件
- 將一句話代碼嵌入到圖片中, 構造圖片馬, 上傳圖片
- 通過解析漏洞或其他方法還原gif 為可執行文件