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