LFI2RCE a través de PHP_SESSION_UPLOAD_PROGRESS

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Información Básica

Si encontraste una Local File Inclusion incluso si no tienes una sesión y session.auto_start está Desactivado. Si session.upload_progress.enabled está Activado y proporcionas el PHP_SESSION_UPLOAD_PROGRESS en datos multipart POST, PHP habilitará la sesión para ti.

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

Nota que con PHP_SESSION_UPLOAD_PROGRESS puedes controlar datos dentro de la sesión, así que si incluyes tu archivo de sesión puedes incluir una parte que controlas (un php shellcode por ejemplo).

note

Aunque la mayoría de los tutoriales en Internet te recomiendan establecer session.upload_progress.cleanup en Off para fines de depuración. El valor predeterminado de session.upload_progress.cleanup en PHP sigue siendo On. Esto significa que tu progreso de carga en la sesión se limpiará lo antes posible. Así que esto será Race Condition.

El CTF

En el CTF original donde se comenta esta técnica, no era suficiente explotar la Race Condition, sino que el contenido cargado también necesitaba comenzar con la cadena @<?php.

Debido a la configuración predeterminada de session.upload_progress.prefix, nuestro archivo de SESIÓN comenzará con un prefijo molesto upload_progress_ Tal como: upload_progress_controlledcontentbyattacker

El truco para eliminar el prefijo inicial fue base64encode el payload 3 veces y luego decodificarlo a través de los filtros convert.base64-decode, esto se debe a que cuando decodificas en base64 PHP eliminará los caracteres extraños, así que después de 3 veces solo el payload enviado por el atacante permanecerá (y luego el atacante puede controlar la parte inicial).

Más información en el escrito original https://blog.orange.tw/2018/10/ y exploit final https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Otro escrito en https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks