mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
38 lines
3.0 KiB
Markdown
38 lines
3.0 KiB
Markdown
# LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Informations de base
|
|
|
|
Si vous avez trouvé une **inclusion de fichier local** même si vous **n'avez pas de session** et que `session.auto_start` est `Off`. Si **`session.upload_progress.enabled`** est **`On`** et que vous fournissez le **`PHP_SESSION_UPLOAD_PROGRESS`** dans les données **POST multipart**, PHP **activera la session pour vous**.
|
|
```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
|
|
```
|
|
Notez qu'avec **`PHP_SESSION_UPLOAD_PROGRESS`** vous pouvez **contrôler les données à l'intérieur de la session**, donc si vous incluez votre fichier de session, vous pouvez inclure une partie que vous contrôlez (un shellcode php par exemple).
|
|
|
|
> [!NOTE]
|
|
> Bien que la plupart des tutoriels sur Internet vous recommandent de définir `session.upload_progress.cleanup` sur `Off` à des fins de débogage. La valeur par défaut de `session.upload_progress.cleanup` dans PHP est toujours `On`. Cela signifie que votre progression de téléchargement dans la session sera nettoyée dès que possible. Donc, cela sera **Race Condition**.
|
|
|
|
### Le CTF
|
|
|
|
Dans le [**CTF original**](https://blog.orange.tw/2018/10/) où cette technique est commentée, il n'était pas suffisant d'exploiter la Race Condition, mais le contenu chargé devait également commencer par la chaîne `@<?php`.
|
|
|
|
En raison du paramètre par défaut de `session.upload_progress.prefix`, notre **fichier de SESSION commencera par un préfixe ennuyeux** `upload_progress_` tel que : `upload_progress_controlledcontentbyattacker`
|
|
|
|
Le truc pour **supprimer le préfixe initial** était de **base64encoder la charge utile 3 fois** puis de la décoder via les filtres `convert.base64-decode`, c'est parce que lorsque **le décodage base64 PHP supprimera les caractères étranges**, donc après 3 fois **seulement** la **charge utile** **envoyée** par l'attaquant **restera** (et ensuite l'attaquant peut contrôler la partie initiale).
|
|
|
|
Plus d'informations dans l'écriture originale [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) et l'exploit final [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)\
|
|
Une autre écriture dans [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}}
|