首頁 > 軟體

php安全攻防利用檔案上傳漏洞與繞過技巧詳解

2021-10-14 19:00:48

前言

檔案上傳漏洞大多出現在可以進行檔案上傳的地方,如使用者頭像上傳,檔案上傳處等。該漏洞是一個危害十分大的漏洞,通過檔案上傳,攻擊者可以上傳webshell並進行getshell操作,從而獲得系統shell,可執行任意命令。也為後續大型木馬的上傳,特權提升提供了一個良好的基礎。

檔案上傳漏洞的一些場景

接下來針對檔案上傳漏洞的一些waf過濾的場景進行說明並進行繞過和利用。

場景一:前端js程式碼白名單判斷.jpg|.png|.gif字尾

在該場景下,防禦的姿勢是通過js程式碼對上傳的檔案字尾進行判斷,如果不是.jpg|.png|.gif這三個字尾的檔案則不允許上傳至後臺

繞過方式:

將帶有一句話木馬的檔案字尾名改為xxx.jpg|png|gif,在上傳處通過BurpSuite進行包攔截並改包,將檔案字尾名改為php|jsp等指令碼的字尾。上傳成功後存取該檔案的路徑即可getshell。

場景二:後端PHP程式碼檢查Content-type欄位

在該場景下,防禦的姿勢是通過js程式碼對上傳檔案請求的Content-type欄位進行檢查,如果不是image/jpeg則不允許上傳至後臺

繞過方式:

將上傳一句話木馬檔案的request包進行攔截,新增或修改Content-type欄位為image/jpeg

場景三:程式碼黑名單判斷.asp|.aspx|.php|.jsp字尾

在該場景下,防禦姿勢是通過後臺程式碼對上傳的檔案字尾進行判斷,如果是.asp|.aspx|.php|.jsp這四個字尾的檔案則不允許上傳

繞過方式:

當apache的組態檔httpd.conf中存在如下設定時:

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

說明可以通過上傳.phtml|.phps|.php5|.pht這些字尾名的檔案,且他們都會被解析稱字尾為.php的檔案。所以可以嘗試使用上傳xxx.php5這類的檔案進行繞過

關於AddType命令的作用:

AddType 指令

作用:在給定的副檔名與特定的內容型別之間建立對映
語法:AddType MIME-type extension [extension] …
AddType指令在給定的副檔名與特定的內容型別之間建立對映關係。MIME-type指明瞭包含extension擴充套件名的檔案的媒體型別。
AddType 是與型別表相關的,描述的是擴充套件名與檔案型別之間的關係。AddType 是與型別表相關的,描述的是擴充套件名與檔案型別之間的關係。

場景四:程式碼擴大黑名單判斷

在該場景下,防禦姿勢是通過後臺程式碼對上傳的檔案字尾進行判斷,如果是

.php|.php5|.php4|.php3|.php2|.php1|.html|.htm|.phtml|.pht|.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

這些字尾的檔案則不允許上傳

繞過方式——htaccsess:

使用.htaccsess檔案進行繞過

.htaccsess檔案的作用:

.htaccess檔案是Apache伺服器中的一個組態檔,它負責相關目錄下的網頁設定。通過htaccess檔案,可以實現:網頁301重定向、自定義404錯誤頁面、改變副檔名、允許/阻止特定的使用者或者目錄的存取、禁止目錄列表、設定預設檔案等功能IIS平臺上不存在該檔案,該檔案預設開啟,啟用和關閉在httpd.conf檔案中設定。

.htaccsess檔案的使用條件:

mod_rewrite模組開啟。
AllowOverride All

構造.htaccess檔案,內容如下:

AddType application/x-httpd-php .jpg

這裡程式碼的意思可以讓 .jpg字尾名檔案格式的檔名以php格式解析,因此達到了可執行的效果。所以我們可以把要上傳的php檔案的字尾名改為.jpg格式從而繞過

繞過方式——大小寫繞過:

如果在黑名單中沒有針對大小寫進行限制,則可以進行大小寫繞過,如將.php字尾改為.PhP|.PHP字尾

