滲透測試之文件上傳漏洞


一、漏洞介紹

大多數網站都有文件上傳的接口,但如果在后台開發時並沒有對上傳的文件進行安全考慮或采用了有缺陷的措施,導致攻擊者可以通過一些手段繞過安全措施從而上傳一些惡意文件,從而通過該惡意文件的訪問來控制整個后台

二、測試流程

image-20210328113630528

 

總結:

 

image-20210328163425125

 

三、實戰測試

1、繞過js檢查

(javascript 檢測)首先觀察到提示只允許上傳圖片文件,那么前端的查看代碼,當頁面發生改變時,會調用這個checkFileExt()函數來檢查上傳的是不是圖片,我們只需要在前端將checkFileExt()函數刪除,就能上傳一個非圖片文件。

image-20210328163709020

 

2、黑名單

1、繞過黑名單驗證

用黑名單里沒有的名單進行攻擊,比如黑名單里沒有.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后綴文件之類

 

猜測黑名單驗證(‘.asp‘,‘.aspx‘,‘.php‘,‘.jsp‘),通過上傳特殊可解析后綴的辦法,我們可以嘗試上傳php3,php5...等這樣可以被服務器解析的后綴名

2、上傳.htaccess

特殊文件名或文件夾繞過(windows),還有比如發送的http 包里把文件名改成test.asp. 或test.asp_(下划線為空格),這種命名方式在windows 系統里是不被允許的,所以需要在burp 之類里進行修改,然后繞過驗證后,會被windows 系統自動去掉后面的點和空格,但要注意Unix/Linux 系統沒有這個特性。

 

當對上傳的后綴名的判斷增加了,php3.php5....已經不允許上傳,但是沒有限制.htaccess文件的上傳,所以我們依然可以使用另外一種方法就是利用PHP 和 Windows環境的疊加特性,以下符號在正則匹配時的相等性:

雙引號" = 點號.

大於符號> = 問號?

小於符號< = 星號*

先上傳一個名為4.php:.jpg的文件,上傳成功后會生成4.php的空文件,大小為0KB。然后將文件名改為4.<或4.<<<或4.>>>或4.>><后再次上傳,重寫4.php文件內容,Webshell代碼就會寫入原來的4.php空文件中。

3、后綴大小寫繞過

猜測服務器源代碼沒有設置$file_ext = strtolower($file_ext); //轉換為小寫 ,嘗試使用文件名后綴大小寫混合繞過,把1.php改為1.phP...來上傳

4、空格和點繞過

利用Windows系統的文件名特性。文件名最后增加空格和點,寫成1.php . 這個需要用burpsuite抓包修改,上傳后保存在Windows系統上的文件名最后的一個.會被去掉,實際上保存的文件名就是1.php

image-20210328191055780

 

 

6、::$DATA繞過

Windows下NTFS文件系統的一個特性,即NTFS文件系統的存儲數據流的一個屬性 DATA 時,就是請求 a.asp 本身的數據,如果a.asp 還包含了其他的數據流,比如 a.asp:lake2.asp,請求 a.asp:lake2.asp::$DATA,則是請求a.asp中的流數據lake2.asp的流數據內容。

猜測服務器源代碼沒有設置 $file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA 我們可以嘗試采用Windows文件流特性繞過,文件名改成1.php::$DATA , 上傳成功后保存的文件名其實是1.php

7、配合解析漏洞

 

 

8、雙寫后綴名繞過

猜測服務器源代碼 $file_name = str_ireplace($deny_ext,"", $file_name); 只對文件后綴名進行一次過濾,這樣的話,雙寫文件名繞過,文件名改成1.pphphp

 

3、白名單

1、MIME繞過

(MIME 類型檢測) MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,后面定義具體的種類。

通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。

第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:

$FILES"file" - 被上傳文件的名稱 $FILES"file" - 被上傳文件的類型 $FILES"file" - 被上傳文件的大小,以字節計 $FILES"file" - 存儲在服務器的文件的臨時副本的名稱 $_FILES"file" - 由文件上傳導致的錯誤代碼

詳細可參考:http://www.w3school.com.cn/php/php_file_upload.asp

