白話:文件上傳漏洞

今天,來談談關於文件上傳漏洞。

很多網站都提供了文件上傳功能,用以用戶來分享自己的東西。但是,這也給網站帶來很大的安全隱患,如果網站管理人員或者開發人員不注意的話,將使網站處於非常危險的狀態。

常見的不安全因素主要有以下兩方面:

  1. 對上傳文件大小不做限制
    我們一般在需要上傳文件的網站上,都可以看到對上傳文件的大小的限制,如不能超過多少KB或多少MB,這樣做的目的主要有以下兩個方面考慮:

    • 大文件的上傳會大量佔用服務器寶貴的網絡資源,大大降低系統吞吐量

    • 大文件浪費系統存儲資源,既佔用大量磁盤空間,同時在存取時也將極大消耗系統磁盤I/O

  2. 對上傳文件類型不做限制

    • 上傳的文件是Web腳本語言,服務器的Web容器解釋並執行了用戶上傳的腳本,導致代碼執行

    • 上傳文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在該域下的行爲(其他通過類似方式控制策略文件的情況類似)

    • 上傳文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行

    • 上傳文件是釣魚圖片或爲包含了腳本的圖片,在某些版本的瀏覽器中會被作爲腳本執行,被用於釣魚和欺詐。

下面就說說預防漏洞的方法:

1.根據業務具體情況,相應的限制用戶上傳文件的大小

一方面,我們可以在前端限制用戶上傳文件的大小:

下面是JS獲取文件大小的方法:

<INPUT TYPE="file" NAME="file" SIZE="30" onchange="getFileSize(this.value)">
<script type="text/javascript">
function getFileSize(filePath)
{
      var fso = new ActiveXObject("Scripting.FileSystemObject");
      alert("文件大小爲:"+fso.GetFile(filePath).size);
}
</script>

當然,前端的限制只是起一個提醒作用,後端的校驗當然是必不可少的,而且真正起作用的是後端。

由於後端所使用的語言不同,上傳方式不同,從而判斷方法不同,我使用的是servlet自帶的文件上傳組建,對文件大小設置是這樣的:

@MultipartConfig(maxFileSize = 1024 * 1024 * 5) //5MB

//判斷文件是否超過設置的大小
if(config.maxRequestSize() == -1L || config.maxFileSize() == -1L) {
    System.out.println("上傳文件過大!");
}

2.根據業務情況,限制用戶上傳文件的類型

在windows下,一般是通過後綴名來判斷文件的類型的,但是我們也深知這種方式是非常不靠譜的,因爲我們可以輕鬆的將一個後綴名改成另一個後綴名。但是許多文件都有這樣的規律,在文件的開頭幾個字節是固定的,通過這幾個字節,我們基本可以確定文件類型,我們將這幾個字符稱之爲魔數。關於魔數,請猛戳這裏

在Linux下,我們可以使用hexedit命令來以16進制查看文件內容

PNG文件:
這裏寫圖片描述

PNG文件魔數爲:89504E47

PDF文件:
這裏寫圖片描述

PDF文件魔數爲:255044462D312E

下面是常見文件的魔數:

JPEG (jpg)  文件:FFD8FF 
PNG  (png)  文件:89504E47 
GIF  (gif)  文件:47494638 
TIFF (tif)  文件:49492A00
Wave (wav)  文件:57415645 
AVI  (avi)  文件:41564920
XML  (xml)  文件:3C3F786D6C 
HTML (html) 文件:68746D6C3E 
ZIP  (zip)  文件:504B0304 
RAR  (rar)  文件:52617221 
Windows Bitmap (bmp) 文件:424D  
MS Word/Excel (.xls or .doc) 文件:D0CF11E0 
Adobe Acrobat (pdf) 文件:255044462D312E 

因此我們可以通過辨別文件頭部的幾個字節來判斷文件類型,這樣就能比較準確的判斷文件類型,從而嚴格控制文件上傳,防止上傳惡意文件。
關於怎樣通過代碼實現對文件類型判定,請點擊這裏:http://blog.csdn.net/t894690230/article/details/51242110

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章