場景五:一些複合判斷

在該場景下,防禦姿勢除了基本的黑/白名單外,還包括了對一些特定字元的限制,具體情況可以進行fuzz或者有條件可以進行程式碼審計

空格、點繞過(windows)

當接收檔案時,後臺程式碼的限制條件中沒有去除檔名首尾的空格(或是沒有對.進行拆分)時,可以利用windows系統的命名規則進行繞過:如,將檔案字尾改為xxx.phpxxx.php.xxx.php .

在windows下xx.jpg[空格] 或xx.jpg.這兩類檔案是不允許存在的,若這樣命名,windows會預設去除空格或點

還有些情況具體就需要看程式碼邏輯,比如如果程式碼只刪除一次點且只去除一次首尾空格,在windows環境下就可以用xxx.php. .進行繞過

::$DATA繞過(windows)

::$DATA繞過同樣利用了windows的特性

NTFS檔案系統包括對備用資料流的支援。這不是眾所周知的功能,主要包括提供與Macintosh檔案系統中的檔案的相容性。備用資料流允許檔案包含多個資料流。每個檔案至少有一個資料流。在Windows中,此預設資料流稱為:$ DATA。

即在php+windows的環境下,如果檔名+::$DATA會把::$DATA之後的資料當成檔案流處理,不會檢測字尾名,且保持::$DATA之前的檔名。

雙寫繞過

當防禦的程式碼中存在將某些特定字尾進行空字元替換時(如利用str_ireplace函數將.php|.jsp等字尾替換為空字元)

這時候可以將字尾雙寫,即將php改成pphphp

%00截斷

00截斷繞過方式需要滿足以下條件

php版本小於5.3.4
php.ini的magic_quotes_gpc為OFF狀態
使用move_uploaded_file函數且引數受使用者控制

此時move_uploaded_file函數遇到0x00會截斷

可以將上傳檔案字尾改為xx.php%00進行繞過

%0a繞過

%0a繞過方式需要滿足以下條件

Apache httpd 2.4.0至2.4.29
FileMatch正則匹配.php|.php5等字尾

該版本apache會通過$匹配字尾,而$匹配時會正則匹配某字串結尾或以換行符結尾的一個字串,即php[換行符]會被匹配成php

可以將上傳檔案字尾改為xx.php%0a進行繞過

圖片馬繞過

window的cmd命令製作圖片馬

copy 1.jpg /b + shell.php /a shell.jpg

或是利用其他圖片馬生成器生成

二次渲染繞過

判斷圖片格式後用image函數進行二次渲染

繞過方式:

抓包找到二次渲染中未被改動的地方,將一句話馬插入該地方,.jpg|.png|.gif三種檔案格式不同,所以構造馬的方式也不同

注:gif檔案最簡單,直接用ue等16進位制編輯器就可以改,但是jpg和png需要特殊的構造指令碼

先將一張正常的jpg圖片上傳,上傳後將伺服器儲存的二次渲染的圖片儲存下來。
將儲存下來經過伺服器二次渲染的那張jpg圖片,用此指令碼進行處理生成payload.jpg
然後再上傳payload.jpg

條件競爭

當上傳檔案邏輯為:先move_uploaded_file函數將上傳檔案臨時儲存,再進行判斷,如果不在白名單裡則unlink刪除,在的話就rename重新命名。此時會存在條件競爭

繞過方法:
用burp開啟兩個intruder模組,一個用於重複上傳,另一個用於重複存取。會有一定記錄返回執行結果

/.繞過

move_uploaded_file函數引數可控時,可以嘗試/.繞過,因為該函數會忽略掉檔案末尾的/.,所以可以構造save_path=1.php/.,這樣file_ext值就為空,就能繞過黑名單,而move_uploaded_file函數忽略檔案末尾的/.可以實現儲存檔案為.php

以上就是php安全攻防利用檔案上傳漏洞與繞過技巧詳解的詳細內容,更多關於php檔案上傳漏洞利用與繞過技巧的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com