Web应用安全之八种安全的文件上传方式

Web应用安全之八种安全的文件上传方式

为了让最终用户将文件上传到您的网站,就像是给危及您的服务器的恶意用户打开了另一扇门。即便如此,在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高您的业务效率。在Facebook和Twitter等社交网络的Web应用程序,允许文件上传。也让他们在博客,论坛,电子银行网站,YouTube和企业支持门户,给机会给最终用户与企业员工有效地共享文件。允许用户上传图片,视频,头像和许多其他类型的文件。

向最终用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的。

当在测试几个Web应用程序时,我们注意到,相当多的知名Web应用程序,不具备安全的文件上传形式。这些漏洞很容易被利用,我们可以访问这些Web应用程序的服务器托管到文件系统。在这篇文章中,我们为您介绍8种常见的方式,我们遇到过的安全文件上传表单。同时,还将展示一个恶意的用户,可以轻松地绕过这些安全措施。 案例1:没有任何验证的简单文件上传表单

一个简单的文件上传表单通常包含一个HTML表单和PHP

脚本。HTML表单的形式呈现给用户,而需要文件上传功能的PHP脚本中包含的代码。这种形式和PHP脚本下面是一个例子: HTML Form:

view source <form enctype='multipart/form-data' action='uploader.php' method='POST'> <input type='hidden' name='MAX_FILE_SIZE' value='100000' /> Choose a file to upload: <input name='uploadedfile' type='file' /><br /> <input type='submit' value='Upload File' /> </form> PHP Code:

<?php $target_path = 'uploads/'; $target_path = $target_path .

basename($_FILES['uploadedfile']['name']); if

(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo 'The file ' .

basename($_FILES['uploadedfile']['name']) . ' has been uploaded'; echo 'There was an error uploading the file, please try again!'; } else { } ?>

当PHP接收POST请求且编码类型是multipart/form-data,它会创建一个临时文件名随机的临时目录中(例如/

var/tmp/php6yXOVs)。 PHP也将填充全局数组$_FILES上

传的文件的信息:

$ _FILES ['UploadedFile的'] ['名称']:在客户机上的文件的原始名称 $ _FILES ['UploadedFile的'] ['类型']:文件的MIME类型 $ _FILES ['UploadedFile的'] ['大小']:文件的大小(以字节为单位) $_FILES ['UploadedFile的']['不对tmp_name']:上传的文件存储在服务器上的临时文件名。 PHP 函数move_uploaded_file将用户提供的临时文件移动到一个位置。在这种情况下,目的地是服务器根目录以下。因此,文件可以使 用的URL,如:

http://www.domain.tld/uploads/uploadedfile.ext访问。在这个简单的例子中,有允许上传 的文件类型没有限制,因此攻击者可以上传一个PHP或NET带有恶意代码的文件,可导致服务器妥协。

这可能看起来像很幼稚的例子,但我们在一些Web应用中没有遇到这样的代码。 案例2:Mime类型验证

另 一个常见的错误Web开发人员确保文件上传表单时,只检查从PHP返回mime类型。当一个文件被上传到服务器,PHP将设置变 量$_FILES['UploadedFile']['type']所提供的Web浏览器客户端使用的MIME类型。然而,文件上传表单验证不能依赖于这 个值。恶意用户可以轻松地使用脚本或其他一些自动化的应用程序,允许发送HTTP POST请求,

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4