zoukankan      html  css  js  c++  java
  • PHP代码审计学习(9)——文件上传

    文件上传漏洞

      文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。

    挖掘思路

      这个比较好找,黑盒就在找页面到上传点就好了,白盒找相关的上传函数

      前提

      文件可上传
      知道文件上传的路径
      上传文件可以被访问
      上传文件可以被执行

    案例

      还是直接上DVWA的吧(我太菜了)

    LOW

      访问页面,直接上传.php文件

     

      查看源码

     

      并未做任何过滤而且给出了上传文件保存的位置,直接上传一句话就可以。(插眼)

    Medium

    查看源码

     

    发现增加了一个文件类型和大小判断,但是$_FILES[‘uploaded’][‘name’]这里没有任何处理,所以上传php文件,抓包修改它的文件类型,也就是Content-Type值为image/jpeg

    High

     

    用到了substr函数对字符串进行分割,同时用strpos函数匹配.号最后出现的位置。

    关键代码

     

    这里对上传文件的类型做了限制,结合刚才判断.号位置的语句,首先可以把.php.jpg方法PASS掉。

    同上一关一样,抓包修改文件类型,因为都没有对MIME进行严格判断。

     

    Impossible级别

     

     

    加入了token防止CSRF,对文件内容进行了严格的过滤,而且对上传的文件进行md5重命名,没有给上传恶意文件的机会

    文件上传姿势

    1、客户端JS检测

      这个比较常见也比较简单,一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。

    function check()
    {
      var filename = document.getElementById("file");
      var str = filename.value.split(".");
      var ext = str[str.length-1];
      if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif')
      {
        return true;
      }
      else
      {
        alert("仅允许上传png/jpeg/gif类型的文件!")
        return false;
      }
      return false;
    }

      这段代码就是检测我们上传的文件的后缀名,只允许png/jpeg/gif,判断该类检测的方法:选择一个禁止上传类型的文件上传,当点击确定按钮之后,浏览器立即弹窗提示禁止上传,一般就可以断定为客户端JavaScript检测。

      绕过这个很好绕,因为是在前端,所以设置代理,先将文件改为允许的类型上传绕过前端,然后再抓包将文件类型改回来

    2、服务端MIME检测(Content-Type检测)

      这个就是DVWA的Medium级别,校验请求头content-type字段绕过

    <?php
      if($_FILES['userfile']['type']!="image/gif")
      {//检测Content-type
        echo"错误文件类型";
        exit;
      }
      $uploaddir='uploads/';  //上传路径
      $uploadfile=$uploaddir.basename($_FILES['userfile']['name']);
      if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
      {
        echo"文件上传成功.
    ";
      }
      else
      {
        echo"文件上传失败.
    ";
      }
    ?>

      使用burp代理,修改Content-Type的参数

    3、服务端文件扩展名检测

      比较一下,白名单比黑名单更安全,一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。如.php、.jsp、.py等,但经常会出现漏网之鱼

      绕过方法:

        文件名大小写绕过:

     使用Asp、PhP之类的文件名绕过黑名单检测 

        名单列表绕过:    

    用黑名单里没有的名单进行攻击,比如很名单中没有的asa或者cer之类

        特殊文件名绕过:

    比如在发送的HTTP包中,将文件名改为”dama.asp.”或者”dama.asp_”(下划线为空格),这种命名方式在window系统里是不被允许的,所以需要在Burp Suite中抓包修改,上传之后,文件名会被window自动去掉后面的点或者空格,需要注意此种方法仅对window有效,Unix/Linux系统没有这个特性。

        0x00截断绕过:

    操作方法:上传dama.jpg,Burp抓包,将文件名改为dama.php%00.jpg,选中%00,进行url-decode。

        上传.htaccess文件攻击:(适用于黑名单检测方式,黑名单中未限制.htaccess)

    该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中

        解析调用/漏洞绕过

    https://www.cnblogs.com/Lee-404/p/12919552.html

        .user.ini文件绕过(适用于黑名单检测方式,黑名单中未限制.user.ini)

    https://www.cnblogs.com/Lee-404/p/12838790.html CTF题
    https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html //.user.ini讲解

        文件头绕过

    在木马内容基础上再加了一些文件信息,有点像下面的结构

    GIF89a
    <?php phpinfo(); ?>

        多个Content-Disposition

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

    文件上传防御

    • 文件扩展名服务端白名单校验。

    • 文件内容服务端校验。

    • 上传文件重命名。

    • 隐藏上传文件路径。

    参考链接

    https://www.cnblogs.com/wangtanzhi/p/12243206.html#autoid-0-5-0

    https://www.secpulse.com/archives/95987.html

  • 相关阅读:
    Unity SceneManager 对场景的操作
    Unity [Tooltip("")]
    Unity WWW下载图片并保存到Unity的Assets下
    C# 集合
    C# 枚举与switch用法
    C# String.Format方法
    C# Thread类 线程优先级
    Unity Gizmos可视化辅助工具
    anacanda
    异常和错误
  • 原文地址:https://www.cnblogs.com/Lee-404/p/13220957.html
Copyright © 2011-2022 走看看