深入浅析ImageMagick命令执行漏洞


Posted in Python onOctober 11, 2016

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的参数)

深入浅析ImageMagick命令执行漏洞

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 相关文章推荐
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python 文件处理注意事项总结
Apr 10 Python
安装Python的教程-Windows
Jul 22 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
python3.6实现学生信息管理系统
Feb 21 Python
在python中用url_for构造URL的方法
Jul 25 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
简述 Python 的类和对象
Aug 21 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
Zabbix实现微信报警功能
Oct 09 #Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 #Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 #Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 #Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 #Python
python连接mysql实例分享
Oct 09 #Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
Oct 08 #Python
You might like
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
python批量爬取下载抖音视频
2019/06/17 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
如何理解python对象
2020/06/21 Python
简单了解如何封装自己的Python包
2020/07/08 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
毕业生精彩的自我评价分享
2013/10/06 职场文书
迟到检讨书1000字
2014/01/15 职场文书
战友聚会邀请函
2014/01/18 职场文书
列车长先进事迹材料
2014/01/25 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
离婚协议书范文2015
2015/01/26 职场文书
素质教育培训心得体会
2016/01/19 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
MySQL Server 层四个日志
2022/03/31 MySQL
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android