LFI2RCE Via temp file uploads

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Consulta todos los detalles de esta técnica en https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf

Cargas de archivos PHP

Cuando un motor de PHP recibe una solicitud POST que contiene archivos formateados según RFC 1867, genera archivos temporales para almacenar los datos cargados. Estos archivos son cruciales para el manejo de carga de archivos en scripts de PHP. La función move_uploaded_file debe usarse para trasladar estos archivos temporales a una ubicación deseada si se necesita almacenamiento persistente más allá de la ejecución del script. Después de la ejecución, PHP elimina automáticamente cualquier archivo temporal restante.

Alerta de seguridad: Los atacantes, al conocer la ubicación de los archivos temporales, podrían explotar una vulnerabilidad de Inclusión de Archivos Locales para ejecutar código accediendo al archivo durante la carga.

El desafío para el acceso no autorizado radica en predecir el nombre del archivo temporal, que está intencionalmente aleatorizado.

Explotación en Sistemas Windows

En Windows, PHP genera nombres de archivo temporales utilizando la función GetTempFileName, lo que resulta en un patrón como <path>\<pre><uuuu>.TMP. Es importante destacar que:

  • La ruta predeterminada suele ser C:\Windows\Temp.

  • El prefijo suele ser "php".

  • El <uuuu> representa un valor hexadecimal único. Es crucial mencionar que, debido a la limitación de la función, solo se utilizan los 16 bits inferiores, lo que permite un máximo de 65,535 nombres únicos con una ruta y prefijo constantes, lo que hace factible la fuerza bruta.

Además, el proceso de explotación se simplifica en sistemas Windows. Una peculiaridad en la función FindFirstFile permite el uso de comodines en las rutas de Inclusión de Archivos Locales (LFI). Esto permite crear una ruta de inclusión como la siguiente para localizar el archivo temporal:

http://site/vuln.php?inc=c:\windows\temp\php<<

En ciertas situaciones, puede ser necesario un máscara más específica (como php1<< o phpA<<). Se puede probar sistemáticamente estas máscaras para descubrir el archivo temporal subido.

Explotación en Sistemas GNU/Linux

Para sistemas GNU/Linux, la aleatoriedad en la nomenclatura de archivos temporales es sólida, lo que hace que los nombres no sean predecibles ni susceptibles a ataques de fuerza bruta. Se pueden encontrar más detalles en la documentación referenciada.

Última actualización