3.0 KiB
LFI2RCE über PHP_SESSION_UPLOAD_PROGRESS
{{#include ../../banners/hacktricks-training.md}}
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.
$ 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 aufOff
zu setzen, ist die Standardeinstellung vonsession.upload_progress.cleanup
in PHP weiterhinOn
. 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/
{{#include ../../banners/hacktricks-training.md}}