簡介
File Upload,即文件上傳漏洞,通常是由於對用戶上傳文件的類型、內容沒有進行嚴格的過濾、檢查,使得攻擊者可以通過上傳木馬,病毒,惡意腳本等獲取服務器的webshell權限,並進而攻擊控制服務器,因此文件上傳漏洞帶來的危害常常是毀滅性的。簡單點說,就是用戶直接或者通過各種繞過方式將webshell上傳到服務器中進而執行利用。例如,如果你的服務器為php環境,用戶上傳了一個php一句話木馬,並通過菜刀連接獲取webshell,就可能對你的服務器文件進行篡改甚至執行命令。
文件上傳校驗方法
客戶端javascript校驗(一般只校驗后綴名)
當客戶端選擇文件點擊上傳的時候,客戶端還沒有向服務器發送任何消息,前端的 js 腳本就對文件的擴展名進行檢測來判斷是否是可以上傳的類型
服務端校驗
- 文件頭content-type字段校驗 后端通過對上傳文件的MIME類型進行黑白名單檢測過濾
- 文件內容頭校驗
不同的文件都有不同的文件頭,文件頭就是為了描述一個文件的一些重要的屬性,它告訴了打開並處理該文件的程序這些屬性。有些上傳接口會檢測你上傳的文件頭信息以此來判斷是否為正真的文件類型,比如 jpg 格式圖片頭部是 JFIF ,gif頭部是GIF89a,png頭部是%PNG。
- 校驗文件大小
一些上傳接口通過函數比如 getimagesize() 函數檢測你上傳的圖片的大小是否是正常的圖片大小,防止上傳一句話木馬。
- 后綴名黑名單校驗
- 后綴名白名單校驗
- 自定義正則校驗
WAF設備校驗
(根據不同的WAF產品而定)
繞過姿勢
1)客戶端校驗
- 先將所上傳文件擴展名改為符合腳本檢測規范的拓展名,在上傳時通過burpsuite抓包,將數據包中文件的拓展名還為原來的,以達到繞過的目的
- 在本地瀏覽器中直接禁用JS
2)文件頭content-type字段校驗
使用burpsurite或firebug等篡改http header中Content-Type的內容,即將Content-Type: application/php改為其他web程序允許的類型,如Content-Type: image/jpg,Content-Type: image/png,Content-Type: text/plain。
常見MIME類型:
text/plain(純文本)
text/html(HTML文檔)
text/javascript(js代碼)
application/xhtml+xml(XHTML文檔)
image/gif(GIF圖像)
image/jpeg(JPEG圖像)
image/png(PNG圖像)
video/mpeg(MPEG動畫)
application/octet-stream(二進制數據)
application/pdf(PDF文檔)
application/(編程語言) 該種語言的代碼
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML郵件的HTML形式和純文本形式,相同內容使用不同形式表示)
application/x-www-form-urlencoded(POST方法提交的表單)
multipart/form-data(POST提交時伴隨文件上傳的表單)
3)文件內容頭校驗
- 在上傳的腳本的頭部加上相應的文件頭字節(php引擎會將 <?之前的內容當作html文本,不解釋而跳過之,后面的代碼仍然能夠得到執行)
附一張各種格式文件內容頭表
- 找一個符合上傳過濾類型的文件與腳本文件合並制作圖片木馬,后將新文件上傳,再結合文件包含漏洞getshell
4)校驗文件大小
在上傳數據里不斷填充垃圾數據或制作圖片木馬進行繞過。
5)黑名單校驗文件后綴名
尋找遺漏文件類型繞過
6)其他繞過方法
- 00截斷
- 后綴名大小寫繞過
- 條件競爭
- 解析漏洞
總結:上傳繞過方法要靈活運用,不能死板,可以多種方法結合以達到上傳效果
實驗
實驗環境:phpstudy2016
靶機:DVWA file upload HIGH安全級別
源碼
可知,此等級采用了白名單過濾,只允許后綴名為jpg,jpeg或png格式的文件上傳,並且文件大小要小於100000字節。
在cmd中用copy命令生成圖片木馬
發現一句話木馬一插入圖片尾部
上傳成功
可見文件位於C:\phpstudy\WWW\DVWA\hackable\uploads目錄下
嘗試用菜刀連接
發現出現錯誤,因為木馬被當作圖片解析而不被當作php解析
此時可利用文件包含漏洞
利用DVWA的File Inclusion漏洞來將圖片解析為php
構造url
http://169.254.16.216/DVWA/vulnerabilities/fi/?page=file:///C:\phpstudy\WWW\DVWA/hackable/uploads/shell.jpg 添加到菜刀 參數為qlu
連接發現錯誤,這是為DVWA需要登陸
可以右鍵點擊剛添加的shell,選擇瀏覽網址,在菜刀自帶的瀏覽器中登陸DVWA將安全等級設為high及以下.
然后就可以成功連接.
防護
1.文件上傳的目錄設置為不可執行
只要web容器無法解析該目錄下面的文件,即使攻擊者上傳了腳本文件,服務器本身也不會受到影響,因此這一點至關重要。
2.判斷文件類型
在判斷文件類型時,可以結合使用MIME Type、后綴檢查等方式。在文件類型檢查中,強烈推薦白名單方式,黑名單的方式已經無數次被證明是不可靠的。此外,對於圖片的處理,可以使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。
3.使用隨機數改寫文件名和文件路徑
文件上傳如果要執行代碼,則需要用戶能夠訪問到這個文件。在某些環境中,用戶能上傳,但不能訪問。如果應用了隨機數改寫了文件名和路徑,將極大地增加攻擊的成本。再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因為重命名而無法攻擊。
4.單獨設置文件服務器的域名
由於瀏覽器同源策略的關系,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。