Web攻防系列教程之文件上传攻防解析:

  文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题。但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题。本文将对文件上传的检测方式以及如何绕过相应检测方式进行详细的分析,并提供针了对文件上传攻击的安全防护方法。

文件上传攻击是指攻击者利用WEB应用对上传文件过滤不严,导致可以上传应用程序定义类型范围之外的文件到Web服务器。比如可以上传一个网页木马,如果存放上传文件的目录刚好有执行脚本的权限,那么攻击者就可以直接得到一个WebShell。

文件上传攻击的原理

由于服务器端没有对用户上传的文件进行正确的处理,导致攻击者可以向某个可通过 Web 访问的目录上传恶意文件,并且该文件可以被Web服务器解析执行。

攻击者要想成功实施文件上传攻击,必须要满足以下三个条件:

1.可以上传任意脚本文件,且上传的文件能够被Web服务器解析执行,具体来说就是存放上传文件的目录要有执行脚本的权限。

2.用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。

3.要知道文件上传到服务器后的存放路径和文件名称,因为许多Web应用都会修改上传文件的文件名称,那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你上传了也无法访问。

主流文件上传检测方式概述

主流的文件上传检测方式有以下五种:

1.客户端javascript检测

客户端检测通常在上传页面里含有专门检测文件上传的javascript代码,在文件被上传之前进行检测,最常见的就是检测上传文件的文件类型和大小是否合法。

2.服务端MIME类型检测

这类检测方法通过检查http包的Content-Type字段中的值来判断上传文件是否合法。

3.服务端文件扩展名检测

这类检测方法通过在服务端检测上传文件的扩展名来判断文件是否合法。

4.服务端目录路径检测

这类检测一般通过检测路径是否合法来判断。

5.服务端文件内容检测

这类检测方法相当对上面四种检测方法来说是最为严格的一种。它通过检测文件内容来判断上传文件是否合法。这里,对文件内容的检测主要有两种方法。A.通过检测上传文件的文件头来判断。通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。B.文件加载检测,一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染。

如何绕过文件上传检测

上面我们分析了主流的文件上传检测方式,下面我们就来看下如何绕过上面提到的文件上传检测方式,本文只讨论如何绕过前三种检测方式。

1.绕过客户端javascript检测

这种检测方法是最不安全的,也是最容易被攻击者绕过的。Web应用不应只采用这一种手段检测上传文件,但可以作为一种辅助手段。因为采用客户端javascript检测可以增强应用对用户的友好度。由于javascript检测是在客户端实现的,所以我们完全能够控制它。可以在浏览器端禁用js脚本,比如在FireFox上安装FireBug这一插件就可以实现这一功能。另外一种是通过代理工具来实现,下面介绍利用Burp Suite来绕过客户端javascript检测。Burp Suite不仅仅只是一个代理工具,更是一款强大的网络渗透利器。关于Burp Suite的详细资料请自行百度。

这个站点http://www.2cto.com(注:由于该网站为真实站点,为了目标网站的安全,所以用target来代替真实域名)的文件上传功能只采用了客户端javascript检测,所以很容易被绕过。下面我们来具体看下操作方法。

首先,我们看一下正常情况下上传一个.asp文件,应用会有什么反应。

