文件内容检测绕过
参考教程:《Upload Attack Framework V1.0》
1、文件上传检测
客户端javascript 检测(通常为检测文件扩展名)
服务端MIME 类型检测(检测Content-Type 内容)
服务端目录路径检测(检测跟path 参数相关的内容)、
服务端文件扩展名检测(检测跟文件extension 相关的内容)
服务端文件内容检测(检测内容是否合法或含有恶意代码)
服务端检测绕过(文件内容检测)
简介
如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难
也可以说它是在代码层检测的最后一道关卡
如果它被突破了,就算没有代码层的漏洞
也给后面利用应用层的解析漏洞带来了机会
我们这里主要以最常见的图像类型内容检测来举例
检测内容:
2、文件幻数检测
主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下
要绕过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、文件加载检测
简介
这个是最变态的检测了,一般是调用API 或函数去进行文件加载测试
常见的是图像渲染测试,再变态点的甚至是进行二次渲染(后面会提到)
对渲染/加载测试的攻击方式是代码注入绕过
对二次渲染的攻击方式是攻击文件加载器自身
对渲染/加载测试攻击- 代码注入绕过
可以用图像处理软件对一张图片进行代码注入
用winhex 看数据可以分析出这类工具的原理是
在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区
对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的
但如果碰到变态的二次渲染
基本上就没法绕过了,估计就只能对文件加载器进行攻击了
下面将来介绍二次渲染
比如上传文件前,文件的数据如下
然后上传这个 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 溢出
总之对文件完整性检测的绕过,通常就直接用个结构完整的文件进行代码注入即可
没必要再去测到底是检查的幻数还是文件头结构之类的了
原作者这个思路我貌似没有看到过,有哪位师傅尝试成功了请告诉小弟
这里分享一个二次渲染绕过的办法
https://blog.csdn.net/qq_40800734/article/details/105920149
还有个文件加密绕过
https://cloud.tencent.com/developer/article/1668787
来源:https://blog.csdn.net/Kevinhanser/article/details/81613003?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control