php安全攻防利用文件上傳漏洞與繞過(guò)技巧詳解
前言
文件上傳漏洞大多出現(xiàn)在可以進(jìn)行文件上傳的地方,如用戶頭像上傳,文檔上傳處等。該漏洞是一個(gè)危害十分大的漏洞,通過(guò)文件上傳,攻擊者可以上傳webshell并進(jìn)行g(shù)etshell操作,從而獲得系統(tǒng)shell,可執(zhí)行任意命令。也為后續(xù)大型木馬的上傳,特權(quán)提升提供了一個(gè)良好的基礎(chǔ)。
文件上傳漏洞的一些場(chǎng)景
接下來(lái)針對(duì)文件上傳漏洞的一些waf過(guò)濾的場(chǎng)景進(jìn)行說(shuō)明并進(jìn)行繞過(guò)和利用。
場(chǎng)景一:前端js代碼白名單判斷.jpg|.png|.gif后綴
在該場(chǎng)景下,防御的姿勢(shì)是通過(guò)js代碼對(duì)上傳的文件后綴進(jìn)行判斷,如果不是.jpg|.png|.gif
這三個(gè)后綴的文件則不允許上傳至后臺(tái)
繞過(guò)方式:
將帶有一句話木馬的文件后綴名改為xxx.jpg|png|gif
,在上傳處通過(guò)BurpSuite進(jìn)行包攔截并改包,將文件后綴名改為php|jsp
等腳本的后綴。上傳成功后訪問(wèn)該文件的路徑即可getshell。
場(chǎng)景二:后端PHP代碼檢查Content-type字段
在該場(chǎng)景下,防御的姿勢(shì)是通過(guò)js代碼對(duì)上傳文件請(qǐng)求的Content-type
字段進(jìn)行檢查,如果不是image/jpeg
則不允許上傳至后臺(tái)
繞過(guò)方式:
將上傳一句話木馬文件的request包進(jìn)行攔截,添加或修改Content-type
字段為image/jpeg
場(chǎng)景三:代碼黑名單判斷.asp|.aspx|.php|.jsp后綴
在該場(chǎng)景下,防御姿勢(shì)是通過(guò)后臺(tái)代碼對(duì)上傳的文件后綴進(jìn)行判斷,如果是.asp|.aspx|.php|.jsp
這四個(gè)后綴的文件則不允許上傳
繞過(guò)方式:
當(dāng)apache的配置文件httpd.conf中存在如下配置時(shí):
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
說(shuō)明可以通過(guò)上傳.phtml|.phps|.php5|.pht
這些后綴名的文件,且他們都會(huì)被解析稱(chēng)后綴為.php
的文件。所以可以嘗試使用上傳xxx.php5
這類(lèi)的文件進(jìn)行繞過(guò)
關(guān)于AddType命令的作用:
AddType 指令
作用:在給定的文件擴(kuò)展名與特定的內(nèi)容類(lèi)型之間建立映射
語(yǔ)法:AddType MIME-type extension [extension] …
AddType指令在給定的文件擴(kuò)展名與特定的內(nèi)容類(lèi)型之間建立映射關(guān)系。MIME-type指明了包含extension擴(kuò)展名的文件的媒體類(lèi)型。
AddType 是與類(lèi)型表相關(guān)的,描述的是擴(kuò)展名與文件類(lèi)型之間的關(guān)系。AddType 是與類(lèi)型表相關(guān)的,描述的是擴(kuò)展名與文件類(lèi)型之間的關(guān)系。
場(chǎng)景四:代碼擴(kuò)大黑名單判斷
在該場(chǎng)景下,防御姿勢(shì)是通過(guò)后臺(tái)代碼對(duì)上傳的文件后綴進(jìn)行判斷,如果是
.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
這些后綴的文件則不允許上傳
繞過(guò)方式——htaccsess:
使用.htaccsess
文件進(jìn)行繞過(guò)
.htaccsess文件的作用:
.htaccess文件是Apache服務(wù)器中的一個(gè)配置文件,它負(fù)責(zé)相關(guān)目錄下的網(wǎng)頁(yè)配置。通過(guò)htaccess文件,可以實(shí)現(xiàn):網(wǎng)頁(yè)301重定向、自定義404錯(cuò)誤頁(yè)面、改變文件擴(kuò)展名、允許/阻止特定的用戶或者目錄的訪問(wèn)、禁止目錄列表、配置默認(rèn)文檔等功能IIS平臺(tái)上不存在該文件,該文件默認(rèn)開(kāi)啟,啟用和關(guān)閉在httpd.conf文件中配置。
.htaccsess文件的使用條件:
mod_rewrite模塊開(kāi)啟。 AllowOverride All
構(gòu)造.htaccess
文件,內(nèi)容如下:
AddType application/x-httpd-php .jpg
這里代碼的意思可以讓 .jpg后綴名文件格式的文件名以php格式解析,因此達(dá)到了可執(zhí)行的效果。所以我們可以把要上傳的php文件的后綴名改為.jpg格式從而繞過(guò)
繞過(guò)方式——大小寫(xiě)繞過(guò):
如果在黑名單中沒(méi)有針對(duì)大小寫(xiě)進(jìn)行限制,則可以進(jìn)行大小寫(xiě)繞過(guò),如將.php
后綴改為.PhP|.PHP
后綴
場(chǎng)景五:一些復(fù)合判斷
在該場(chǎng)景下,防御姿勢(shì)除了基本的黑/白名單外,還包括了對(duì)一些特定字符的限制,具體情況可以進(jìn)行fuzz或者有條件可以進(jìn)行代碼審計(jì)
空格、點(diǎn)繞過(guò)(windows)
當(dāng)接收文件時(shí),后臺(tái)代碼的限制條件中沒(méi)有去除文件名首尾的空格(或是沒(méi)有對(duì).進(jìn)行拆分)時(shí),可以利用windows系統(tǒng)的命名規(guī)則進(jìn)行繞過(guò):如,將文件后綴改為xxx.php
、xxx.php.
、xxx.php .
在windows下xx.jpg[空格] 或xx.jpg.這兩類(lèi)文件是不允許存在的,若這樣命名,windows會(huì)默認(rèn)去除空格或點(diǎn)
還有些情況具體就需要看代碼邏輯,比如如果代碼只刪除一次點(diǎn)且只去除一次首尾空格,在windows環(huán)境下就可以用xxx.php. .
進(jìn)行繞過(guò)
::$DATA繞過(guò)(windows)
::$DATA繞過(guò)同樣利用了windows的特性
NTFS文件系統(tǒng)包括對(duì)備用數(shù)據(jù)流的支持。這不是眾所周知的功能,主要包括提供與Macintosh文件系統(tǒng)中的文件的兼容性。備用數(shù)據(jù)流允許文件包含多個(gè)數(shù)據(jù)流。每個(gè)文件至少有一個(gè)數(shù)據(jù)流。在Windows中,此默認(rèn)數(shù)據(jù)流稱(chēng)為:$ DATA。
即在php+windows
的環(huán)境下,如果文件名+::$DATA
會(huì)把::$DATA
之后的數(shù)據(jù)當(dāng)成文件流處理,不會(huì)檢測(cè)后綴名,且保持::$DATA
之前的文件名。
雙寫(xiě)繞過(guò)
當(dāng)防御的代碼中存在將某些特定后綴進(jìn)行空字符替換時(shí)(如利用str_ireplace
函數(shù)將.php|.jsp
等后綴替換為空字符)
這時(shí)候可以將后綴雙寫(xiě),即將php
改成pphphp
%00截?cái)?/h4>
00截?cái)嗬@過(guò)方式需要滿足以下條件
php版本小于5.3.4 php.ini的magic_quotes_gpc為OFF狀態(tài) 使用move_uploaded_file函數(shù)且參數(shù)受用戶控制
此時(shí)move_uploaded_file函數(shù)遇到0x00會(huì)截?cái)?/p>
可以將上傳文件后綴改為xx.php%00
進(jìn)行繞過(guò)
%0a繞過(guò)
%0a繞過(guò)方式需要滿足以下條件
Apache httpd 2.4.0至2.4.29 FileMatch正則匹配.php|.php5等后綴
該版本apache會(huì)通過(guò)$
匹配后綴,而$
匹配時(shí)會(huì)正則匹配某字符串結(jié)尾或以換行符結(jié)尾的一個(gè)字符串,即php[換行符]
會(huì)被匹配成php
可以將上傳文件后綴改為xx.php%0a
進(jìn)行繞過(guò)
圖片馬繞過(guò)
window的cmd命令制作圖片馬
copy 1.jpg /b + shell.php /a shell.jpg
或是利用其他圖片馬生成器生成
二次渲染繞過(guò)
判斷圖片格式后用image
函數(shù)進(jìn)行二次渲染
繞過(guò)方式:
抓包找到二次渲染中未被改動(dòng)的地方,將一句話?cǎi)R插入該地方,.jpg|.png|.gif
三種文件格式不同,所以構(gòu)造馬的方式也不同
注:gif文件最簡(jiǎn)單,直接用ue等16進(jìn)制編輯器就可以改,但是jpg和png需要特殊的構(gòu)造腳本
先將一張正常的jpg圖片上傳,上傳后將服務(wù)器存儲(chǔ)的二次渲染的圖片保存下來(lái)。
將保存下來(lái)經(jīng)過(guò)服務(wù)器二次渲染的那張jpg圖片,用此腳本進(jìn)行處理生成payload.jpg
然后再上傳payload.jpg
條件競(jìng)爭(zhēng)
當(dāng)上傳文件邏輯為:先move_uploaded_file函數(shù)將上傳文件臨時(shí)保存,再進(jìn)行判斷,如果不在白名單里則unlink刪除,在的話就rename重命名。此時(shí)會(huì)存在條件競(jìng)爭(zhēng)
繞過(guò)方法:
用burp開(kāi)啟兩個(gè)intruder模塊,一個(gè)用于重復(fù)上傳,另一個(gè)用于重復(fù)訪問(wèn)。會(huì)有一定記錄返回執(zhí)行結(jié)果
/.繞過(guò)
當(dāng)move_uploaded_file
函數(shù)參數(shù)可控時(shí),可以嘗試/.繞過(guò),因?yàn)樵摵瘮?shù)會(huì)忽略掉文件末尾的/.,所以可以構(gòu)造save_path=1.php/.
,這樣file_ext值就為空,就能繞過(guò)黑名單,而move_uploaded_file函數(shù)忽略文件末尾的/.可以實(shí)現(xiàn)保存文件為.php
以上就是php安全攻防利用文件上傳漏洞與繞過(guò)技巧詳解的詳細(xì)內(nèi)容,更多關(guān)于php文件上傳漏洞利用與繞過(guò)技巧的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP實(shí)現(xiàn)處理三級(jí)分類(lèi)數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用PHP實(shí)現(xiàn)處理三級(jí)分類(lèi)數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-02-02php通過(guò)ksort()函數(shù)給關(guān)聯(lián)數(shù)組按照鍵排序的方法
這篇文章主要介紹了php通過(guò)ksort()函數(shù)給關(guān)聯(lián)數(shù)組按照鍵排序的方法,實(shí)例分析了php中ksort()函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03詳細(xì)對(duì)比php中類(lèi)繼承和接口繼承
在本文里我們給大家詳細(xì)對(duì)比了php中類(lèi)繼承和接口繼承的不同之處,有興趣的朋友們學(xué)習(xí)下。2018-10-10php下正則來(lái)匹配dede模板標(biāo)簽的代碼
用正則來(lái)匹配dede的標(biāo)簽,對(duì)于以后想實(shí)現(xiàn)dedecms那樣的模板標(biāo)簽的朋友與想研究dedecms模板標(biāo)簽的朋友可以參考下。2010-08-08php生成并下載word文件到本地實(shí)現(xiàn)方法詳解
要給最常用出租屋管理系統(tǒng)增加個(gè)合同功能,mark下知識(shí)點(diǎn)。要生成合同就需要使用phpword。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08