a. 我们访问这个URL(http://www.target.com/AdvHTML_Popups/upload.asp),会出现一个上传文件的页面

b. 我们先选择一个.asp文件,这时会提示不允许上传这种类型的文件。注意,这时我们还没有点击“件,这时会提示按钮,就出现提示信息。我们可以判断出这个网站是在客户端判断上传文件类型的合法性的。如图1:

图1

上面的情况证明在正常情况下是不能成功上传.asp文件的,那么下面就来看下如何绕过这种检测吧。

c. 我们先打开Burp Suite代理工具,然后配置浏览器使用代理。如图2:

图2

d. 我们先把刚才的那个.asp文件扩展名改为.gif,然后点击“然后点击“为那按钮。这时Burp Suite中就会拦截到浏览器提交的HTTP数据包。我们把filename字段的值webshell.gif修改为webshell.asp,再点击“再点击“ell”按钮,会发现文件成功上传到服务器。如图3:

图3

2.绕过服务端MIME类型检测

服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的。我们来访问http://193.168.20.235/upload.html,这是一个上传页面,当你选择上传文件,点击“上传”按钮后,会跳转到uploadf.php中进行处理。先来看下uploadf.php的代码,如图4:

图4

那么我们如何绕过这种检测方式呢?下面来看具体操作,还是用Burp Suite来完成。

我准备上传webshell.php到服务器,这是个一句话木马。选择好文件,然后点击“上传”,这时Burp Suite拦截到发往服务器的HTTP请求,我们在Burp Suite修改HTTP数据包中的内容,然后点击“据包中的内容,然按钮把数据包再转发给服务器。如图5:

图5

这时会提示文件成功上传,还会显示文件保存路径,说明我们成功绕过了服务端的MIME文件类型检测,如图6。

图6

现在我们用中国菜刀连接一下,可以成功访问到,效果如图7:

图7

3.绕过服务端文件扩展名检测

现在我们来看下如何绕过服务端文件扩展名检测,先来看下这两段代码,如图8:

图8

上面的代码是一个上传表单,在选择上传文件,点击“上传”按钮后会跳转到uploadfiles.asp中进行处理。我们来看下uploadfiles.asp文件中检测上传文件扩展名的代码,如图9:

图9

上面代码的意思是先得到上传文件的扩展名,然后和允许上传的文件类型对比,如果不符合定义,则提示“上传的文件格式不对!”。

下面具体看下如何绕过这种检测方式,我们先直接上传一个.asp的木马,会提示上传文件格式不对,这和我们预期的结果一致,如图10:

图10

现在我们将webshell.asp改为webshell.asp;test.jpg,再次上传,会发现我们的webshell被成功上传到服务器上,如图11。

图11

现在我们来访问下,地址为http://192.168.1.105/bookpic/webshell.asp;test.jpg,可以正常访问,如图12。

图12

注:这里利用了IIS的解析漏洞,当文件名为1.asp;1.jpg时,IIS会将此文件解析为1.asp,文件名被截断,导致脚本被执行。而且存放上传文件的目录要有执行脚本的权限,否则不能执行成功。

设计安全的文件上传功能

上面我们介绍了主流的文件上传检测以及绕过检测的方式,那么如何设计出一个安全的文件上传功能呢?下面我们就来总结一下。

1.设置保存上传文件的目录为不可执行

只要Web服务器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,此点至关重要。

2.判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈建议采用白名单的方式。此外,对于图片的处理可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的恶意代码。

3.使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果采用随机数改写了文件名和路径,将极大地增加攻击成本。与此同时,像webshell.asp;1.jpg这种文件,将因为文件名被改写而无法成功实施攻击

Web攻防系列教程之文件上传攻防解析(转载)的更多相关文章

  1. 使用.NET框架、Web service实现Android的文件上传(二)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYUAAAKpCAIAAADcx6fPAAAgAElEQVR4nOydd1hT5+LHg1attbfr1t ...

  2. Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区

    Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区 Kindeditor+web.py+SAE Storage 实现文件上传

  3. 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传

    一个简单的QQ隐藏图生成算法   隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...

  4. php文件上传代码解析

    php文件上传代码解析 is_uploaded_file()  //函数判断指定的文件是否是通过 HTTP POST 上传的,返回一个布尔值. $_FILES['upfile']['tmp_name' ...

  5. 补习系列(11)-springboot 文件上传原理

    目录 一.文件上传原理 二.springboot 文件机制 临时文件 定制配置 三.示例代码 A. 单文件上传 B. 多文件上传 C. 文件上传异常 D. Bean 配置 四.文件下载 小结 一.文件 ...

  6. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. eclipse下的web开发问题总结[struts2文件上传]

    最近需要做一个web方面的文件上传的Demo.开发工具是eclipse[具体名称:Eclipse IDE for Java EE Developers 版本:2.0.0.20130613-0530]. ...

  8. SpringMVC 系列教程1-文件上传-配置

    SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...

  9. 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传

    准备工作: 建立.NET Core Web Api项目 新建一个用于Api请求的UserInfo类 public class UserInfo { public string name { get; ...

随机推荐

  1. 虚拟机安装的Winserver 2008 R2系统,宿主机无法ping通主机

    新安装的虚拟机,在虚拟机中安装了Winserver2008 R2系统,网络适配器已经设置为桥接模式(自动) 刚开始的几天很正常,但是过了几天后,发现连接不了了,后来才发现是因为网络问题. 解决方案:修 ...

  2. 在shell中使用sed命令替换/为\/

    sed命令相关: https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html https://www.cnblogs.com/D ...

  3. 微信小程序开发思路

    小程序还没有完全开放,不能真实体验,但通过文档和开发工具,可以了解到他的开发思路 下面就介绍下小程序的开发方式,希望能帮助有兴趣的朋友对整体思路有个快速了解 整体结构 默认示例项目的目录结构 从后缀名 ...

  4. oper

    package main.java.com.zte.controller.ems; import java.util.HashMap; import java.util.List; import ja ...

  5. LR杂记 - 性能測试指标及经常使用的监控工具

    监控指标 性能測试通常须要监控的指标包含: 1.serverLinux(包含CPU.Memory.Load.I/O). 2.数据库:1.Mysql 2.Oracle(缓存命中.索引.单条SQL性能.数 ...

  6. js 事件点击 显示 隐藏

    <div style="position:absolute;left:40%;top:10%;border-style:dotted"> <img src=&qu ...

  7. 关于iOS 类扩展Extension的进一步理解

    很多人可能会问  iOS的分类和扩展的区别,网上很多的讲解,但是一般都是分类讲的多,而这也是我们平常比较常用的知识:但是,对于扩展,总觉得理解的朦朦胧胧,不够透彻. 这里就讲一下我自己的理解,但是这个 ...

  8. HDUOJ--畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. [转]动态加载javascript

    动态加载script到页面大约有俩方法 第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval()执行代码. 第二种是,动态创建一个script标签,设置其 ...

  10. Accelerated C++学习笔记7—&lt;使用库算法&gt;

    第6章  使用库算法 本章中主要教我们怎样使用几个库算法来解决与处理字符串和学生成绩相关的问题. 1.分析字符串 使用一个循环来连接两幅字符图案 <span style="font-f ...