[HarekazeCTF2019]Avatar Uploader
打开页面,提示是上传,我们先登录看看,我们用admin账号登录
提示我们上传png图片,并且要求少于256kb且尺寸小于256px*256px
我们尝试上传图片
上传成功后,我们得到回显
然后就不会了,我们翻了一下wp,发现这道题有源码
题目源码:avatar_uploader_1
我们查看upload.php的源码
1 | <?php |
然后就是审计代码了
在检查文件类型时,finfo_file()
函数检测上传图片的类型是否是image/png
,在检查文件长宽时,getimagesize()
函数用于获取图像大小及相关信息,成功将返回一个数组,但其后面还有:
1 | if ($size[2] !== IMAGETYPE_PNG) { |
索引2
不是png,将输出part 1
的flag
对于getimagesize()
函数返回的数组:
1 | Array |
结果解释:
- 索引 0 给出的是图像宽度的像素值
- 索引 1 给出的是图像高度的像素值
- 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
- 索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的
标签 - 索引 bits 给出的是图像的每种颜色的位数,二进制格式
- 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
- 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:header(“Content-type: image/jpeg”);
为了得到flag,我们需要绕过finfo_file()
或函数getimagesize()
的验证
函数finfo_file()
其主要是识别PNG文件十六进制下的第一行信息,若保留文件头信息,破坏掉文件长宽等其余信息,也就可以绕过getimagesize()
函数的检验
使用010将图片其余数据删掉,只保留文件头:
上传后,得到flag