Artio
- 关注

1、漏洞介绍
ImageMagick 是一款免费软件,以随时可用的二进制分发版或源代码形式提供,您可以在开放和专有应用程序中使用、复制、修改和分发。可以使用ImageMagick®创建、编辑、合成或转换数字图像。它可以读取和写入多种格式(超过 200 种)的图像。
远程攻击者可通过制作恶意的PNG文件并上传至受影响的使用ImageMagick 解析图片的网站来利用这个漏洞,当网站或应用使用 ImageMagick 对恶意的 PNG 文件进行解析时将触发这两个漏洞,从而造成敏感信息泄露或拒绝服务。
2、漏洞复现
使用vulhub启动环境
使用命令生成恶意图片poc
./poc.py generate -o poc.png -r /etc/passwd
上传恶意图片
使用命令读取解析后的图片
./poc.py parse -i 63e0d0cc354ef.png
复现这块就不多说了
3、漏洞分析
分析漏洞之前我们先来了解下PNG图片的格式。
PNG图片是由PNG文件头和多个数据块(chunk)组成:
文件头,固定8字节长度,0x89504E470D0A1A0A
数据块,存在多个,每个数据块有下面这四部分组成:
整个数据块的长度(Length),4字节的uint32类型
数据块类型(Chunk Type Code),4字节的字符串类型,由英文字母组成
数据(Chunk Data),数据库中保存的实际数据
校验码(CRC)
常见的四种类型的数据块:
文件头数据块(IHDR),其中包含图片信息,作为第一个数据块,有且仅有一个
调色板数据块(PLTE)
图像数据块(IDAT),存储实际的图片数据,可以有多个
图像结束数据(IEND),作为最后一个数据块,表示PNG数据流结束
除了上述4种常见的数据块以外,还有一些不常见的数据块,我们这次的漏洞就出现在tEXt这个数据块中。tEXt数据块并没有规定具体作用,只说可以用于保存未压缩的图片属性,其格式是key\0value
,这个key是属性的名字,value是属性的值,中间由\0字符分隔。
可以看到我们复现过程中profile和文件名之间存在00字符:
在2017年发布的PNG 1.2 Specification, Version 1.5.0中,PNG图片格式新增了一个eXIf数据块,专门用于保存图片的Exif数据;而在此之前,PNG标准规范中也没有规定Exif数据要保存在哪,于是ImageMagick就将Exif数据保存在tEXt数据块中。
这次出现问题的就是tEXt数据块中属性名是profile的属性。
接下来来看看代码:
上传图像以触发ImageMagick命令
读取tEXt数据块
判断property变量是否等于profile
将profile的值的字符串复制为文件名,并保存
FileToStringInfo函数将读取文件内容并将内容保存到string_info->datum
读取文件后文件内容被FileToStringInfo读取并返回,然后调用SetImageProperty函数将之前读取的文件内容二进制储存到新生成的图片中
下载图片并读取图片则可以看到读取的文件内容。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)