zoukankan      html  css  js  c++  java
  • 文件上传漏洞和绕过

      文件上传漏洞是Web安全中一种常见的漏洞在渗透测试中经常使用到,能够直接快速地获得服务器的权限,如果说一个没有文件上传防护规则的网站,只要传一个一句话木马就可以轻松拿到目标了。上传文件上传漏洞是指用户上传了如木马、病毒、webshell等可执行文件到服务器,通过此文件使服务器执行命令从而控制网站。

    0x01文件上传检验

    • 黑名单检测
    • 白名单检测
    • 文件头检测
    • 正则检测
    • WAF检测
    • 前端JavaScript检测

      在客户端进行检测的时候一般是通过JavaScript的脚本对上床的文件名后缀进行检测。有白名单也有黑名单,比如只允许上传.jpg  .png  .gif  .jpeg等后缀文件名。但前端检测可以通过对代码进行·修改轻松绕过。前端的代码在浏览器执行,可以通过bp拦截进行修改。

      文件上传一般会进行检测然后上传到缓存文件(tmp)再通过后端代码的移动移动到指定目录重命名。

    0x02文件上传 

      2.1前端检验

      通过抓取返回包并修改白名单规则加上.php或者直接删去所有校验代码  

         

     

      上传成功查看图片路径

      

       

       蚁剑连接

          

       2.2content-type

      在服务端的检测比如通过文件头content-type进行检测。  

      PHP校验代码,可以看到只允许上传jpeg png 和gif的后缀文件

     1 $is_upload = false;
     2 $msg = null;
     3 if (isset($_POST['submit'])) {
     4     if (file_exists($UPLOAD_ADDR)) {
     5         if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
     6             if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
     7                 $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
     8                 $is_upload = true;
     9 
    10             }
    11         } else {
    12             $msg = '文件类型不正确,请重新上传!';
    13         }
    14     } else {
    15         $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    16     }
    17 }

      补充一下content-type的知识:

      

    HTTP协议(RFC2616)采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户 信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以 及可能的实体内容。 
    
    通常HTTP消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域 值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。 
    
    请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。 
    Content-Type是返回消息中非常重要的内容,表示后面的文档属于什么MIME类型。Content-Type: [type]/[subtype]; parameter。例如最常见的就是text/html,它的意思是说返回的内容是文本类型,这个文本又是HTML格式的。原则上浏览器会根据Content-Type来决定如何显示返回的消息体内容。 
    
    type有下面的形式 
    
    Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; 
    
    Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据; 
    
    Application:用于传输应用程序数据或者二进制数据; 
    
    Message:用于包装一个E-mail消息; 
    
    Image:用于传输静态图片数据; 
    
    Audio:用于传输音频或者音声数据; 
    
    Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。 

       修改content-type为 image/jpeg 

     

      上传成功

       2.3文件后缀

        可以看到第5行定义了后缀为 asp aspx php jsp的文件不能上传,黑名单对特定的后缀文件其效果,可以通过上传xxx.a等不可能后缀的文件判断是否为黑名单检测。

     1 $is_upload = false;
     2 $msg = null;
     3 if (isset($_POST['submit'])) {
     4     if (file_exists($UPLOAD_ADDR)) {
     5         $deny_ext = array('.asp','.aspx','.php','.jsp');
     6         $file_name = trim($_FILES['upload_file']['name']);
     7         $file_name = deldot($file_name);//删除文件名末尾的点
     8         $file_ext = strrchr($file_name, '.');
     9         $file_ext = strtolower($file_ext); //转换为小写
    10         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
    11         $file_ext = trim($file_ext); //收尾去空
    12 
    13         if(!in_array($file_ext, $deny_ext)) {
    14             if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
    15                  $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
    16                  $is_upload = true;
    17             }
    18         } else {
    19             $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
    20         }
    21     } else {
    22         $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    23     }
    24 }

      那么 asp aspx php jsp的文件不能上传还有没有其它的后缀能被当成脚本进行解析呢。在默认状态下一些后缀名也是能被解析的

    能被解析的文件扩展名列表
    jsp jspx jspf     
    asp asa cer aspx
    php phtml php4 php5
    exe exee    

      文件后缀大小写:也可以利用后缀大小写进行尝试绕过 PhP PHp等 但有些防护机制会将文件名同义转换为小写

      

    $file_ext = strtolower($file_ext); //转换为小写

      文件后缀为空:windows上在保存文件名的时候如果有空格 比如php空格和php是相同的,但是对于检测来说php和php空格是不同的,那么他可能只会拦截php而不会拦截php空格的后缀文件。

      

       加点进行绕过  php.空格.

      

      双写 pphphp

      

      

          

       

       2.4 .htaccess文件绕过

      

      .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。Unix、Linux系统或者是任何版本的Apache Web服务器都是支持.htaccess的,但是有的主机服务商可能不允许你自定义自己的.htaccess文件。
      .htaccess文件的功能:用户自定义重定向、自定义404页面、文件夹密码保护、扩展名伪静态化、禁止特定IP地址的用户、禁止目录列表。
      功能强大但默认一般是不开启的,有为静态的可以试试。
      apache配置文件AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。
    1 AddType application/x-httpd-php .php
    2 AddType application/x-httpd-php .html
    3 可以加入更多可以执行php的文件类型,
    4 AddType application/x-httpd-php .htm
    5 .htm文件也可以执行php程序,
    6 AddType application/x-httpd-php .txt 普通的文本文件格式也能运行php程序。

      创建htaccess写入命令,在某些win10和win7上不能创建文件名为空的htaccess文件可以使用命令转换  

      

      

      2.5 文件偷绕过

      在一句话的基础上添加文件头,例如
      GIF89a<?php phpinfo(); ?>
      再抓包将content-type改为image/gif
      蚁剑连接
     

      2.6 windows数据流绕过 :: $DATA

      通俗点说就是其他文件可以寄宿在某个文件上,而在资源管理器中只能看到宿主文件找不到激素文件。

      在cmd可以通过命令写入  

       echo 9999>>a.txt:b.txt 数据写入b.txt生成了一个a.txt

       echo 9999>>c.php::$DATA 利用windows文件的特性Linux不行

      

       2.7 %00和00截断

      在文件上传的的时候如果白名单只允许上窜jpg等后缀的文件,在没有解析漏洞的情况下jpg格式不会被解析,那么需要绕过上传过滤。0x00实际上是一个十六进制的表示方式,表示acsii码值为0,有些函数在处理的时候会把它当作结束符,读取到这里的时候就结束了,%00是经过url编码的。

      php<5.3的一个漏洞  

      可以看到这里的移动路径

      

       那么进行修改

      

       修改成功

      

       将文件名为you.phpa的文件上传抓包

      在十六进制找到文件名这行,因为a的acsii为61 那么在这里修改为00

      

       可以看到文件后缀名已经改变  

      

      有些会对文件后缀和内容进行检测,那么可以上传图片马,如果对图片末尾进行检测那么可以用图片+木马+图片绕过。如果对于图片进行了二次渲染进行绕过,那么可以用动态图gif尝试,通常在第四行胡总和第三行开始写会比较好。

     

       

    文件上传的绕过方法有很多种,通过不断测试选择方法。

     

  • 相关阅读:
    Codeforces Round #401 (Div. 2)解题报告
    ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) 解题报告
    (线段树)hdoj 3308-LCIS
    Codeforces Round #399 (Div. 1 + Div. 2, combined) D题Jon and Orbs(dp)解题报告
    2019 Multi-University Training Contest 1
    2019 Multi-University Training Contest 6
    2019牛客暑期多校训练营(第八场)
    模板
    2019 Multi-University Training Contest 8
    2019 Multi-University Training Contest 9
  • 原文地址:https://www.cnblogs.com/yiyegugu/p/14984178.html
Copyright © 2011-2022 走看看