5.9 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre The PEASS Family, nuestra colección exclusiva de NFTs
-
Obtén la oficial PEASS & HackTricks swag
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
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 esC:\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
- https://gynvael.coldwind.pl/?id=376
- https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre The PEASS Family, nuestra colección exclusiva de NFTs
-
Obtén el swag oficial de PEASS y HackTricks
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.