hacktricks/src/pentesting-web/file-inclusion/via-php_session_upload_progress.md

38 lines
3.0 KiB
Markdown

# 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**.
```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**](https://blog.orange.tw/2018/10/), 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/](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](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/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
{{#include ../../banners/hacktricks-training.md}}