白话:文件上传漏洞

今天,来谈谈关于文件上传漏洞。

很多网站都提供了文件上传功能,用以用户来分享自己的东西。但是,这也给网站带来很大的安全隐患,如果网站管理人员或者开发人员不注意的话,将使网站处于非常危险的状态。

常见的不安全因素主要有以下两方面:

  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文件:
白话:文件上传漏洞_第1张图片

PNG文件魔数为:89504E47

PDF文件:
白话:文件上传漏洞_第2张图片

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

你可能感兴趣的:(Web安全,白话Web攻击)