PHP Filters
Last updated
Last updated
Muchas aplicaciones web populares se desarrollan en PHP, junto con varias aplicaciones web personalizadas creadas con diferentes frameworks PHP, como Laravel o Symfony. Si identificamos una vulnerabilidad LFI en aplicaciones web PHP, podemos utilizar diferentes para extender nuestra explotación de LFI e incluso, potencialmente, lograr la ejecución remota de código.
Los wrappers de PHP nos permiten acceder a diferentes flujos de E/S a nivel de aplicación, como la entrada/salida estándar, los descriptores de archivo y los flujos de memoria. Esto tiene muchos usos para los desarrolladores de PHP. Sin embargo, como evaluadores de penetración web, podemos utilizar estos wrappers para ampliar nuestros ataques de explotación y poder leer archivos de código fuente PHP o incluso ejecutar comandos del sistema. Esto no solo es beneficioso con ataques LFI, sino también con otros ataques web como XXE, como se explica en el módulo
En esta sección, veremos cómo se utilizan los filtros básicos de PHP para leer el código fuente de PHP y, en la siguiente sección, veremos cómo diferentes envoltorios de PHP pueden ayudarnos a lograr la ejecución remota de código a través de vulnerabilidades LFI.
son un tipo de contenedor PHP que permite pasar diferentes tipos de entrada y filtrarlos con el filtro especificado. Para usar flujos de contenedor PHP, podemos usar el php://
esquema en nuestra cadena y acceder al contenedor de filtro PHP con php://filter/
.
El filter
contenedor tiene varios parámetros, pero los principales que necesitamos para nuestro ataque son resource
y read
. Este resource
parámetro es necesario para los contenedores de filtros, y con él podemos especificar el flujo al que queremos aplicar el filtro (por ejemplo, un archivo local). Además, este read
parámetro puede aplicar diferentes filtros al recurso de entrada, por lo que podemos usarlo para especificar qué filtro queremos aplicar a nuestro recurso.
Hay cuatro tipos de filtros disponibles: , , y . Puede obtener más información sobre cada filtro en su enlace correspondiente, pero el filtro útil para ataques LFI es el que se encuentra convert.base64-encode
en [enlace faltante] Conversion Filters
.
El primer paso sería buscar diferentes páginas PHP disponibles con una herramienta como ffuf
o gobuster
, como se explica en el módulo :
Incluso después de leer el código fuente de cualquier archivo identificado, podemos scan them for other referenced PHP files
leerlo también hasta capturar la mayor parte del código fuente de la aplicación web o tener una idea precisa de su función. También es posible comenzar leyéndola index.php
y escaneándola en busca de más referencias, etc., pero el fuzzing de archivos PHP puede revelar algunos archivos que de otro modo no se encontrarían de esa manera.
En secciones anteriores, si intentaste incluir archivos PHP mediante LFI, habrás notado que el archivo PHP incluido se ejecuta y, finalmente, se renderiza como una página HTML normal. Por ejemplo, intentemos incluir la config.php
página ( .php
extensión añadida por la aplicación web):
Como podemos ver, obtenemos un resultado vacío en lugar de nuestra cadena LFI, ya que lo config.php
más probable es que solo configure la aplicación web y no muestre ninguna salida HTML.
Esto puede ser útil en ciertos casos, como acceder a páginas PHP locales a las que no tenemos acceso (por ejemplo, SSRF). Sin embargo, en la mayoría de los casos, nos interesaría más leer el código fuente PHP mediante LFI, ya que suele revelar información importante sobre la aplicación web. Aquí es donde el base64
filtro PHP resulta útil, ya que podemos usarlo para codificar en base64 el archivo PHP y, de esta manera, obtener el código fuente codificado en lugar de ejecutarlo y renderizarlo. Esto es especialmente útil en casos donde trabajamos con LFI con extensiones PHP añadidas, ya que podríamos estar restringidos a incluir solo archivos PHP, como se explicó en la sección anterior.
Una vez que tengamos una lista de posibles archivos PHP que queramos leer, podemos empezar a revelar sus fuentes con el base64
filtro PHP. Intentemos leer el código fuente del config.php
filtro base64, especificando convert.base64-encode
para el read
parámetro y config
para el resource
parámetro, como se muestra a continuación:
Como podemos ver, a diferencia de nuestro intento con LFI normal, el uso del filtro base64 devolvió una cadena codificada en lugar del resultado vacío que vimos anteriormente. Ahora podemos decodificar esta cadena para obtener el contenido del código fuente de config.php
, como se indica a continuación: