LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Υποστηρίξτε το HackTricks

Βασικές Πληροφορίες

Αν βρήκατε μια Ενσωμάτωση Τοπικού Αρχείου (LFI) ακόμα κι αν δεν έχετε μια συνεδρία και το session.auto_start είναι Off. Αν το session.upload_progress.enabled είναι On και παρέχετε το PHP_SESSION_UPLOAD_PROGRESS στα δεδομένα POST multipart, το PHP θα ενεργοποιήσει τη συνεδρία για εσάς.

$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -d 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -F 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'  -F 'file=@/etc/passwd'
$ ls -a /var/lib/php/sessions/
. .. sess_iamorange

In the last example the session will contain the string blahblahblah

Σημειώστε ότι με το PHP_SESSION_UPLOAD_PROGRESS μπορείτε να ελέγξετε τα δεδομένα μέσα στη συνεδρία, οπότε αν συμπεριλάβετε το αρχείο συνεδρίας σας μπορείτε να συμπεριλάβετε ένα τμήμα που ελέγχετε (έναν κωδικό κέλυφους php για παράδειγμα).

Αν και τα περισσότερα εγχειρίδια στο Διαδίκτυο σας συνιστούν να ορίσετε το session.upload_progress.cleanup σε Off για σκοπούς εντοπισμού σφαλμάτων. Η προεπιλεγμένη τιμή του session.upload_progress.cleanup στο PHP παραμένει On. Αυτό σημαίνει ότι το πρόοδος μεταφόρτωσης στη συνεδρία θα καθαριστεί το συντομότερο δυνατό. Έτσι αυτό θα είναι Συνθήκη Αγώνα.

Το CTF

Στο πρωτότυπο CTF όπου σχολιάζεται αυτή η τεχνική, δεν ήταν αρκετό να εκμεταλλευτείτε τη Συνθήκη Αγώνα, αλλά το περιεχόμενο που φορτώθηκε έπρεπε επίσης να ξεκινήσει με τη συμβολοσειρά @<?php.

Λόγω της προεπιλεγμένης ρύθμισης του session.upload_progress.prefix, το αρχείο ΣΥΝΕΔΡΙΑΣ θα ξεκινήσει με ένα ενοχλητικό πρόθεμα upload_progress_ Όπως: upload_progress_controlledcontentbyattacker

Το κόλπο για αφαίρεση του αρχικού προθέματος ήταν να κωδικοποιήσετε το φορτίο με base64 τρεις φορές και στη συνέχεια να το αποκωδικοποιήσετε μέσω φίλτρων convert.base64-decode, αυτό γίνεται επειδή όταν αποκωδικοποιείτε το base64 το PHP θα αφαιρέσει τους περίεργους χαρακτήρες, έτσι μετά από τρεις φορές μόνο το φορτίο που στέλνεται από τον επιτιθέμενο θα παραμείνει (και στη συνέχεια ο επιτιθέμενος μπορεί να ελέγξει το αρχικό τμήμα).

Περισσότερες πληροφορίες στο πρωτότυπο άρθρο https://blog.orange.tw/2018/10/ και το τελικό exploit https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py Άλλο άρθρο στο https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

Υποστηρίξτε το HackTricks

Last updated