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

38 lines
2.9 KiB
Markdown

# LFI2RCE za pomocą PHP_SESSION_UPLOAD_PROGRESS
{{#include ../../banners/hacktricks-training.md}}
## Podstawowe informacje
Jeśli znalazłeś **Local File Inclusion**, nawet jeśli **nie masz sesji** i `session.auto_start` jest `Wyłączone`. Jeśli **`session.upload_progress.enabled`** jest **`Włączone`** i dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w **danych POST w formacie multipart**, PHP **włączy sesję dla Ciebie**.
```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
```
Zauważ, że z **`PHP_SESSION_UPLOAD_PROGRESS`** możesz **kontrolować dane wewnątrz sesji**, więc jeśli dołączysz swój plik sesji, możesz dołączyć część, którą kontrolujesz (na przykład kod powłoki PHP).
> [!NOTE]
> Chociaż większość samouczków w Internecie zaleca ustawienie `session.upload_progress.cleanup` na `Off` w celach debugowania, domyślne ustawienie `session.upload_progress.cleanup` w PHP wciąż wynosi `On`. Oznacza to, że postęp przesyłania w sesji będzie czyszczony tak szybko, jak to możliwe. Tak więc będzie to **Race Condition**.
### CTF
W [**oryginalnym CTF**](https://blog.orange.tw/2018/10/), w którym ta technika jest komentowana, nie wystarczyło wykorzystać Race Condition, ale zawartość ładowana musiała również zaczynać się od ciągu `@<?php`.
Z powodu domyślnego ustawienia `session.upload_progress.prefix`, nasz **plik SESJI zacznie się od irytującego prefiksu** `upload_progress_`, takiego jak: `upload_progress_controlledcontentbyattacker`.
Sztuczka, aby **usunąć początkowy prefiks**, polegała na **zakodowaniu ładunku w base64 3 razy** i następnie dekodowaniu go za pomocą filtrów `convert.base64-decode`, ponieważ podczas **dekodowania base64 PHP usunie dziwne znaki**, więc po 3 razach **tylko** **ładunek** **wysłany** przez atakującego **pozostanie** (a następnie atakujący może kontrolować początkową część).
Więcej informacji w oryginalnym opisie [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) oraz końcowym exploicie [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)\
Inny opis w [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}}