网络安全从入门到精通 (第七章-1) 文件上传漏洞 — 解析、验证、伪造(一)

本文内容:

  • 客户端检测
  • 服务器端检测
  • 文件上传绕过类型

 

1,客户端检测:

  客户端检测:一般是在网页上写一段JS脚本,用JS去检测,校验上传文件的后缀名,有白名单,也有黑名单。

  判断方式:

    在浏览器加载文件,但还未点击上传按钮时要弹出对话框,内容如:

      只允许上传jpg/peg后缀名的文件,此时并没有发送数据包,所以可以通过抓包来判断,如果弹出不准上传,但是没有抓到数据包,那么就是前段验证。

      前端验证非常不可靠,传正常文件改数据包就可以绕过,甚至关闭JS都可以尝试绕过。

  黑白名单机制:

    黑名单:不允许上传什么。

    白名单:允许上传什么。

    白名单比黑名单更安全。

  使用Burpsuite抓包,上传一个非法文件,如果抓到数据包,说明是后端校验,如果没抓到数据包,说明是前端校验。

2,服务器端检测:

  服务器端检测几个常见的手段:

    检查Content-Type[内容类型]

    检查后缀[检查后缀是主流]

    检查文件头

  如果绕过Content-Type[内容类型]和文件头检测,这个时候我们就需要制作一个图片马了。

  注意:图片越小越好。

  图片马制作:

    在一个txt文件写入一句话木马,然后在找一张喜欢的图片。

    然后打开CMD输入copy1.png/b + 1.txt 123.png 

    解释:将1.png和1.txt合并为123.png   /b的意思就是把它当做二进制去拷贝。

  注意:

    图片马经过二次压缩就失效了

    图片马可以很好的绕过内容类型和文件头。

    一句话木马:<?php @eval($_REQUEST['a']);?>

  解析文件扩展名:

    php:php、phtml、php3、php4等。

    jsp:jap、jspx、jspf等。

    asp:asa、cer、aspx等。

    ext:exee等。

  先判断是否前端检测,然后在检测是不是后缀检测,再看是不是黑名单。

3,文件上传绕过类型:

  1.前端检测: 

    使用Burp抓包,上传一个非法文件,如果抓到数据,说明是后端校验,如果没抓到数据包,说明是前端校验。

  2.Content-Type方式绕过:

    使用Burp,上传图片马,直接更改类型php。

  3.黑名单绕过:
    使用BURP,上传图片马,直接更改类型php,如上传不成功,可以更改phptml。

  4. .htaccess文件绕过:

    这个文件是中间件看的。

    .thaccess是什么?

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

      2.htaccess功能:

        文件夹密码保护、用户自定义冲顶下行、自定义404页面,扩展伪静态话、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,很可惜,这个功能默认是不开启的。

      例如:AddType application/x-httpd-php .jpg 这个指令代表有.jpg文件会当做php解析

        将这句代码放进txt文件,将文件名修改成功.htaccess,然后上传它就可以了。

      注意:

        win10已支持文件命名为这种类型。

        win7需要使用cmd ren  1.txt .htaccess。

  5.后缀大小写绕过:
    Windows后缀是不区分大小写的。

    解析时一般也不区分大小写。

    Web容器除非非常老,不然都不区分大小写。

  6.文件后缀[空/空格]绕过:

    在文件名后留一个空格,然后上传上去空格会自动省略。

    在系统操作中,php空格=php

    但是在字符串匹配的时候:php空格!=php。

  7.文件后缀[点]绕过:
    Windows有一个特性,会自动去掉后缀名留最后的。

  8.::DATA[Windows文件流绕过]:
    这里利用到了NTFS交换数据流[ADS],ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个每个文件都可以存在多个数据流。通俗的理解,就是其他文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。

   在cmd输入:

    echo abcd>>a.txt:b.txt 将abcd写入a.txt:b.txt,很明显生成一个a.txt,将b.txt寄宿到a.txt文件上。

    使用notepad 1.txt:b.txt,将寄宿文件揪出来 

    然后在试试a.txt::$DATA 

    ::$DATA就是默认不修改文件流的情况,所以生成一个正常的a.txt。

    利用windows特性,可在后缀名中加::$DATA 绕过。

  9.构造文件后缀绕过:
    如:php..

  10双写文件后缀绕过:
    如:pphphp
     

      

 

posted @ 2020-04-18 21:35  TheHIde  阅读(354)  评论(0编辑  收藏  举报