Estoy creando una aplicación web basada en Java que es intencionalmente vulnerable a la descarga de archivos reflejados (RDF). El Libro Blanco está aquí . Leo los requisitos de vulnerabilidad de descarga del archivo reflejado:
- El usuario tiene control sobre el nombre del archivo (falta el nombre de archivo en el encabezado de disposición de contenido).
- la aplicación utiliza los valores encontrados en la URL (u otros lugares controlados por el usuario) para crear el contenido del archivo. En otras palabras, algunos comentarios del usuario se "reflejan" en el contenido de la respuesta.
- la respuesta se está descargando (en lugar de representarse en el navegador) y un archivo se 'crea sobre la marcha', es decir, mediante programación.
Tengo un servlet llamado FileDownload y no especifico el nombre de archivo en el encabezado de disposición de contenido:
response.setHeader("Content-Disposition","attachment");
En una solicitud ordinaria ( http://localhost:8080/FileDownload
), obtengo un archivo llamado FileDownload como se esperaba (sin embargo, tiene una extensión .sql por razones que no entiendo)
El pdf dice,
Añadiendo una "/" al final de la parte de la ruta seguida de una deseada nombre de archivo y la extensión es compatible con navegador cruzado.
pero no obtuve este comportamiento de inmediato, en su lugar no pudo encontrar ese recurso. Entonces, cambié mi web.xml desde
<url-pattern>/FileDownload</url-pattern>
a
<url-pattern>/FileDownload/*</url-pattern>
y que habilitó el comportamiento descrito anteriormente en la URL: http://localhost:8080/FileDownload/Setup.bat
. Entonces, ¿el patrón url tiene que ser extra permisivo para que esto funcione?
El documento también afirma que todas las advertencias "Este tipo de archivo podrían dañar su computadora ..." se "descartan" si una de las siguientes cadenas aparece en el nombre del archivo: Instalar, Configurar, Actualizar, Desinstalar. No vi este comportamiento. ¿Se ha cambiado desde que se publicó el artículo?
El punto de RFD es abusar de la confianza de ciertos sitios y si puedo hacer que los archivos arbitrarios parezcan provenir de un sitio de confianza, puedo evitar ciertas advertencias. (¿Es mi navegador el que ya confía en ciertos sitios o es el usuario o ambos?)
Me sorprendió ver que los patrones de punto y coma, como
http://localhost:8080/FileDownload;/Install.bat
http://localhost:8080/FileDownload;/Install.bat;Install.bat
funciona como se describe en el documento. Sin embargo, si puedo lograr el mismo resultado con http://localhost:8080/FileDownload/Install.bat
, ¿en qué escenario necesitaría hacer el hack del punto y coma?
Para hacer que esto funcione, también tuve que configurar mi navegador para que descargue archivos automáticamente sin preguntarme dónde guardarlos.