php安全攻防利用文件上傳漏洞與繞過技巧詳解
前言
文件上傳漏洞大多出現在可以進行文件上傳的地方,如用戶頭像上傳,文檔上傳處等。該漏洞是一個危害十分大的漏洞,通過文件上傳,攻擊者可以上傳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.php
、xxx.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文件上傳漏洞利用與繞過技巧的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Apache開啟並實現網站偽靜態化的方法
- Apache中偽靜態Rewrite的使用方法和URL重寫規則表達式講解
- Linux apache實現https的配置方法
- PHP上傳目錄禁止執行php文件實例講解
- Linux常用硬盤管理相關命令介紹