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命令执行漏洞的知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍深入浅析Python 命令行模块 Click,包括了深入浅析Python 命令行模块 Click的使用技巧和注意事项,需要的朋友参考一下 Click 是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 url
本文向大家介绍深入浅析javascript立即执行函数,包括了深入浅析javascript立即执行函数的使用技巧和注意事项,需要的朋友参考一下 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花; 当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解。 JavaScript 函数语法 函数就是包裹在花括号中的代
我正在尝试使用Java ProcessBuilder获得以下ImageMagick命令: 文件路径(源映像、掩码映像和目标映像)是可配置的。如果我在PowerShell或Windwos Cmd中输入命令,它将按预期工作。当我试图通过Java ProcessBuilder执行相同的命令时,它失败了。 这是我最后的代码: 这是来自流程构建器的ourput: 似乎这些命令的解释方式不正确 我尝试过以下几
本文向大家介绍深入浅出ES6之let和const命令,包括了深入浅出ES6之let和const命令的使用技巧和注意事项,需要的朋友参考一下 let和const声明的变量只在代码块内有效 不存在变量提升 变量一定要在声明后使用,否则报错 不允许重复声明 块级作用域 const命令 声明一个只读的常量,一旦声明,常量的值就不能改变 一旦声明变量,就必须立即初始化,不能留到以后赋值 let命令、cons
本文向大家介绍IIS 7.5 解析错误 命令执行漏洞解决方案,包括了IIS 7.5 解析错误 命令执行漏洞解决方案的使用技巧和注意事项,需要的朋友参考一下 一、漏洞介绍 漏洞影响 IIS7 及IIS7.5 在使FastCGI方式调用php时,在php.ini里设置 cgi.fix_pathinfo=1 使得访问任意文件URL时,在URL后面添加“/x.php”等字符时,该文件被iis当php文件代
本文向大家介绍ThinkPHP 5.x远程命令执行漏洞复现,包括了ThinkPHP 5.x远程命令执行漏洞复现的使用技巧和注意事项,需要的朋友参考一下 一、漏洞描述 2018年12月10日,ThinkPHP官方发布了安全更新,其中修复了ThinkPHP5框架的一个高危漏洞: https://blog.thinkphp.cn/869075 漏洞的原因是由于框架对控制器名没有进行足够的检测,导致在没