php imagemagick 漏洞,ImageMagick命令执行漏洞分析

83872

关于ImageMagick

ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以对图片进行切割、旋转、组合等多种特效的处理。

由于其功能强大、性能较好,并且对很多语言都有拓展支持,所以在程序开发中被广泛使用。许多网站开发者喜爱使用ImageMagick拓展来做web上的图片处理工作,比如用户头像生成、图片编辑等。

更多的拓展支持:

猪队友之ImageMagick

ImageMagick这次被曝出的漏洞应该算是一个本地的命令执行漏洞,危害不是太大,但是由于大量的web程序都使用了他的拓展,导致这些本地命令执行漏洞在web的环境里可以被远程触发,变成了危害巨大的远程命令执行。真的是名副其实的“猪队友”了。

命令执行漏洞是出在ImageMagick对https形式的文件处理的过程中。

ImageMagick之所以支持那么多的文件格式,是因为他内置了非常多的图像处理库,对于这些图像处理库,ImageMagick给他起了个名字叫做“Delegate”(委托),每个Delegate对应一种格式的文件,然后通过系统的system()命令来调用外部的程序对文件进行处理。

其默认的配置文件在源码的config/delegates.xml.in中,一般使用者很少会去修改这个配置文件。

具体的内容如下:

对于https形式的文件,他是这样处理的:

83872

command定义了他具体带入system()执行的命令:"wget" -q -O "%o" "https:%M"。

%M是占位符,在配置文件中有对占位符的定义:

83872

%m被定义为输入的图片格式,也就是我们输入的url地址。但是由于只是做了简单的字符串拼接,所以我们可以将引号闭合后通过管道符带入其他命令,也就形成了命令注入。

比如url为:https://example.com"|ls "-la

那实际命令就变成了:

"wget" -q -O "%o" " https://example.com"|ls "-la"

ls –la被执行了。

如图所示:

83872

危险升级

让漏洞危害进一步加大的是,ImageMagick支持通过.svg、.mvg(ImageMagick自定义的一种类似svg的格式)这种类型的文件来进行图形绘制,并允许在其中加载其他的delegate(比如存在漏洞的https delegate)。并且在图形处理的过程中,ImageMagick会自动根据其内容进行处理,也就是说我们可以将文件随意定义为png、jpg等网站上传允许的格式,这大大增加了漏洞的可利用场景。

比如我们生成一个exploit.png的文件,内容为:

push graphic-context

viewbox 0 0 640 480

fill 'url(https://example.com/image.jpg"|ls "-la)'

pop graphic-context

在其中我们使用了fill url()的形式调用存在漏洞的https delegate,当ImageMagick去处理这个文件时,漏洞就会被触发。

83872

影响范围

由于大量的web应用采用了ImageMagick做图片处理,所以这次漏洞的影响范围还是非常广泛的。目前已知PHP、java的ImageMagick扩展都在受影响之列,还有更多的拓展比如python、ruby、C#没有人去研究,所以我相信这个漏洞还会有更大的影响范围和利用场景。

在开源软件里,wordpress最早被爆出受到漏洞影响,由于其使用了PHP扩展ImageMagick处理图片,所以当攻击者拥有一定的权限(编辑权限即可),就可以通过后台的图像处理功能触发远程命令执行。

详细分析参考ricter的博客:

除了php,乌云社区还有人爆出java拓展一样受到影响:

还可以利用这个漏洞bypass php disable function,这个利用场景真的很巧妙,和以前利用bash的漏洞通过mail函数bypass有异曲同工之妙。

当然我觉得存在问题的肯定不止这一家。

更多因为猪队友躺枪的还有众多使用了ImageMagick做图片处理的互联网厂商,我就不一一列举了,感兴趣的可以关注补天、乌云等漏洞平台。我们后续也会跟进一些开源程序的受影响情况。

漏洞修复

这个漏洞在4月30日被报告给了ImageMagick官方,官网当天便发布了一个新版本6.9.3-9修复这个问题,我们看一下官方是如何修复这个漏洞的。

83872

将%M变为了%F,其实也就是通过filter过滤了一遍,通过白名单限制了允许传入的字符串:

那么在白名单里的有哪些字符呢:

83872

图中的whitelist也就是白名单里的字符串,是的,你没有看错,单引号、双引号、反引号、转义符这些危险字符依然被允许传入。

在逗我吗…?

83872

随后有人指出其修复方法可被绕过,ImageMagick于是在5月3日又发布了6.9.3-10版本,更改了允许传入字符的白名单。

83872

所以目前将ImageMagick升级至6.9.3-10版本可修复此安全漏洞,同时官方还建议用户,如果不需要这些功能,可以通过配置policy.xml的方式来禁止https、mvg这些delegate,或者直接在配置文件删除相应的delegate。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值