LFI2RCE μέσω PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 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

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

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

bash
$ 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 shellcode για παράδειγμα).

note

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

Το CTF

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

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

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

Περισσότερες πληροφορίες στην αρχική ανάρτηση https://blog.orange.tw/2018/10/ και τελική εκμετάλλευση 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/

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