分析代碼邏輯:首先會獲取到前端的提交請求,然后定義了一個數組(定義圖片上傳指定類型),然后通過upload_sick函數對上傳的文件進行一定的檢查。分析upload_sick函數(定義在uploadfunction.php文件里面)存在漏洞的的原因是因為 $ _FILES() 這個全局的方法是通過瀏覽器http頭去獲取的content-type,content-type是前端用戶可以控制的。容易被繞過。上傳一張正常的符合標准的圖片,對其content-type進行抓包操作。可見正常上傳符合要求的圖片中數據包中content-type為image/png對比符合條件,而php文件則不符合條件返回文件類型錯誤。

2、%00截斷

 

3、0x00截斷

name = getname(http request) //假如這時候獲取到的文件名是test.asp .jpg(asp 后面為0x00) type = gettype(name) //而在gettype()函數里處理方式是從后往前掃描擴展名,所以判斷為jpg if (type == jpg) SaveFileToPath(UploadPath.name, name) //但在這里卻是以0x00 作為文件名截斷//最后以test.asp 存入路徑里

 

猜測服務器源代碼是以時間戳的方式對上傳文件進行命名,使用上傳路徑名%00截斷繞過,不過這需要對文件有足夠的權限,比如說創建文件夾,上傳的文件名寫成1.jpg, save_path改成../upload/1.php%00 (1.php%00.jpg經過url轉碼后會變為1.php\000.jpg),最后保存下來的文件就是1.php

前提條件:php版本要小於5.3.4,5.3.4及以上已經修復該問題;magic_quotes_gpc需要為OFF狀態

 

image-20210328195106790

 

4、0x0a截斷

 

 

 

4、繞過文件頭檢查

方法一:直接偽造頭部GIF89A 方法二:CMD方法,copy /b test.png+1.php muma.png 方法三:直接使用工具增加備注寫入一句話木馬。

繞過文件頭檢查,添加GIF圖片的文件頭GIF89a,繞過GIF圖片檢查。或者我們使用命令copy 1.jpg /b + shell.php /a webshell.jpg,將php一句話追加到jpg圖片末尾,代碼不全的話,人工補充完整。形成一個包含Webshell代碼的新jpg圖片,然后直接上傳即可。但是我們沒有辦法拿到shell,應為我們上傳的圖片馬無法被解析成php形式,通常圖片馬配合%00或者0x00截斷上傳,或者配合解析漏洞

image-20210328202158006

 

5、繞過 getimagesize()

getimagesize() 函數用於獲取圖像大小及相關信息,成功返回一個數組,失敗則返回 FALSE 並產生一條 E_WARNING 級的錯誤信息,如果用這個涵數來獲取類型,從而判斷是否是圖片的話,會存在問題。

語法格式:

 array getimagesize ( string $filename [, array &$imageinfo ] )

getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小並返回圖像的尺寸以及文件類型及圖片高度與寬度。

 

 

 

getimagesize() 函數用於獲取圖像尺寸 ,索引 2 給出的是圖像的類型,返回的是數字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM

這里有詳解:https://blog.csdn.net/sanbingyutuoniao123/article/details/52166617

image_type_to_extension() 函數用於獲取圖片后綴

 

 

 

 

6、繞過 exif_imagetype()

 

7、二次渲染

 

8、條件競爭

 

 

 

 

 

 

四、安全防范

針對文件上傳漏洞的特點和必須具備的三個條件,我們阻斷任何一個條件就可以達到組織文件上傳攻擊的目的: 1、最有效的,將文件上傳目錄直接設置為不可執行,對於Linux而言,撤銷其目錄的'x'權限;實際中很多大型網站的上傳應用都會放置在獨立的存儲上作為靜態文件處理,一是方便使用緩存加速降低能耗,二是杜絕了腳本執行的可能性; 2、文件類型檢查:強烈推薦白名單方式,結合MIME Type、后綴檢查等方式(即只允許允許的文件類型進行上傳);此外對於圖片的處理可以使用壓縮函數或resize函數,處理圖片的同時破壞其包含的HTML代碼; 3、使用隨機數改寫文件名和文件路徑,使得用戶不能輕易訪問自己上傳的文件; 4、單獨設置文件服務器的域名;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM