mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
38 lines
2.9 KiB
Markdown
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}}
|