LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

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 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/ 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
Une autre écriture dans https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks