hacktricks/pentesting-web/file-inclusion/via-php_session_upload_progress.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

6.1 KiB

LFI2RCE a través de PHP_SESSION_UPLOAD_PROGRESS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Información básica

Si encontraste una Inclusión de Archivos Locales incluso si no tienes una sesión y session.auto_start está Off. Si session.upload_progress.enabled está On y proporcionas PHP_SESSION_UPLOAD_PROGRESS en los datos multipart POST, PHP habilitará la sesión para ti.

$ 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

Ten en cuenta que con PHP_SESSION_UPLOAD_PROGRESS puedes controlar los datos dentro de la sesión, por lo que si incluyes tu archivo de sesión, puedes incluir una parte que controles (como un shellcode de PHP, por ejemplo).

{% hint style="info" %} Aunque la mayoría de los tutoriales en Internet recomiendan establecer session.upload_progress.cleanup en Off con fines de depuración, la configuración predeterminada 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. Por lo tanto, esto será una condición de carrera. {% endhint %}

El CTF

En el CTF original donde se comenta esta técnica, no fue suficiente explotar la condición de carrera, 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_. Por ejemplo: upload_progress_controlledcontentbyattacker

El truco para eliminar el prefijo inicial fue codificar en base64 la carga útil 3 veces y luego decodificarla mediante filtros convert.base64-decode, esto se debe a que cuando decodificas en base64, PHP eliminará los caracteres extraños, por lo que después de 3 veces solo la carga útil enviada por el atacante permanecerá (y luego el atacante puede controlar la parte inicial).

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