文件上传漏洞的绕过原理与实践

文件上传与文件包含

  1. 也是注入类型的漏洞;上传webshell等恶意文件
  2. 可以getshell

1. 原理

  1. 用户输入不可控
  2. 如果web应用在文件上传的过程中没有对文件的安全性进行有效的校验,攻击者可以通过上传webshell等恶意文件对服务器进行攻击,这种情况下认为系统存在文件上传漏洞
  3. 简单的说就是能成功上传文件

文件上传的过程

  1. 在web应用上向服务器提交文件表单
  2. 在服务器上生成临时文件(临时文件很短的时间就可以被识别并处理)
    1. 条件竞争的理解
  3. 头部变大,上传的时候就会有较长的延时

文件上传漏洞测试思路

  1. 由于上传webshell是对文件上传漏洞最有为好的利用方式,因此文件上传漏洞的测试主要目标是测试,能否通过文件上传功能上传webshel并之执行成功。
  2. 判断应用对文件上传的限制手段并尝试进行绕过是文件上传漏洞测试的主要环节。

2. 绕过方法

导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。

前端JS过滤绕过

利用BurpSuite软件代理->打开intercept(拦截)->将木马的后缀名改为php格式->点击forward将数据包发回,这样就可以上传成功。最后用菜刀连接。

还有一种方法就是在地址栏输入:about:config,搜索javascript:enabled,双击关闭,也可以成功。

Content-Type绕过

Content-Type一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。也就是我们说的MIME类型

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8"%>

如果想要在一个有type验证的网站上传一句话木马,我们可以给浏览器设置代理,127.0.0.1,端口为8080。

利用BurpSuite软件代理->打开intercept(拦截)->修改包内的Content-Type值:将application/octet-stream修改为image/jpeg。->点击forward将数据包发回,这样就可以上传成功。

扩展名绕过

把后缀换成大小写的方式绕过。

00截断绕过

想通过00%截断来绕过有验证的网站上传一句话木马。将上传的文件名命名为test.php%00.jpg格式,

  1. 利用BurpSuite软件代理->打开intercept(拦截)->修改包内的Content-Type值:将%00右击选择Covert selection选项中的URL进行编码->点击forward将数据包发回,这样就可以上传成功。注:系统在对文件名的读取时,如果遇到%00,就会认为读取已结束,不在读取后面的内容。
  2. 还可以用 : (冒号) 绕过

修改文件头绕过

  1. 在网上下载一张图片,用记事本打开,在图片的中间位置写上一句话木马。保存图片,就可以上传了。
  2. 或者用burpsuite抓包,在文件内容最后加入一句话木马,然后再进行转发。

黑名单检测绕过

  1. 不常见的扩展名:php3,php4,php5,ph,cer,cdx,asa
  2. 扩展名大小写
  3. 特殊字符结尾:以小数点或空格结尾,windows在保存这些文件时,会自动删除空格或小数点这些字符。如 .php. .php (.php后面有空格)
  4. 利用ASHX上传webshell

文件解析漏洞绕过

  1. 对于IIS6.0而言,若文件目录名以.ASP或.ASA等脚本文件扩展名形式结尾,则该文件目录下的所有文件都会被当做ASP文件解析,因此如果上传功能允许用户自定义上传的文件路径,则可以通过将文件路径设置为以.ASP结尾的形式进行攻击,此时即使上传的网页木马文件符合扩展名白名单仍会被作为脚本解析。例如将文件路径设置为/1.asp/,文件名为1.jpg,此时访问/1.asp/1.jpg,1.jpg会被当做ASP文件解析。

  2. 在IIS6.0的环境下,分号以后的内容在解析过程中会被忽略,因此如果上传类似于1.php;1.jpg形式的网页木马文件,会被当做php文件解析。

  3. apache在解析文件时如果遇到无法识别的扩展名,将会从后向前解析,直到碰到认识的扩展名为止,如果扩展名白名单中包含Apache无法解析的扩展名(以.7z为例),则可以构造类似于:1.php.7z这样的文件名进行上传,由于7z文件Apache无法解析,Apache最终会将该文件作为PHP脚本解析。

  4. 在IIS 7.0/IIS 7.5/Nginx <=0.8.37的环境下,在一个文件路径(/xx.jpg)后面加上/xx.php会将 /xx.jpg/xx.php 解析为 php 文件。

3. 文件上传漏洞绕过实例

原理

文件上传的限制手段及绕过方式
1. 客户端校验及绕过

扩展名限制的绕过:burpsuite抓包,修改代码或上传的数据包

2. 服务端校验及绕过

MIME类型的绕过:burpsuite抓包,修改content-type内容
文件内容检测的绕过:上传图片,用burpsuite抓包,在文件内容最后添加一句话木马
扩展名校验的绕过
1. 黑名单绕过(被拉黑的扩展名不能上传):大小写,截断,特殊扩展名,解析漏洞
2. 白名单绕过(只能上传规定的扩展名):截断,解析漏洞
3. 其他方式绕过:.htaccess,双文件上传

MIME原理

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。

  1. MIME规定了浏览器以什么格式打开文件。在HTTP中的content-type字段体现。
  2. 针对MIME方式的绕过,就是修改浏览器对文件的解析方式。比如将jsp的解析方式改为php。那么图片就会以php的格式打开。

场景一:对后缀名过滤

绕过方法:用burpsuite抓包,修改后缀名,再转发此包

具体步骤

  1. 首先创建一个一句话木马文件,123.php
    在这里插入图片描述

  2. 然后创建上传木马文件,但是被识别到后缀名不对
    在这里插入图片描述

  3. 然后就将123.php 改为123.jpg,进行上传,然后用burpsuite抓包

  4. 将123.jpg后缀名改为123.php,然后再次上传。但是发现后缀名 .php 被过滤了,于是用双写的方式绕过。
    在这里插入图片描述

  5. 打开虚拟机,找到文件上传的路径,发现有php文件
    在这里插入图片描述

场景二:???

场景三:前端扩展名过滤

类似场景一,只有前端对扩展名的限制,后端没有任何过滤方案

场景四:大小写绕过

前端对扩展名的限制,后端限制php文件的上传,但是可以用大小写绕过

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

场景五:后端截断绕过

前后端都对文件的扩展名做了限制
经过测试,用 : (冒号截断的方式可以绕过);用%00 0x00 \x00 这三种方式不行

绕过思路:

  1. 首先将jpg改为php
  2. 若上传失败,将php改为pHp,用大小写混合的方式
  3. 若php被过滤,可以用双写的方式,pphphp等
  4. 若还是无法上传成功,可以用截断的方式,如:冒号截断,0x00截断

在这里插入图片描述
在这里插入图片描述

场景六:???

场景七:对文件内容检测

针对ngnix中间件

  1. 首先上传123.jpg,其内容是一句话木马
    在这里插入图片描述

  2. 因为后端会对文件内容进行检测,要上传一张真的图片。用burpsuite抓包后,在文件内容最后加上一句话木马 <?php @eval($_POST['a']); ?>
    在这里插入图片描述

  3. 由于后端对文件扩展名进行了过滤,不允许php文件上传,因此要用截断绕过方式
    在这里插入图片描述

场景八:白名单

.htaccess叫分布式配置文件,它提供了针对目录改变配置的方法-在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录;

.htaccess文件可以实现很多特殊功能,其中一个功能可以修改扩展名的解析方式,如:在.htaccess文件中添加以下内容,可以将.jpg文件解析为PHPAddType application/x-httpd-php.jpg;

在这种情况下我们只需要上传一个文件,扩展名为.jpg的webshell文件以及上述.htaccess文件,即可通过webshell控制服务器;

操作流程
在这里插入图片描述

在这里插入图片描述

场景九:???

4. 对文件上传漏洞的防范

遵循以下的规则可以最大程度降低文件上传漏洞的风险:

  1. 白名单过滤

  2. 文件上传的目录设置为不可执行。

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

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

    文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果使用随机函数改写了文件名和路径,攻击者就不知道自己上传的文件的名字和路径了,给攻击造成很大难度。

  4. 严禁泄露文件绝对路径。上传过程不应传递目录或文件路径,使用预先设置路径列表中的匹配索引值,

  5. 有条件时可将保存在内容服务器或者数据库中。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Buffedon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值