【VULNERABLITY】文件上传学习总结

  1. 1. 概述
  2. 2. 上传检测流程
  3. 3. 客户端javascript检测
  4. 4. 服务端检测绕过(MIME类型检测)
  5. 5. 服务端检测绕过(目录路劲检测)
  6. 6. 服务器端检测绕过(文件扩展名检测)
    1. 6.0.1. .htaccess文件攻击
  7. 6.1. apache解析漏洞
  8. 6.2. iis6.0解析漏洞
  9. 6.3. iis7.0/7.5解析漏洞
  10. 6.4. nginx解析漏洞
  • 7. 服务器端检测绕过(文件内容检测)
  • 总结
    1. 0.0.0.1. 轻量级检测绕过攻击
    2. 0.0.0.2. 路径/扩展名检测绕过攻击
    3. 0.0.0.3. 文件加载测试绕过
  • 概述

    这几天空下来根据上传攻击框架学习总结一下上传攻击。

    上传检测流程

    1. 客户端javascript检测(检测文件扩展名为主)
    2. 服务端MIME类型检测(检测Content-type内容)
    3. 服务端目录路劲检测(检测跟path相关的内容)
    4. 服务端文件扩展名检测(检测跟文件后缀相关的内容)
    5. 服务端文件内容检测(检测内容是否合法或含有恶意代码)

    客户端javascript检测

    通常此类检测会在js文件中有一个检测的函数,一般对上传的文件后缀名做检测,例如仅允许上传png,jpg,gif等类型的文件,如果检测到的文件后缀名不是在这些名单内,则不向服务器端传输文件内容。
    这类检测也是最容易绕过的检测,可以使用firebug之类的插件把它禁掉或者通过burp之类的代理工具进行绕过提交。
    使用burp,上传时提供一个白名单内的后缀,通过burp拦包,并修改后缀后提交

    服务端检测绕过(MIME类型检测)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    if($_FILES['userfile']['type'] != "image/gif") { //检测Content-type
    echo "Sorry, we only allow uploading GIF images";
    exit;
    }
    $uploaddir = 'uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
    } else {
    echo "File uploading failed.\n";
    }
    ?>

    上面为php后端检测MIME类型的一个例子
    通过判断$_FILES['userfile']['type'] != "image/gif"来保证上传的类型为gif类型的文件。
    绕过这一类型的检测,可以通过burp拦包,将原Content-Type类型该为符合要求的image/gif类型。

    服务端检测绕过(目录路劲检测)

    有一些web应用程序有多个文件夹用来存储图片文件,所以为了标识上传的图片是属于哪个文件夹的,上传文件时会带上文件存储路劲。而此时如果对文件目录路劲检测不够完全,可以通过截断攻击。(如%00,windows下%80-%90)
    如上传时提供存储路劲为image/20160704/可以通过修改为image/20160704/evil.php%00来达到截断目的。后端程序会将该路劲连接为image/20160704/evil.php%00filename.gif00截断导致最终存储的文件名为evil.php

    服务器端检测绕过(文件扩展名检测)

    1. 黑名单检测
      黑名单检测通常会有一个文件后缀名黑名单(例如html|htm|php|php2|php3|php4|php5…)
      但是通常黑名单检测不能包含所有的恶意脚本后缀,防护难度会比较大,推荐使用白名单
      绕过的方法:
    • 文件名大小写绕过(例如用Php,Asp等)
    • 名单列表绕过(用黑名单中未提及的文件后缀来绕过,如asa,cer等不常见的文件后缀)
    • 0x00截断(asp下可以尝试使用,asp为从后往前扫描扩展名,evil.asp%00.jpg,会被识别为jpg,只要检测方式如这种可以通过这种方式绕过)
    • 特殊文件名绕过(只适用windows,将文件名改为evil.php.或evil.php (注意这里有一个空格),在windows下,不允许这样的命名,所以会将.和空格自动去掉)
    • .htaccess文件攻击(配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测)
    .htaccess文件攻击

    如果黑名单中未包含.htaccess后缀的可以通过重写解析配置来达到解析的效果
    针对php,上传自定义.htaccess

    1
    2
    3
    <FilesMatch "haha">
    SetHandler application/x-httpd-php
    </FilesMatch>

    同目录有个我们上传一个只有文件名并包含字符串”haha”,但是却无任何扩展名的文件
    里面的内容是 php 一句话木马,通过菜刀连接可以解析php
    成因:
    在 PHP manual 中提到了下面一段话
    move_uploaded_file section, there is a warning which states ‘If the destination file already exists, it will be overwritten.’
    如果 PHP 安全没配置好
    就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的
    这样就能任意定义解析名单了

    • 解析漏洞(apache解析漏洞,iis6.0解析漏洞,nginx解析漏洞)

    apache解析漏洞

    apache是从右到左开始判断解析,如果最右的后缀无法解析,则尝试解析后一个后缀

    iis6.0解析漏洞

    • 成因为iis6.0不解析;后面的,所以提交evil.asp;.html解析为asp类型
    • 还有一个为IIS6.0的00截断攻击
    • IIS6.0双文件上传
    • 文件夹的名字包含.asp则这个文件夹下的文件都以asp的形式来解析

    iis7.0/7.5解析漏洞

    对于php有一个类似Nginx的解析漏洞evil.jpg/evil.php 解析evil.jpg中的php代码,这个漏洞成因在于php-cgi的漏洞

    nginx解析漏洞

    • 将php文件换成其他可以通过的文件后缀,访问的时候在后面加上/.php,即evil.jpg/.php,evil.jpg会解析为php的格式
    • %00截断
    • 其他方式
      提交前将filename=”evil.php”该为”evil.php”.jpg”
    1. 白名单检测
    • 0x00截断绕过
    • 解析漏洞绕过(文件名不被重写)

    服务器端检测绕过(文件内容检测)

    图像类的文件内容检测

    • 文件幻数检测(图片头格式检测)
      jpg内容头value= FF D8 FF E0 00 10 4A 46 49 46
      gif内容头value= 47 49 46 38 39 61
      png内容头value= 89 50 4E 47

    在文件头后加上一句话木马就能绕过

    • 文件相关信息检测

    图像文件相关信息检测常用的就是php的getimagesize()函数,可以通过修改图片的注释区(data区)插入一句话代码,如下:

    1
    2
    3
    4
    GIF89a
    (...some binary data for image...)
    <?php phpinfo(); ?>
    (... skipping the rest of binary data ...)

    • 文件加载检测

    调用API或函数去进行文件加载测试,常见的是图像渲染测试,二次渲染,可以通过上传恶意文件,再下载下来,diff一下找到不变的位置插入一句话木马,但成功率不高

    总结

    轻量级检测绕过攻击
    1. 绕过 javascript 对扩展名的检测
      <用 burp 之类的反向代理工具直接 POST 数据包到服务端,绕过前端检测>
    2. 绕过服务端对 http request 包 MIME 类型检测
      <用 burp 之类的反向代理工具伪造 POST 数据包到服务端,绕过 MIME 检测>
    路径/扩展名检测绕过攻击
    1. 黑名单绕过
      文件名大小写绕过
      名单列表绕过
      特殊文件名绕过
      0x00 截断绕过
      .htaccess 文件攻击
      本地包含漏洞
      Apache 解析漏洞
      IIS 解析漏洞
      Nginx 解析漏洞

    2. 白名单绕过
      0x00 截断绕过
      本地文件包含漏洞
      IIS 解析漏洞
      Nginx 解析漏洞

    3. 文件内容检测绕过攻击
    文件加载测试绕过

    <对文件进行代码注入再配合任意解析调用/漏洞>