什麼是檔案上傳漏洞

2021-03-03 21:32:53 字數 4601 閱讀 6682

那麼,上傳漏洞是怎麼樣一種漏洞呢。

一般對於上傳漏洞的概念定義如下:由於程式設計師在對使用者檔案上傳部分的控制不足或者處理缺陷,而導致的使用者可以越過其本身許可權向伺服器上上傳可執行的動態指令碼檔案。打個比方來說,如果你使用 windows 伺服器並且以 asp 作為伺服器端的動態**環境,那麼在你的**的上傳功能處,就一定不能讓使用者上傳 asp 型別的檔案,否則他上傳乙個 webshell,你伺服器上的檔案就可以被他任意更改了。

相對於我前面所談到的跨站漏洞,不得不承認,上傳漏洞對於**的危害是致命的,那麼,上傳漏洞是如何產生的呢。

我們知道,在 web 中進行檔案上傳的原理是通過將表單設為 multipart/form-data,同時加入檔案域,而後通過 http 協議將檔案內容傳送到伺服器,伺服器端讀取這個分段 (multipart) 的資料資訊,並將其中的檔案內容提取出來並儲存的。通常,在進行檔案儲存的時候,伺服器端會讀取檔案的源檔名,並從這個源檔名中得出檔案的副檔名,而後隨機為檔案起乙個檔名 ( 為了防止重複 ),並且加上原始檔案的副檔名來儲存到伺服器上。

慢著,就在這個副檔名這裡就出了問題了,究竟是什麼問題呢,我們開啟乙個新的章節來詳細說說,上傳漏洞的幾種形式和各自的防護方法。

上傳漏洞的幾種形式及其防護

第一、 完全沒有處理。

完全沒有處理的情況不用我說,看名字想必大家都能夠了解,這種情況是程式設計師在編寫上傳處理程式時,沒有對客戶端上傳的檔案進行任何的檢測,而是直接按照其原始擴充套件名將其儲存在伺服器上,這是完全沒有安全意識的做法,也是這種漏洞的最低階形式,一般來說這種漏洞很少出現了,程式設計師或多或少的都會進行一些安全方面的檢查。

第二、 將 asp 等字元替換。

我們再看一些程式設計師高階的做法,程式設計師知道 asp 這樣的檔名是危險的,因此他寫了個函式,對獲得的副檔名進行過濾,如:

function checkextname(strextname)

strextname = lcase(strextname) ' 轉換為小寫

strextname = replace(strextname,"asp","") ' 替換 asp 為空

strextname = replace(strextname,"asa","") ' 替換 asa 為空

checkextname = strextname

end function

使用這種方式,程式設計師本意是將使用者提交的檔案的副檔名中的「危險字元」替換為空,從而達到安全儲存檔案的目的。粗一看,按照這種方式,使用者提交的 asp 檔案因為其副檔名 asp 被替換為空,因而無法儲存,但是仔細想想,這種方法並不是完全安全的。

突破的方法很簡單,只要我將原來的 webshell 的 asp 副檔名改為 aaspasp 就可以了,此副檔名經過 checkextname 函式處理後,將變為 asp,即 a 和 sp 中間的 asp 三個字元被替換掉了,但是最終的副檔名仍然是 asp。

因此這種方法是不安全的。如何改進呢,請接著往下看。

第三、 不足的黑名單過濾。

知道了上面的替換漏洞,你可能已經知道如何更進一步了,對了,那就是直接比對副檔名是否為 asp 或者 asa,這時你可能採用了下面的程式:

function checkextname(strextname)

strextname = lcase(strextname) ' 轉換為小寫

if strextname = "asp" then

checkextname = false

exit function

elseif strextname = "asa" then

checkextname = false

exit function

end if

checkextname = true

end function

你使用了這個程式來保證 asp 或者 asa 檔案在檢測時是非法的,這也稱為黑名單過濾法,那麼,這種方法有什麼缺點呢。

黑名單過濾法是一種被動防禦方法,你只可以將你知道的危險的副檔名加以過濾,而實施上,你可能不知道有某些型別的檔案是危險的,就拿上面這段程式來說吧,你認為 asp 或者 asa 型別的檔案可以在伺服器端被當作動態指令碼執行,事實上,在 windows2000 版本的 iis 中,預設也對 cer 檔案開啟了動態指令碼執行的處理,而如果此時你不知道,那麼將會出現問題。

實際上,不只是被當作動態網頁執行的檔案型別有危險,被當作 ssi 處理的檔案型別也有危險,例如 shtml、stm 等,這種型別的檔案可以通過在其**中加入 語句的方式,將你的資料庫鏈結檔案引入到當前的檔案中,而此時通過瀏覽器訪問這樣的檔案並檢視源**,你的 conn.asp 檔案源**就洩露了,入侵者可以通過這個檔案的內容找到你的資料庫存放路徑或者資料庫伺服器的鏈結密碼等資訊,這也是非常危險的。

那麼,如果你真的要把上面我所提到的檔案都加入黑名單,就安全了嗎,也不一定。現在很多伺服器都開啟了對 asp 和 php 的雙支援,那麼,我是不是可以上傳 php 版的 webshell 呢,所以說,黑名單這種被動防禦是不太好的,因此我建議你使用白名單的方法,改進上面的函式,例如你要上傳**,那麼就檢測副檔名是否是 bmp、jpg、jpeg、gif、png 之一,如果不在這個白名單內,都算作非法的副檔名,這樣會安全很多。

第四、 表單中傳遞檔案儲存目錄。

上面的這些操作可以保證副檔名這裡是絕對安全的,但是有很多程式,譬如早期的動網論壇,將檔案的儲存路徑以隱藏域的方式放在上傳檔案的表單當中 ( 譬如使用者頭像上傳到 use***ce 資料夾中,那麼就有乙個名為 filepath 的隱藏域,值為 use***ce),並且在上傳時通過鏈結字串的形式生成檔案的儲存路徑,這種方法也引發了漏洞。

formpath=upload.form("filepath")

for each formname in upload.file '' 列出所有上傳了的檔案

set file=upload.file(formname) '' 生成乙個檔案物件

if file.filesize<10 then

response.write " 請先選擇你要上傳的**  [ 重新上傳 ]"

response.write ""

response.end

end if

fileext=lcase(file.fileext)

if checkfileext(fileext)=false then

response.write " 檔案格式不正確  [ 重新上傳 ]"

response.write ""

response.end

end if

randomize

rannum=int(90000*rnd)+10000

filename=formpath&year(now)&month(now)&day(now)&hour(now)&minute(now)

&second(now)&rannum&"."&fileext

大家可以看出這段**,首先獲得表單中 filepath 的值,在最後將其拼接到檔案的儲存路徑 filename 中。

在這裡就會出現乙個問題。

問題的成因是乙個特殊的字元:chr(0),我們知道,二進位制為 0 的字元實際上是字串的終結標記,那麼,如果我們構造乙個 filepath,讓其值為 filename.asp ■ ( 這裡是空字元,即終結標記 ),這個時候會出現什麼狀況呢,filename 的值就變成了 filename.

asp,再進入下面的儲存部分,所上傳的檔案就以 filename.asp 檔名儲存了,而無論其本身的副檔名是什麼。

黑客通常通過修改資料報的方式來修改 filepath,將其加入這個空字元,從而繞過了前面所有的限制來上傳可被執行的網頁,這也是我們一般所指上傳漏洞的原理。

那麼,如何防護這個漏洞呢,很簡單,盡量不在客戶端指定檔案的儲存路徑,如果一定要指定,那麼需要對這個變數進行過濾,如:

formpath = replace(formpath,chr(0),"")

第五、 儲存路徑處理不當。

經過以上的層層改進,從表面上來說,我們的上傳程式已經很安全了,事實上也是這樣的,從 2004 年的動網上傳漏洞被指出後,其他程式紛紛改進上傳模組,因此上傳漏洞也消失了一段時間,但是今年春節的時候,另種上傳漏洞被黑客發掘了出來,即結合 iis6 的檔名處理缺陷而導致的乙個上傳漏洞。這裡簡單說一句,這個漏洞最早被發現與 * 易 cms 系統。

在該系統中,使用者上傳的檔案將被儲存到其以使用者名稱為名的資料夾中,上傳部分做好了充分的過濾,只可以上傳**型別的檔案,那麼,為什麼還會出現漏洞呢。

iis6 在處理資料夾名稱的時候有乙個小問題,就是,如果資料夾名中包含 .asp,那麼該資料夾下的所有檔案都會被當作動態網頁,經過 asp.dll 的解析,那麼此時,在 * 易系統中,我們首先註冊乙個名為 test.

asp 的使用者名稱,而後上傳乙個 webshell,在上傳時將 webshell 的副檔名改為**檔案的副檔名,如 jpg,而後檔案上傳後將會儲存為 test.asp/20070101.jpg 這樣的檔案,此時使用 firefox 瀏覽器訪問該檔案 (ie 會將被解析的網頁檔案當作突**理,因為其擴充套件名為** ),此時會發現我們上傳的「**」又變成了 webshell。

這個漏洞其實是十分有趣的,他不只是簡單的 asp 漏洞,而是結合了 iis 的乙個缺陷,的確非常的隱蔽。

當然,防禦這個漏洞也是很簡單的,如果沒有必要,那麼不要將突破按照使用者名稱分目錄儲存,如果一定要這樣,那麼需要檢測使用者名稱中是否有非法字元,例如 . 等。

什麼是ICC檔案

icc檔案,又叫icc color profile,其實就是裝置色彩特性檔案,也就是描述不同的裝置在顏色表現上的一些特點的檔案。icc檔案是色彩管理能夠實施的乙個基礎,有了icc檔案,各種具有色彩管理功能的軟體 如photoshop 就可以依據不同裝置的顏色特點,而準確顯示出顏色在不同裝置上的轉換和...

規範資訊檔案上傳管理

規範上傳檔案管理的通知 為進一步加強和規範公司上網資訊的管理,按照保密制度的要求,對上傳的資訊檔案重新強調要求,望各單位 各部室按此要求認真上傳檔案。1 上傳資訊內容以本部工作動態和專業資訊為主,內容與欄目必須相符,檔案內容編輯規範 工整。檔名稱要清楚 精煉 完整。各種生活常識 日常保健 各種知識,...

多檔案上傳及預覽

原有功能 此功能針對一條業務資料有多個 不定個數 附件的情況下開發的。結構說明 common包中是將上傳的excel轉換成html為預覽做準備,是將上傳的word轉換為pdf為預覽做準備。如果同時上傳的檔案較多或者較大的時候應當對做多執行緒優化。包中為測試檔案上傳,是乙個小demo,可刪除。中此方法...