今天,來談談關於文件上傳漏洞。
很多網站都提供了文件上傳功能,用以用戶來分享自己的東西。但是,這也給網站帶來很大的安全隱患,如果網站管理人員或者開發人員不注意的話,將使網站處於非常危險的狀態。
常見的不安全因素主要有以下兩方面:
對上傳文件大小不做限制
我們一般在需要上傳文件的網站上,都可以看到對上傳文件的大小的限制,如不能超過多少KB或多少MB,這樣做的目的主要有以下兩個方面考慮:大文件的上傳會大量佔用服務器寶貴的網絡資源,大大降低系統吞吐量
大文件浪費系統存儲資源,既佔用大量磁盤空間,同時在存取時也將極大消耗系統磁盤I/O
對上傳文件類型不做限制
上傳的文件是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