新世界NEW WORLD封測開啟,野豹加速器教你如何免費暢玩
概述
檔案上傳漏洞是指服務端未對客戶端上傳的檔案進行嚴格的驗證和過濾,導致使用者可以上傳一個可執行指令碼,並且能通過指令碼獲得了執行伺服器端命令的能力
危害
非法使用者可以利用上傳的惡意指令碼檔案控制整個網站,甚至控制伺服器.這個惡意指令碼檔案,又被稱為Webshell,也可將Webshell稱為一種網頁後門,Webshell指令碼具有非常強大的功能,比如檢視伺服器目錄,伺服器中的檔案執行系統命令
- 上傳的檔案是web指令碼語言,伺服器的web容器解釋並執行了使用者上傳的指令碼,導致程式碼執行;
- 上傳的檔案是flash的策略檔案crossdomain.xml,黑客用以控制flash在該域下的行為(其他通過類似方式控制策略檔案的情況類似)
- 上傳檔案是病毒,木馬檔案,黑客用以誘騙使用者或管理員下載執行
- 上傳檔案是釣魚圖片,或包含了指令碼的圖片,在某些版本的瀏覽器中會被作為指令碼執行,被用於釣魚和欺詐
攻擊實現的前提條件
首先上傳的檔案能被Web容器執行解釋,所以檔案上傳後所在目錄要是web容器所覆蓋到的路徑
其次,使用者能從web上訪問這個檔案.如果檔案上傳了,但使用者無法通過web訪問,或者無法使得web容器解釋這個指令碼,那也不能稱之為漏洞
最後,使用者上傳的檔案若能被安全檢查,格式化,圖片壓縮等功能改變了內容,則也可能導致攻擊不成功
攻擊方式
1.JS檢測繞過攻擊
JS檢測繞過上傳漏洞常見於使用者選擇檔案上傳的場景,如果上傳檔案的字尾不被允許,則會彈窗告知,此時上傳檔案的資料併為傳送到服務端,只是在客戶端使用javascript對資料包進行檢測
這時,有兩種方法繞過:
- 使用瀏覽器外掛,刪除檢測檔案字尾的JS程式碼,然後上傳檔案繞過即可
- 首先把需要的檔案字尾改成允許上傳的繞過js的檢測,再抓包,把字尾名改成可執行檔案的字尾名即可上傳成功
2.檔案字尾繞過攻擊
檔案字尾繞過攻擊是服務端程式碼中限制了某些字尾的檔案不允許上傳,但是有些Apache是允許解析其他檔案字尾的,例如在httpd.com中,如果配置中有
AddType application/x-httpd-php .php .phtml
則能夠解析php和phtml檔案
在apach的解析順序中,是從右至左開始解析檔案字尾,如果最右側的副檔名不可識別,就繼續往左判斷,知道遇到可以解析的檔案字尾為止,所以如果上傳的檔名類似1.php.xxxx,因為字尾xxxx不可解析,所以向左解析字尾php
3.檔案型別繞過攻擊
如果服務端是根據客戶端上傳檔案時,傳送的資料包裡的Content-Type值來判斷檔案型別,則修改Content-Type即可繞過服務端檢測
服務端$_FILES["file"]["type"]
中的type就是客戶端傳的Content-type值,所以修改Content-Type可繞過$_FILES["file"]["type"]
PHP函式getimagesize()
可以獲取圖片的寬高等資訊,如果上傳的不是圖片檔案,那麼getimagesize()
就獲得不到資訊,不允許上傳,但是我們可以將一個圖片和一個Webshell合併為一個檔案,例如使用cat 1.image webshell.php >image.php
,此時使用getimagesize()
就可以獲取圖片資訊,且webshell的字尾是php,也能被apache解析為指令碼檔案,通過這種方式就可以繞過getimagesize()
的限制
4.檔案截斷繞過攻擊
截斷型別:PHP%截斷
截斷原理:由於00代表結束符,所以會把00後面的所有字元刪除
截斷條件:php版本小於5.3.4,php的magic_quotes_gpc未Off狀態
在多數情況下,截斷繞過都是用在檔名後面加上HEX形式的%00來測試,例如filename='1.php%00.jpg'
,但是由於在php中,$_FILES["file"]["name"]
在得到檔名時.%00後的內容已經被截斷,所以$_FILES["file"]["name"]
得到的字尾名是php,不是php%00.jpg
,因此不能通過if(in_array($file_ext,$ext_arr))
的檢查
5.競爭條件攻擊
一些網站上傳檔案的邏輯是先允許上傳任意檔案,然後檢查上傳的檔案是否包含Webshell指令碼,如果包含則刪除該檔案.
這裡存在的問題是檔案上傳成功後和刪除檔案之間存在一個短的時間差(因為要執行檢查檔案和刪除檔案的操作),攻擊者就可以利用這個時間差完成競爭條件的上傳漏洞攻擊
檔案上傳防禦策略
- 檔案上傳目錄設定為不可執行
- 只要web容器無法解析該目錄下的檔案,即使上傳了指令碼檔案,伺服器也不會受到影響
- 判斷檔案型別
- 判斷型別時,結合使用MIME Type,字尾檢查等方式
- 檔案檢查時使用白名單的方式
- 對於圖片的處理可以使用壓縮函式或者resize函式,用來破壞圖片中可能存在的HTML程式碼
- 使用隨機數改寫檔名和檔案路徑
- 檔案上傳如果要執行程式碼,需要使用者能訪問到這個檔案
- 使用隨機數更改檔案路徑和檔名,極大增加了攻擊成本
- 此外檔案重新命名可以使
.shell.php.rar
,crossdomain
這種檔案所實施的攻擊無法成功
- 單獨設定檔案伺服器域名
- 由於瀏覽器的同源策略,一系列客戶端攻擊將失效
- 比如上傳
crossdomain.xml
,上傳包含JavaScript
的XSS
利用等問題將得到解決