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

5.9 KiB

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

Carga de archivos PHP

El motor PHP, al recibir un paquete POST con archivos codificados según RFC 1867, crea uno o más archivos temporales que se utilizan para almacenar los datos de los archivos cargados. Se requiere un script PHP que maneje la carga de archivos para usar la función move_uploaded_file para mover el archivo temporal cargado a un lugar de su elección (si el script requiere que el archivo exista después de que termine). Cuando el script termina, el motor PHP elimina todos los archivos temporales para los archivos que se cargaron (si quedan después de que el script termine).

{% hint style="info" %} Como el atacante generalmente sabrá dónde se encuentran estos archivos temporales, en caso de encontrar una Inclusión de Archivo Local, podría cargar el archivo que se está cargando y obtener RCE. {% endhint %}

El principal problema para acceder al archivo es básicamente adivinar su nombre (que será "aleatorio").

Explotación en Windows

Para generar el nombre aleatorio en Windows, PHP utiliza la función GetTempFileName. Al buscar en la documentación, podemos encontrar la siguiente explicación: La función GetTempFileName crea un nombre de archivo temporal con la siguiente forma:

<path>\<pre><uuuu>.TMP

  • La ruta es upload_tmp_dir, que normalmente es C:\Windows\Temp
  • El prefijo es generalmente: "php"
  • El <uuuu> es un valor hexadecimal único. Sin embargo:
    • Solo se utilizan los 16 bits inferiores del parámetro uUnique. Esto limita GetTempFileName a un máximo de 65.535 nombres de archivo únicos si los parámetros lpPathName y lpPrefixString permanecen iguales. Es posible hacer fuerza bruta.

Como vimos, es bastante fácil encontrar el archivo temporal en sistemas Windows. Y va a ser más fácil porque no se necesita fuerza bruta aquí, gracias a una cierta peculiaridad de FindFirstFile que permite usar máscaras (<< como * y > como ?) en las rutas LFI en Windows. Gracias a esto, se puede formar una ruta de inclusión como esta:

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

En algunos casos puede ser necesario un patrón más específico como php1<< o phpA<<. Puedes realizar un ataque de fuerza bruta con patrones más específicos hasta encontrar el archivo temporal que subiste.

Explotación en GNU/Linux

El valor aleatorio del nombre del archivo es lo suficientemente bueno como para no ser predecible ni susceptible a ataques de fuerza bruta. Para obtener más información, consulta las referencias.

Referencias

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