文件上传的基本概念和绕过方式

1. 概念

  客户端 选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径

  服务器 接收的资源程序

 

  客户端前端表单上传代码案例:

<html>
 <head></head>
 <body> 
  <form action="upload.php" method="post" enctype="multipart/form-data"> 
   <label for="file">Filename:</label> 
   <input type="file" name="file" id="file" /> 
   <br /> 
   <input type="submit" name="submit" value="Submit" /> 
  </form>  
 </body>
</html>

 

  

 

  服务端接受并根据返回码进行判断的后端php代码案例:

<?php
    if ($_FILES["file"]["error"] > 0)
      {
      echo "Error: " . $_FILES["file"]["error"] . "<br />";
      }
    else
      {
      echo "Upload: " . $_FILES["file"]["name"] . "<br />";
      echo "Type: " . $_FILES["file"]["type"] . "<br />";
      echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
      echo "Stored in: " . $_FILES["file"]["tmp_name"];
      }
?>

 

 

2. 文件上传时的错误代码

  值:0  表明没有错误发生,文件上传成功。

  值:1  表明上传的文件超过了 php.ini upload_max_filesize 选项限制的值。

  值:2  表明上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

  值:3  表明文件只有部分被上传。

  值:4  表明没有文件被上传。

 

3. 绕过黑名单过滤: 

  asp  asa  cdx  cer  php  aspx  ashx  jsp  php3  php.a  shtml  phtml

  或者双写后缀,大小写转换

 

4. 漏洞类型(涉及到uploadlab):

  a. 使用JavaScript拦截(客户端js验证)(pass1):

    方法一: 关闭firefox工具栏上的js功能就行。

    方法二: 把网站的前端代码复制下来,更改前端代码,使其不使用js脚本

      具体来说就是在<form>标签中添加action属性,导向目标url,然后更改静态提交按钮的属性,删掉onclick属性,不让他调用js脚本

    方法三: 上传图片马,在burpsuite中更改后缀

  

  b. 黑名单过滤(pass3、pass5、pass6、pass7)

     方法: 其他的后缀名、大小写转换、加"."或者"空格"在后缀(win)

 

  c. 白名单过滤

    方法: 其他的后缀名

  ps: 这两者可以用burpsuite先fuzz一下,看看过滤类型和内容

 

  d. 验证MIME/Content-type(pass2)

    方法: 抓包,修改content-type的内容为image/jpeg或者image/png或者image/gif

 

  e. 文件头检测绕过(pass13)

    通过检测上传的文件头来判断是否为图片

    常见的文件头:

    JPEG (jpg)        文件头:FFD8FF              
    PNG (png)        文件头:89504E47
    GIF (gif)            文件头:47494638
    TIFF (tif)           文件头:49492A00
    Windows Bitmap (bmp)  文件头:424D

    方法: 给木马添加文件头或者上传图片马(后缀非图片文件后缀),图片马的合成指令为: copy 图片路径/b + 木马路径 新的木马或者图片马路径

 

  f. iis6.0解析漏洞(pass11、12)

    当上传过滤为白名单而且服务器为iis6.0时使用该漏洞

    漏洞原理:

      (1)、以xxx.asp或者xxx.cer命名的文件夹里的文件都将会被当成ASP文件执行,属于目录解析漏洞

      (2)、xxx.php;.jpg,在;后面的不被解析,相当于截断,属于文件解析漏洞,访问时记得带上;和其后面的后缀(前提是没改文件名)。.jpg的作用在于绕过名单

     漏洞利用:

      (1)、当上传文件的路径可改时(比如burpsuite中Params内更改上传路径属性的值),创建x.asp文件夹,把图片马传上去

      (2)、传图片马,记得带上截断

  

  g. %00截断(pass11)

    原理:

      在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

      post不会像get对%00进行自动解码

    使用所需条件:

      php版本要小于5.3.4,5.3.4及以上已经修复该问题

      magic_quotes_gpc需要为OFF状态

      这两者缺一不可

    应用场景:

      直接截断文件名

      创建目录可控 %00截断创建目录 利用iis6.0解析漏洞 上传文件到这个目录里面

      截断参数 生成文件,即上传后文件被改名(增加前缀),此时更改前缀参数并截断后面内容

    使用方法:

      方法一: 在burpsuite的Hex中找到对应的地方,改成00

      方法二: 输入%00后url解码一下

 

  h. 重写漏洞(pass4)

    条件: apache开启重写模块,LoadModule rewrite_module modules/mod_rewrite.so

    使用方法: 

      apache:上传.htaccess文件,内容为:

        <FileMatch "xxx">
        SetHandler application/x-httpd-php
        </FileMatch>
        表示把名字包含xxx的文件当成php解析执行
 
      nginx: 上传.user.ini文件,内容为:    
        #define width 1337
        #define height 1337
        \x00\x00\x8a\x39\x8a\x39
        auto_prepend_file = 1.jpg
        #把当前文件夹下的所有php文件都包含这个1.jpg
        特别注意是当前文件夹下
        加入目录里面有index.php和1.jpg,则此时访问index.php,网页中就包含了木马

    

  i. 系统特性突破(绕过防火墙)

    漏洞原理: 利用PHP Windows环境的叠加特性,上传x.php:.jpg时,会生成x.php的空白文件,接着,以下符号在正则匹配时的相等性:

 

      双引号"     相当于   点号.

 

      大于符号>   相当于  问号?

 

      小于符号<   相当于   星号*

 

      文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名

 

      写入filename.<<<

 

  

  j. NTFS交换数据流(绕过防火墙)(pass8)

    漏洞原理:    

      NTFS文件系统中对备用数据流(文件流)和对支持windows系统中默认采用这种数据流::$DATA(只有win支持),如果文件名后加::$DATA会把上传的数据当作文件流去处理,不会检测后缀名,且保持::$DATA之前的文件名目的就是绕过对后缀名的检测,源代码缺少对::$DATA的过滤,抓包在后缀后面加上::$DATA即可,访问时要去除后面的::$DATA,直接访问php文件就行

    利用案例: shell.php::$DATA 创建shell.php文件并写入内容

 

  

  k. 双文件上传漏洞

    漏洞原理:

      往往对第一个文件上传进行检测而忽略第二个, 所以在第二个地方上传shell就行

  

  l. iis7.0|iis7.5|nginx解析漏洞

    漏洞原理:

      1. php.ini里cgi.fix_pathinfo=1(默认为1)

      2. 在”Handler Mapping”中取消勾选"仅当请求映射至以下内容时才调用处理程序"

    漏洞利用: xxx.jpg/.php表示将图片当成php解析

 

  m. nginx < 0.83 漏洞

    漏洞原理: %00截断

    漏洞利用: /1.jpg%00php

    

  n. 图片二次渲染(pass16)

    漏洞原理: 服务器会根据用户上传的图片重新生成图片,但其十六进制文件有部分没有改变

    漏洞利用: 上传图片,把图片下载下来进行十六进制内容对比,找出没有修改的地方,替换成木马代码.

 

<待补充>

 

文件上传的基本概念和绕过方式

上一篇:netcore 3.1 图片上传


下一篇:NetBeans8 控制台输出的中文乱码问题