题目:
这种文件上传可以先尝试一下让他报错,发现是apache的服务器,就想到.htaccess

上传了 .htaccess 和 .jpg 都没啥用,这时候应该想到后端采用了getimagesize和exif_imagetype限制
在文件上传时,有时候会用 exif_imagetype 函数判断一个图像的类型,读取一个图像的第一个字节并检查其签名,所以我们图片马的开头要加上 GIF89a,但是如果我们在. htaccess 文件中也加入 GIF89a 的话会导致. htaccess 文件无法生效,所以我们要用别的方法。
这时候有两种绕过方法:
第一种
写入XBM绕过
XBM格式:
XBM格式,也就是X BitMap,是一种基于文本的图像格式(纯文本图像格式),用于存储黑白像素(没有颜色,只有0和1表示是否填充)。它的本质是一个C语言头文件(
.h
文件),内部用代码定义了一个二维数组,描述图像的每个像素点。
由于XBM是文本格式,可以写入.htaccess文件中,可以通过这个绕过exif_imagetype()
在.htaccess开头加上:
#define width 1
#define height 1
++#define 定义常量,规定了这个图像的长和宽都是多少++
其实完整的XBM长这样:
绕过原理:
PHP的exif_imagetype() 函数通过读取文件头部的魔术字节(Magic Bytes)判断文件类型。这里XBM文件的头部是文本形式的 #define
语句,符合标准的XBM格式,因此会被识别为 IMAGETYPE_XBM
(PHP常量值为 16
)。
第二种
**WBMP文件格式,**利用
\x00\x00\x8a\x39\x8a\x39
或者
\x00\x00\x85\x85
放在开头,剩下的正常写