这里有新鲜出炉的精品教程,程序狗速度看过来!
ImageMagick 是一个功能强大的开源图形处理软件, 可以用来读、写和处理超过 90 种的图片文件, 包括流行的 JPEG、GIF、 PNG、PDF 以及 PhotoCD 等格式。接下来通过本文给大家浅析 ImageMagick 命令执行漏洞的知识,一起看看吧
00 前言
什么是 ImageMagick?
ImageMagick 是一个功能强大的开源图形处理软件, 可以用来读、写和处理超过 90 种的图片文件, 包括流行的 JPEG、GIF、 PNG、PDF 以及 PhotoCD 等格式。使用它可以对图片进行切割、旋转、组合等多种特效的处理。
由于其功能强大、性能较好, 并且对很多语言都有拓展支持, 所以在程序开发中被广泛使用。许多网站开发者喜爱使用 ImageMagick 拓展来做 web 上的图片处理工作, 比如用户头像生成、图片编辑等。
01 漏洞描述
ImageMagick 是一款开源图片处理库,支持 PHP、Ruby、NodeJS 和 Python 等多种语言,使用非常广泛。包括 PHP imagick、Ruby rmagick 和 paperclip 以及 NodeJS imagemagick 等多个图片处理插件都依赖它运行。当攻击者构造含有恶意代码得图片时,ImageMagick 库对于 HTTPPS 文件处理不当,没有做任何过滤,可远程实现远程命令执行,进而可能控制服务器。
02 影响程度
攻击成本:低
危害程度:高
影响范围:ImageMagick 6.9.3-9 以前的所有版本
03 漏洞分析
命令执行漏洞是出在 ImageMagick 对 https 形式的文件处理的过程中。
ImageMagick 之所以支持那么多的文件格式, 是因为它内置了非常多的图像处理库, 对于这些图像处理库, ImageMagick 给它起了个名字叫做 "Delegate"(委托), 每个 Delegate 对应一种格式的文件, 然后通过系统的 system() 命令来调用外部的 lib 进行处理。调用外部 lib 的过程是使用系统的 system 命令来执行的,导致命令执行的代码。
ImageMagick 委托的默认配置文件: /etc/ImageMagick/delegates.xml
具体代码请参考:Github-ImageMagick
我们定位到 https 委托得那一行:
- " <delegate decode=\"https\" command=\""wget " -q -O " % o " "https: %M "\"/>"
可以看到,command 定义了它对于 https 文件处理时带入 system() 函数得命令:"wget"-q -O"%o""https:%M"。
wget 是从网络下载文件得命令,%M 是一个占位符,它得具体定义在配置文件中如下:
- % i input image filename % o output image filename % u unique temporary filename % Z unique temporary filename % #input image signature % b image file size % c input image comment % g image geometry % h image rows(height) % k input image number colors % l image label % m input image format % p page number % q input image depth % s scene number % w image columns(width) % x input image x resolution % y input image y resolution
可以看到 %m 被定义为输入的图片格式, 也就是我们输入的 url 地址。但是由于只是做了简单的字符串拼接, 没有做任何过滤,直接拼接到 command 命令中,所以我们可以将引号闭合后通过 "|","`","&" 等带入其他命令, 也就形成了命令注入。
比如我们传入如下代码:
- https: //test.com"|ls "-al
则实际得 system 函数执行得命令为:
- "wget" - q - O" % o""https: //test.com"|ls "-al"
这样,ls -al 命令成功执行。
04 漏洞利用
这个漏洞得 poc 由老外给出得,如下:
- push graphic - context viewbox 0 0 640 480 fill 'url(https://"|id; ")'pop graphic - context
push 和 pop 是用于堆栈的操作,一个进栈,一个出栈;
viewbox 是表示 SVG 可见区域的大小,或者可以想象成舞台大小,画布大小。简单理解就是根据后面得参数选取其中得一部分画面;
fill url() 是把图片填充到当前元素内;
在其中我们使用了 fill url() 的形式调用存在漏洞的 https delegate, 当 ImageMagick 去处理这个文件时, 漏洞就会被触发。
附:ImageMagick 默认支持一种图片格式,叫 mvg,而 mvg 与 svg 格式类似,其中是以文本形式写入矢量图的内容,允许在其中加载 ImageMagick 中其他的 delegate(比如存在漏洞的 https delegate)。并且在图形处理的过程中, ImageMagick 会自动根据其内容进行处理, 也就是说我们可以将文件随意定义为 png、jpg 等网站上传允许的格式, 这大大增加了漏洞的可利用场景。
利用过程:
创建一个 exploit.png 文件,包含以下内容:
- push graphic - context viewbox 0 0 640 480 fill 'url(https://test.com/image.jpg"|ls "-al)'pop graphic - context
执行命令:convert exploit.png 1.png(后面的是 convert 的参数)
05 漏洞修复
升级到最新版本
配置 / etc/ImageMagick/policy.xml 的方式来禁止 https、mvg 这些 delegate, 或者直接在配置文件删除相应的 delegate
- <policymap>
- <policy domain="coder" rights="none" pattern="EPHEMERAL" />
- <policy domain="coder" rights="none" pattern="URL" />
- <policy domain="coder" rights="none" pattern="HTTPS" />
- <policy domain="coder" rights="none" pattern="MVG" />
- <policy domain="coder" rights="none" pattern="MSL" />
- </policymap>
以上所述是小编给大家介绍的 ImageMagick 命令执行漏洞的知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 phperz 网站的支持!
来源: http://www.phperz.com/article/17/0723/301469.html