LFI2RCE über PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Wenn Sie eine Local File Inclusion gefunden haben, auch wenn Sie keine Sitzung haben und session.auto_start auf Aus steht. Wenn session.upload_progress.enabled auf Ein steht und Sie die PHP_SESSION_UPLOAD_PROGRESS in multipart POST-Daten bereitstellen, wird PHP die Sitzung für Sie aktivieren.

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

Beachten Sie, dass Sie mit PHP_SESSION_UPLOAD_PROGRESS Daten innerhalb der Sitzung steuern können. Wenn Sie Ihre Sitzungsdatei einfügen, können Sie einen Teil einfügen, den Sie kontrollieren (zum Beispiel einen PHP-Shellcode).

note

Obwohl die meisten Tutorials im Internet empfehlen, session.upload_progress.cleanup aus Debugging-Gründen auf Off zu setzen, ist die Standardeinstellung von session.upload_progress.cleanup in PHP weiterhin On. Das bedeutet, dass Ihr Upload-Fortschritt in der Sitzung so schnell wie möglich bereinigt wird. Dies wird also Race Condition sein.

Der CTF

Im originalen CTF, in dem diese Technik kommentiert wird, war es nicht genug, die Race Condition auszunutzen, sondern der geladene Inhalt musste auch mit der Zeichenfolge @<?php beginnen.

Aufgrund der Standardeinstellung von session.upload_progress.prefix wird unsere SESSION-Datei mit einem lästigen Präfix upload_progress_ beginnen, wie zum Beispiel: upload_progress_controlledcontentbyattacker.

Der Trick, um das anfängliche Präfix zu entfernen, bestand darin, die Payload 3 Mal base64 zu kodieren und dann über convert.base64-decode-Filter zu dekodieren. Dies liegt daran, dass PHP beim Base64-Dekodieren die seltsamen Zeichen entfernt, sodass nach 3 Mal nur die Payload, die vom Angreifer gesendet wurde, übrig bleibt (und dann kann der Angreifer den Anfangsteil kontrollieren).

Weitere Informationen im ursprünglichen Bericht https://blog.orange.tw/2018/10/ und dem endgültigen Exploit https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Ein weiterer Bericht in https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks