File Inclusion

Local File Inclusion

http://<SERVER_IP>:<PORT>/index.php?language=/etc/passwd

Path Traversal

include($_GET['language']);
include("./languages/" . $_GET['language']);

Filename Prefix

include("lang_" . $_GET['language']);

Appended Extensions

include($_GET['language'] . ".php");

Basic Bypasses

$language = str_replace('../', '', $_GET['language']);

Non-Recursive Path Traversal Filters

Uno de los filtros más básicos contra LFI es un filtro de búsqueda y reemplazo, en el que simplemente se eliminan las subcadenas de (../) para evitar los recorridos.

$language = str_replace('../', '', $_GET['language']);

Encoding

Si la aplicación web de destino no permite y / en nuestra entrada, podemos codificar la URL ../ en %2e%2e%2f, lo que puede eludir el filtro. Para ello, podemos utilizar cualquier utilidad de codificación de URL en línea o utilizar la herramienta Burp Suite Decoder, como se indica a continuación:

Approved Paths

Appended Extension

Path Truncation

Null Bytes

Para explotar esta vulnerabilidad, podemos terminar nuestro payload con un byte nulo (por ejemplo, /etc/passwd%00), de forma que la ruta final pasada a include() sería (/etc/passwd%00.php). De esta forma, aunque .php se añade a nuestra cadena, cualquier cosa después del byte nulo se truncaría, y así la ruta utilizada sería realmente /etc/passwd, lo que nos llevaría a evitar la extensión añadida.

PHP Filters

Input Filters

Hay cuatro tipos diferentes de filtros disponibles para su uso: filtros de cadenasarrow-up-right , filtros de conversiónarrow-up-right , filtros de compresiónarrow-up-right y filtros de cifradoarrow-up-right . Puede leer más sobre cada filtro en su enlace respectivo, pero el filtro que es útil para los ataques LFI es el convert.base64-encodefiltro que se encuentra en Conversion Filters.

Fuzzing for PHP Files

PHP Wrappers

Checking PHP Configurations

Remote Code Execution

Ahora, podemos codificar la cadena base64 en la URL y luego pasarla al contenedor de datos con data://text/plain;base64,. Por último, podemos usar comandos de paso al shell web con &cmd=<COMMAND>:

Input

Expect

Base64

1. php://filter/read=convert.base64-encode/resource=config

  • Significado:

    • Aplica el filtro convert.base64-encode al leer (read) el recurso especificado (resource=config).

  • Uso:

    • Lee el archivo llamado config y lo devuelve codificado en Base64.

  • Explicación técnica:

    • El filtro read=convert.base64-encode transforma los datos leídos desde el archivo config en su equivalente codificado en Base64.

2. php://filter/convert.base64-encode/resource=config

  • Significado:

    • Se refiere directamente al filtro convert.base64-encode aplicado al recurso config.

  • Uso:

    • Intenta aplicar el filtro de codificación en Base64 sin especificar explícitamente una operación (read, write, etc.).

  • Limitación:

    • Esta forma no siempre es válida, ya que el filtro debe aplicarse a una acción específica como read o write. En muchos casos, este formato puede no funcionar correctamente.

Rot13

zip://

data://

Last updated