LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

Si encuentras 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 el PHP_SESSION_UPLOAD_PROGRESS en los datos de POST multipart, PHP habilitará la sesión por 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 (por ejemplo, un shellcode php).

Aunque la mayoría de los tutoriales en Internet recomiendan establecer session.upload_progress.cleanup en Off con 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. Por lo tanto, esto será una Condición de Carrera.

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 molesto prefijo upload_progress_ como 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 al decodificar 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 artículo 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 artículo en https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización