LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS
Βασικές πληροφορίες
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου (LFI) ακόμα κι αν δεν έχετε μια συνεδρία και η session.auto_start
είναι Off
. Εάν το session.upload_progress.enabled
είναι On
και παρέχετε το PHP_SESSION_UPLOAD_PROGRESS
στα δεδομένα multipart POST, η PHP θα ενεργοποιήσει τη συνεδρία για εσάς.
Σημείωση ότι με το PHP_SESSION_UPLOAD_PROGRESS
μπορείτε να ελέγχετε τα δεδομένα μέσα στη συνεδρία, οπότε αν συμπεριλάβετε το αρχείο της συνεδρίας σας μπορείτε να συμπεριλάβετε ένα μέρος που ελέγχετε (για παράδειγμα έναν κώδικα php shell).
Παρόλο που οι περισσότεροι οδηγοί στο Διαδίκτυο σας συνιστούν να ορίσετε το session.upload_progress.cleanup
σε Off
για λόγους αποσφαλμάτωσης. Η προεπιλεγμένη τιμή του session.upload_progress.cleanup
στο PHP είναι ακόμα On
. Αυτό σημαίνει ότι η πρόοδος της μεταφόρτωσης στη συνεδρία θα καθαρίζεται το συντομότερο δυνατόν. Έτσι αυτό θα είναι Race Condition.
Το CTF
Στο αρχικό CTF όπου σχολιάζεται αυτή η τεχνική, δεν ήταν αρκετό να εκμεταλλευτείτε την Race Condition, αλλά το φορτωμένο περιεχόμενο έπρεπε να ξεκινάει επίσης με τον χαρακτήρα @<?php
.
Λόγω της προεπιλεγμένης ρύθμισης του session.upload_progress.prefix
, το αρχείο SESSION μας θα ξεκινάει με ένα ενοχλητικό πρόθεμα upload_progress_
Όπως για παράδειγμα: upload_progress_controlledcontentbyattacker
Το κόλπο για να αφαιρέσετε το αρχικό πρόθεμα ήταν να κωδικοποιήσετε το φορτίο με base64 3 φορές και στη συνέχεια να το αποκωδικοποιήσετε μέσω των φίλτρων convert.base64-decode
, αυτό γίνεται επειδή όταν αποκωδικοποιείτε το base64, το PHP θα αφαιρέσει τους περίεργους χαρακτήρες, έτσι μετά από 3 φορές μόνο το φορτίο που στέλνεται από τον επιτιθέμενο θα παραμείνει (και έπειτα ο επιτιθέμενος μπορεί να ελέγχει το αρχικό μέρος).
Περισσότερες πληροφορίες στο αρχικό writeup 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 Ένα άλλο writeup στο https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/
Last updated