freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

ImageMagick 任意文件读取漏洞(CVE-2022-44268)浅析
2023-03-03 10:04:36
所属地 北京

1、漏洞介绍

ImageMagick 是一款免费软件,以随时可用的二进制分发版或源代码形式提供,您可以在开放和专有应用程序中使用、复制、修改和分发。可以使用ImageMagick®创建、编辑、合成或转换数字图像。它可以读取和写入多种格式(超过 200 种)的图像。

远程攻击者可通过制作恶意的PNG文件并上传至受影响的使用ImageMagick 解析图片的网站来利用这个漏洞,当网站或应用使用 ImageMagick 对恶意的 PNG 文件进行解析时将触发这两个漏洞,从而造成敏感信息泄露或拒绝服务。

2、漏洞复现

使用vulhub启动环境

使用命令生成恶意图片poc

./poc.py generate -o poc.png -r /etc/passwd

上传恶意图片

image

使用命令读取解析后的图片

./poc.py parse -i 63e0d0cc354ef.png

image

复现这块就不多说了

3、漏洞分析

分析漏洞之前我们先来了解下PNG图片的格式。

PNG图片是由PNG文件头和多个数据块(chunk)组成:

  • 文件头,固定8字节长度,0x89504E470D0A1A0A

  • 数据块,存在多个,每个数据块有下面这四部分组成:

    1. 整个数据块的长度(Length),4字节的uint32类型

    2. 数据块类型(Chunk Type Code),4字节的字符串类型,由英文字母组成

    3. 数据(Chunk Data),数据库中保存的实际数据

    4. 校验码(CRC)

常见的四种类型的数据块:

  • 文件头数据块(IHDR),其中包含图片信息,作为第一个数据块,有且仅有一个

  • 调色板数据块(PLTE)

  • 图像数据块(IDAT),存储实际的图片数据,可以有多个

  • 图像结束数据(IEND),作为最后一个数据块,表示PNG数据流结束

除了上述4种常见的数据块以外,还有一些不常见的数据块,我们这次的漏洞就出现在tEXt这个数据块中。tEXt数据块并没有规定具体作用,只说可以用于保存未压缩的图片属性,其格式是key\0value,这个key是属性的名字,value是属性的值,中间由\0字符分隔。

可以看到我们复现过程中profile和文件名之间存在00字符:

image

在2017年发布的PNG 1.2 Specification, Version 1.5.0中,PNG图片格式新增了一个eXIf数据块,专门用于保存图片的Exif数据;而在此之前,PNG标准规范中也没有规定Exif数据要保存在哪,于是ImageMagick就将Exif数据保存在tEXt数据块中。

这次出现问题的就是tEXt数据块中属性名是profile的属性。

接下来来看看代码:

上传图像以触发ImageMagick命令

image

读取tEXt数据块

image

image

判断property变量是否等于profile

image

将profile的值的字符串复制为文件名,并保存

image

FileToStringInfo函数将读取文件内容并将内容保存到string_info->datum

image

读取文件后文件内容被FileToStringInfo读取并返回,然后调用SetImageProperty函数将之前读取的文件内容二进制储存到新生成的图片中

image

下载图片并读取图片则可以看到读取的文件内容。

# 漏洞 # web安全 # 漏洞分析
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录