LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

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 An steht und Sie die PHP_SESSION_UPLOAD_PROGRESS in den 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 kontrollieren können. Wenn Sie Ihre Sitzungsdatei einbinden, können Sie einen von Ihnen kontrollierten Teil einfügen (zum Beispiel einen PHP-Shellcode).

Obwohl die meisten Tutorials im Internet empfehlen, session.upload_progress.cleanup für Debugging-Zwecke auf Off zu setzen, ist das Standardverhalten von session.upload_progress.cleanup in PHP immer noch On. Das bedeutet, dass Ihr Upload-Fortschritt in der Sitzung so schnell wie möglich bereinigt wird. Dies führt zu einem Race Condition.

Das CTF

Im ursprünglichen CTF, in dem diese Technik kommentiert wurde, reichte es nicht aus, den 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 z.B.: upload_progress_controlledcontentbyattacker

Der Trick, um das anfängliche Präfix zu entfernen, bestand darin, das Nutzlast 3 Mal in Base64 zu codieren und dann über die Filter convert.base64-decode zu decodieren. Dies liegt daran, dass beim Base64-Decodieren PHP die seltsamen Zeichen entfernen wird, sodass nach 3 Mal nur die vom Angreifer gesendete Nutzlast übrig bleibt (und dann kann der Angreifer den anfänglichen Teil kontrollieren).

Weitere Informationen im ursprünglichen Write-up https://blog.orange.tw/2018/10/ und im 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 weiteres Write-up unter https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

Unterstützen Sie HackTricks

Last updated