文件上传限制绕过技巧

标签: WEB安全 文件上传限制绕过 | 发表时间:2018-08-15 13:00 | 作者:secist
出处:http://www.freebuf.com

严正声明:本文仅限于技术讨论,严禁用于其他用途。

简介

文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码。但在一些安全性较高的web应用中,往往会有各种上传限制和过滤,导致我们无法上传特定的文件。本文将就此展开讨论,通过本文的学习你将了解到Web应用中文件上传的处理和验证发送流程,以及我们该如何绕过这些验证。

客户端验证

客户端验证是一种发生在输入被实际发送至服务器之前进行的验证。这类验证大都都是通过JavaScript,VBScript或HTML5来完成的。虽然,这对于用户来说响应速度更快体验也更好。但对于恶意攻击者来说,这些验证似乎就显得略为低级。

客户端验证绕过

这种类型的绕过也非常简单,我们可以关闭浏览器上的JavaScript或是在浏览器发出请求之后,在被发送至服务器之前来篡改该HTTP请求即可。

示例:

  1. <script type="text/javascript">
2. var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"];
3. function Validate(oForm) {
4. var arrInputs = oForm.getElementsByTagName("input");
5. for (var i = 0; i < arrInputs.length; i++) {
6. var oInput = arrInputs[i];
7. if (oInput.type == "file") {
8. var sFileName = oInput.value;
9. if (sFileName.length > 0) {
10. var blnValid = false;
11. for (var j = 0; j < _validFileExtensions.length; j++) {
12. var sCurExtension = _validFileExtensions[j];
13. if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).to
LowerCase() == sCurExtension.toLowerCase()) {
14. blnValid = true;
15. break;
16. }
17. }
18.
19. if (!blnValid) {
20. alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtension
s.join(", "));
21. return false;
22. }
23. }
24. }
25. }
26.
27. return true;
28. }
29. </script>

正如你所看到的,此JavaScript仅在请求被实际发送至服务器之前处理你的请求,以及检查你上传的文件扩展名是否为(jpg,jpeg,bmp,gif,png)。这样的话,我们就可以拦截该请求并篡改文件内容(恶意代码),然后将图片扩展名更改为可执行文件的扩展名(如php,asp)。

文件上传限制绕过技巧

如上图所示,我们试图上传一个直接的PHP文件,JavaScript阻止了我们的文件上传请求。

文件上传限制绕过技巧

我们可以通过浏览器来上传一个正常的图片格式来绕过该验证,然后拦截该请求再将其改回为php格式并将文件内容替换为我们的恶意代码,这样我们就能够成功上传我们的恶意php脚本了。

文件名验证

顾名思义,就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传。检查扩展名是否合法有两种常用策略,即黑名单和白名单策略。

黑名单策略,即文件扩展名在黑名单中的为不合法。白名单策略,即文件扩展名不在白名单中的均为不合法。相对于黑名单,白名单策略更加安全的。通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破。

文件名绕过

我们可以通过上传一些平时不怎么用的容易被人忽视的文件扩展名,来绕过这种类型的验证。

绕过黑白名单策略:

黑名单绕过

通过上传不受欢迎的php扩展来绕过黑名单。例如:pht,phpt,phtml,php3,php4,php5,php6

白名单绕过

通过某种类型的技巧来绕过白名单,例如添加空字节注入(shell.php%00.gif),或使用双重扩展来上传文件(shell.jpg.php)。

此外,我们还可以尝试扩展名大小写来绕过,例如:pHp,Php,phP。

示例:

  1. if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
2. && $imageFileType != "gif" ) {
3. echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 

以上代码将会阻止除jpg,jpeg,gif,png扩展名以外的,所有其它文件类型上传。在本例中我们将尝试绕过该检查,并在Web服务器上传一个php文件。

黑名单绕过

文件上传限制绕过技巧

正如你所看到的,将php文件的后缀更改为.php5(Apache服务器会将其视为php文件执行)后,就可以成功绕过该上传验证。

白名单绕过

文件上传限制绕过技巧

如上图所示,我们使用了双重扩展名(shell.jpg.php)来绕过验证。

Content-Type验证

Content-Type(内容类型),一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。例如,一些图像文件上传通过检查文件的内容类型是否为图像类型来验证上传的图像。

Content-Type绕过

该类型的绕过也非常简单,只需将“Content-Type”的参数类型更改为“image/ *”即可,例如“image/png”, “image/jpeg”, “image/gif”。

示例:

  1. <?php
2.
3. $mimetype = mime_content_type($_FILES['file']['tmp_name']);
4. if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png'))) {
5. move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/' . $_FILES['file']['name']);
6. echo 'OK';
7.
8. } else {
9. echo 'Upload a real image';
10. } 

以上代码会检查Content-Type header中的MIME类型,仅接受类型为image/jpeg, image/gif, image/png的文件上传。我们只需只需将“Content-Type”的参数类型更改为其可接受的类型即可绕过。

文件上传限制绕过技巧

CONTENT-LENGTH验证

Content-Length验证是指服务器会对上传的文件内容长度进行检查,超出限制大小的文件将不允许被上传。虽然这种类型的验证不是很受欢迎,但在一些应用的文件上传中也时常能碰到。

CONTENT-LENGTH绕过

针对这种类型的验证,我们可以通过上传一些非常短的恶意代码来绕过。上传文件的大小取决于,Web服务器上的最大长度限制。我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。

示例:

  1. if ($_FILES["fileToUpload"]["size"] > 30) {
2. echo "Sorry, your file is too large.";
3. } 

以上代码将限制大小超过30字节的文件上传。我们可以通过上传一个30字节以内大小的恶意payload文件来绕过它。

文件上传限制绕过技巧

参考来源

http://www.securityidiots.com/Web-Pentest/hacking-website-by-shell-uploading.html

http://www.net-informations.com/faq/asp/validation.htm

https://www.owasp.org/index.php/Unrestricted_File_Upload

http://www.sitepoint.com/mime-types-complete-list/

https://www.w3schools.com/php/php_file_upload.asp

https://stackoverflow.com/

 *参考来源: exploit-db,FB小编 secist 编译,转载请注明来自FreeBuf.COM

相关 [文件 上传 限制] 推荐:

文件上传限制绕过技巧

- - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
严正声明:本文仅限于技术讨论,严禁用于其他用途. 文件上传漏洞是web安全中经常利用到的一种漏洞形式. 一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码. 但在一些安全性较高的web应用中,往往会有各种上传限制和过滤,导致我们无法上传特定的文件.

修改PHP上传文件大小限制

- - 操作系统 - ITeye博客
PHP上传文件默认一般都是有限制的, . 有的时候我们需要上传大的文件,那么怎么修改PHP上传限制的大小呢 . 一般的php文件上传,除非文件很小.就像一个5M的文件, .    很可能要超过一分钟才能上传完. 但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,. 这就导致出现 无法打开网页的情况. .

IE CSS文件限制

- - Web前端 - ITeye博客
单个页面最多31个css文件. 每个css文件大小最大288k. 每个css文件最多4095个选择器. Resource merging, which help you reduce the number of requests made to the server, may bring the following dilemma in IE.

多文件上传

- - BlogJava-首页技术区
多文件上传 jquery的插件. 使用的方法  导入 jquery.js 及 jquery.MultiFile.js ,. 方式一: 后台是文件数组  .  private File[] upload; // 与jsp表单中的名称对应. 在 form 中加入 即可.

异步上传文件

- - Web前端 - ITeye博客
通过iframe来实现无刷新的的文件上传,其实是有刷新的,只是在iframe里面隐藏了而已. form里面的target要与iframe里面的id的值相等,指示是form相应了post事件,也就是post时间相应的时候刷新的是iframe而不是整个页面. 用户名:
上传头像:

dubbo处理文件上传

- - 开源软件 - ITeye博客
dubbo和hessian的maven依赖:. 服务提供者(项目名称:provider). 首先是web.xml配置(使用spring):. 最重要的applicationContext.xml :. 参考: dubbo hessian协议. .

springmvc文件上传下载

- - ITeye博客
在网上搜索的代码 参考整理了一份. commons-fileupload.jar与commons-io-1.4.jar二个文件. 1、表单属性为: enctype="multipart/form-data". 2、springmvc配置.

HTML5之拖拽上传文件及chrome下文件夹上传

- - ITeye博客
最近被安排做一个拖拽上传和文件夹上传的功能,不考虑兼容性,哈哈这个可以用HTML5实现. 这里就不仔细学习HTML5,我只是想找例子,然后偷过来用,至于原理边用边学. 首先这里有一个很好的实例实现拖拽上传: http://blogs.sitepointstatic.com/examples/tech/filedrag/1/index.html.

nodejs-post文件上传原理详解

- never-online - CNode社区
浅谈HTTP中Get与Post的区别. 其中请求报文中的开始行和首部行包含了常见的各种信息,比如http协议版本,方法(GET/POST),accept-language,cookie等等. 而’实体主体’一般在post中使用,比如我们用表单上传文件,文件数据就是在这个’实体主体’当中. 写这篇教程的起因是因为在学习nodejs的过程中,想要自己实现一些文件上传的功能,于是不得不去研究POST.

文件上传的渐进式增强

- - 阮一峰的网络日志
文件上传是最古老的互联网操作之一. 20多年了,它几乎没变,还是原来的样子:操作麻烦、缺乏交互、用户体验不佳. 在这个新技术日新月异的时代,显得非常落伍. 网页开发者们想了很多办法,试图提升文件上传的功能和操作体验,在各种Javascript库的基础上,开发了五花八门的 插件. 可是,由于不同浏览器之间的差异,缺乏统一接口,这些插件要么用起来很麻烦,要么不能普遍适用.