介紹
文件上傳漏洞是指用戶(hù)上傳了一個(gè)可執(zhí)行的腳本文件(php、jsp、xml、cer等文件),而WEB系統(tǒng)沒(méi)有進(jìn)行檢測(cè)或邏輯做的不夠安全。文件上傳功能本身沒(méi)有問(wèn)題,問(wèn)題在于上傳后如何處理及解釋文件。
分類(lèi)
根據(jù)簡(jiǎn)介,主要分為上傳(客戶(hù)端)、解析(服務(wù)端)兩大類(lèi)。
上傳-javascript檢測(cè)
簡(jiǎn)介
通過(guò)js代碼,對(duì)文件后綴進(jìn)行判斷。
原理
一般使用白名單或黑名單的方式,判斷文件后綴,根據(jù)后綴決定用戶(hù)是否上傳。
攻擊
Firebug插件刪除判斷函數(shù)
使用靶機(jī)pikachu做例子,直接通過(guò)F12修改。
tupian.php
<?php
echo phpinfo();
?>
F12查看代碼
客戶(hù)端通過(guò)onchange實(shí)踐的checkFileExt函數(shù)進(jìn)行檢測(cè),我們刪除掉調(diào)用這個(gè)函數(shù)的部分。-
我們?cè)俅紊蟼鱰upian.php
看路徑,我們修改上方的url,進(jìn)行訪(fǎng)問(wèn)。
看到代碼已經(jīng)運(yùn)行。
中間人攻擊-burpsuite攔截
防御
上傳無(wú)法防御,可以進(jìn)行文件重命名。
上傳-MIME檢測(cè)
簡(jiǎn)介
js的檢測(cè)基本沒(méi)有了,開(kāi)始使用后端代碼進(jìn)行檢測(cè),雖然進(jìn)行MIME檢測(cè)是使用的后端代碼,但是,依然是從客戶(hù)端獲取的,可以從客戶(hù)端修改,我還是歸于上傳這一類(lèi)了。
簡(jiǎn)單來(lái)說(shuō),在請(qǐng)求頭中Content-Type:type/subtype來(lái)表明類(lèi)型,常見(jiàn)的有
text/plain
text/html
image/jpeg
image/jpg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
攻擊
中間人攻擊-burpsuite攔截
burpsuite攔截
修改Content-Type
Forward 可以看到發(fā)送過(guò)去了,后序驗(yàn)證同上,不再重復(fù)截圖。
防御
上傳無(wú)法防御,可以進(jìn)行文件重命名。
上傳-后端文件格式檢測(cè)
簡(jiǎn)介
一些后端代碼含有一些函數(shù),能夠判斷文件類(lèi)型,獲取文件的一些信息。以php為例,php的getimagesize函數(shù)可以獲取圖像的一些信息,如果不是圖像,那么無(wú)法獲取信息,就會(huì)報(bào)錯(cuò)。
有的站點(diǎn)使用文件頭來(lái)檢測(cè)文件類(lèi)型,這種檢查可以在Shell前加入對(duì)應(yīng)的字節(jié)以繞過(guò)檢查。幾種常見(jiàn)的文件類(lèi)型的頭字節(jié)如下表所示
類(lèi)型 二進(jìn)制值
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61
PNG 89 50 4E 47
TIF 49 49 2A 00
BMP 42 4D
原理
如果你學(xué)過(guò)圖像相關(guān)的課程,比如信息隱藏這門(mén)課,會(huì)使用Matlab讀取圖像,進(jìn)行信息隱藏,你就會(huì)知道圖像的一些格式,符合格式的話(huà)就是那個(gè)類(lèi)型的文件,一般是頭部的一些字節(jié)。我們通過(guò)將惡意代碼前面添加其他類(lèi)型文件的頭部就可以偽造成另一個(gè)類(lèi)型,進(jìn)而繞過(guò)檢測(cè)。
攻擊
我們修改tupian.php為tupian.php.jpg,進(jìn)行上傳。
沒(méi)有辦法上傳,雖然后綴對(duì),但是內(nèi)部是不正確的。
我們使用Linux中的xxd或od命令來(lái)查看.PNG或.png圖片的信息(博主雖然是在Windows中,但是使用的是cygwin)。
可以看到文件前面是一樣的。
使用cmd命令 copy /b CA.png + tupian.php tupian.png
目錄下會(huì)生成新圖片tupian.png,而且符合png格式,但是在圖片后面是php代碼。
圖片上傳成功,但是打開(kāi)后還是圖片。
我們?cè)偈褂弥暗奈募┒淳涂梢粤耍⒁鈛rl。
php由于歷史原因,部分解釋器可能支持符合正則 /ph(p[2-7]?|t(ml)?)/ 的后綴,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上傳php文件時(shí)測(cè)試該類(lèi)型。
jsp引擎則可能會(huì)解析 jspx / jspf / jspa / jsw / jsv / jtml 等后綴
asp支持 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90} 等后綴。
除了這些繞過(guò),其他的后綴同樣可能帶來(lái)問(wèn)題,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini 等。
防御
若沒(méi)有文件包含漏洞,問(wèn)題不大,否則無(wú)法防御。
上傳-文件截?cái)?/p>
簡(jiǎn)介
php %00截?cái)啵捎?0代表結(jié)束符,00后面的所有字符都會(huì)刪除掉,發(fā)生在php5.3.4之前版本,php的magic_quotes_gpc為OFF狀態(tài)。
攻擊
正好被水印擋住了,擋住的部分就是參數(shù)magic_quotes_gpc。
解析-Apache文件解析
一個(gè)文件可以有多個(gè)后綴,如:lady_killer.txt.png.mp3,在Windows中自然是認(rèn)為這是mp3文件,也就是說(shuō)最后的后綴生效。但是,Apache卻是從右向左讀后綴,不認(rèn)識(shí)的跳過(guò)繼續(xù)讀,前面的文件就認(rèn)為是圖片,如果沒(méi)有配置mp3后綴的話(huà)。因此,對(duì)于
tupian.php.xxx就會(huì)認(rèn)為這是php文件。類(lèi)型的定義在Apache/conf/mime.types中
解析-IIS文件解析
IIS 6也出現(xiàn)截?cái)喙簦財(cái)嘧址麨?;"。由于phpStudy沒(méi)有這個(gè)版本,太老了,不想去實(shí)現(xiàn)了,知道下就行了。
解析-PHP CGI路徑解析
沒(méi)找到了2010年的cve,可能是提交的bug吧,就是路徑為evil.jpg/1.php時(shí),Nginx會(huì)把evil.jpg當(dāng)做php文件交給php運(yùn)行。
繞過(guò)
前端繞過(guò)
通過(guò)抓包提交,繞過(guò)前端js檢測(cè),刪除對(duì)js驗(yàn)證腳本的調(diào)用,使其不能對(duì)上傳的文件類(lèi)型做檢測(cè),從而達(dá)到繞過(guò)
黑名單繞過(guò)
使用更多后綴
jsp jspx jspf
asp asa cer aspx
php php3 php4 pht phtml
后綴大小寫(xiě)繞過(guò)
由于windows不區(qū)分大小寫(xiě),后端校驗(yàn)未使用strtolower等函數(shù)將文件后綴大小寫(xiě)統(tǒng)一處理,導(dǎo)致黑名單不完整而繞過(guò)
1.pHP
后綴雙寫(xiě)繞過(guò)
后端過(guò)濾時(shí),使用了preg_replace等替換函數(shù)將php關(guān)鍵字替換為空,但是卻沒(méi)有循環(huán)替換,導(dǎo)致前面的ph和后面的p重新組合成php,從而導(dǎo)致繞過(guò)
1.phphpp
空格繞過(guò)
由于Windows處理文件時(shí),會(huì)自動(dòng)刪除文件后綴帶有的空格和點(diǎn),從而導(dǎo)致繞過(guò)。
1.php
后面有空格
::$DATA繞過(guò)
Windows的一種流文件格式,上傳這種格式流文件格式的同時(shí)會(huì)在相同目錄下生成一個(gè)含有相同內(nèi)容宿主文件
MIME繞過(guò)
修改Content-Type中為允許的類(lèi)型,以下為常見(jiàn)MIME類(lèi)型
GIF image/gif
JPG image/pjpeg image/jpeg
ZIP application/x-compressed application/octet-stream
JSP text/html
EXE application/octet-stream
%00截?cái)嗬@過(guò)
PHP<5.3.29,且GPC關(guān)閉時(shí),%00在URL中充當(dāng)結(jié)束符,當(dāng)解析到%00時(shí),解析器就會(huì)認(rèn)為字符串已經(jīng)讀取完畢
1.php%00a.jpg
十六進(jìn)制的0x00也可
文件頭檢查繞過(guò)
例如,僅允許上傳圖片,通過(guò)文件頭來(lái)判斷,這時(shí)可以將惡意代碼拼接到圖片后面
條件競(jìng)爭(zhēng)繞過(guò)
有的文件上傳功能是先將文件下載到服務(wù)器,如果是有問(wèn)題的就刪除,我們可以利用這一邏輯漏洞,不斷上傳文件,即可訪(fǎng)問(wèn)。
防御
1.文件類(lèi)型判斷
后綴白名單,MIME類(lèi)型判斷結(jié)合
2.文件重命名
3.文件上傳目錄設(shè)置為不可執(zhí)行
更多關(guān)于“網(wǎng)絡(luò)安全培訓(xùn)”的問(wèn)題,歡迎咨詢(xún)千鋒教育在線(xiàn)名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬(wàn)人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來(lái)試聽(tīng)。