文件上传 05 服务端检测绕过(文件内容检测)

本文记录文件上传学习过程,教程为 《Upload Attack Framework V1.0》

文件上传检测

  1. 客户端javascript 检测(通常为检测文件扩展名)
  2. 服务端MIME 类型检测(检测Content-Type 内容)
  3. 服务端目录路径检测(检测跟path 参数相关的内容)、
  4. 服务端文件扩展名检测(检测跟文件extension 相关的内容)
  5. 服务端文件内容检测(检测内容是否合法或含有恶意代码)

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

  1. 简介

    如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难

    也可以说它是在代码层检测的最后一道关卡

    如果它被突破了,就算没有代码层的漏洞

    也给后面利用应用层的解析漏洞带来了机会

    我们这里主要以最常见的图像类型内容检测来举例

    检测内容:

  2. 文件幻数检测

    主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下

    扫描二维码关注公众号,回复: 2736034 查看本文章

    要绕过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

    然后在文件幻数后面加上自己的一句话木马代码就行了

  3. 文件相关信息检测

    图像文件相关信息检测常用的就是getimagesize()函数

    只需要把文件头部分伪造好就ok 了,就是在幻数的基础上还加了一些文件信息

    有点像下面的结构

    GIF89a
    (...some binary data for image...)
    <?php phpinfo(); ?>
    (... skipping the rest of binary data ...)
    
  4. 文件加载检测

    1. 简介

      这个是最变态的检测了,一般是调用API 或函数去进行文件加载测试

      常见的是图像渲染测试,再变态点的甚至是进行二次渲染(后面会提到)

      对渲染/加载测试的攻击方式是代码注入绕过

      对二次渲染的攻击方式是攻击文件加载器自身

  5. 对渲染/加载测试攻击- 代码注入绕过

    可以用图像处理软件对一张图片进行代码注入

    用winhex 看数据可以分析出这类工具的原理是

    在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区

    对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的

    但如果碰到变态的二次渲染

    基本上就没法绕过了,估计就只能对文件加载器进行攻击了

  6. 下面将来介绍二次渲染

    比如上传文件前,文件的数据如下

    然后上传这个 jpg 但把它重新下载回本地发现了奇怪的地方

    我们的php 一句话木马不见了

    可以看出上传后,图片被二次渲染过

    新的JPG 图片内容里含有这个

    CREATOR: gd-jpeg v1.0 (using IJG JPEG v62)

    可以看出是调用的GD php 的gd 库

    测试了gif 文件也一样

    原文件内容是(虽然文件名是2.jpg,实际文件格式是 gif)

    上传后下载回来对比

    可以发现文件被重新渲染过

    一句话代码也不见了

    然后是进行 fuzzing 触发报错看下是被用什么 API 或函数进行的二次渲染

    上传文件数据不完整的gif 文件

    触发报错后,知道后台用的是 imagecreatefromgif() 这个函数

    上传文件数据不完整的 png 文件

    触发报错后,知道后台用的是 imagecreatefrompng()这个函数

    某后台调用GD 库对图像进行二次渲染的代码

    function image_gd_open($file, $extension)
    {
    $extension = str_replace('jpg', 'jpeg', $extension);
    $open_func = 'imageCreateFrom'. $extension; //函数名变成imageCreateFrompng 之类
    if (!function_exists($open_func))
    {
    return FALSE;
    }
    return $open_func($file); //变成imagecreatefrompng('/tmp/php0lbTOn')
    }
    

    一般进行遇到二次渲染,想绕过,就目前个人经验还没想出方法

    它相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染

    在这个过程中非图像数据的部分直接就被隔离开了

    能想到的一个思路就是基于数据二义性,即让数据既是图像数据也包含一句话木马代码

    就像shellcode 通过数据二义性绕过IDS 检测特殊字符一样的道理

    但现在我还不知道怎么构造出这样的图像文件

    如果要对文件加载器进行攻击,常见的就是溢出攻击

    上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试

    加载测试时被溢出攻击执行shellcode

    比如access/mdb 溢出,大家可以参考下http://lcx.cc/?FoxNews=1542.html

    总之对文件完整性检测的绕过,通常就直接用个结构完整的文件进行代码注入即可

    没必要再去测到底是检查的幻数还是文件头结构之类的了

猜你喜欢

转载自blog.csdn.net/Kevinhanser/article/details/81613003