Recientemente, trabajando en una aplicación web basada en Rails para una empresa, tuve que analizar la vulnerabilidad de XSS. Resulta que la aplicación, en algunos lugares, podría tomar una etiqueta HTML (por ejemplo, <script>jscodehere</script>
directamente como un parámetro en las solicitudes GET o POST.
Luego se puede acceder a este parámetro a través del hash de parámetros de la aplicación (el hash donde todos los datos de clave / valor entrantes están disponibles a partir de la solicitud).
Ahora, la vulnerabilidad XSS se deriva del hecho de que el sitio también pone a disposición los datos de muchas de sus páginas en una versión JSON (por ejemplo, /cart/1.json
).
A través de algunos mecanismos que no entiendo completamente (supongo que esto es técnicamente "¿Reflejado XSS"?), el código <script>
no saneado que luego se abrió camino en el JSON se puede usar para comprometer máquinas personales y otros sitios , a través de ejecución involuntaria.
Mi pregunta es, ¿por qué este no es un sistema opt-in? Rails ahora está en la versión 4, por lo que me sorprende que aún se deba crear una solución manualmente, pero esto se aplicaría a cualquier marco de aplicación web. Una cosa es permitir que los parámetros ingresen sin ser saneados por defecto (quizás las etiquetas HTML se usarán en la página de perfil de un usuario y se requiere el formato) - y creo que Rails también realiza un barrido de la acción de representación real, limitando el resultado De forma predeterminada, solo para etiquetas html "seguras".
Sin embargo, cuando se procesa JSON, no se realiza tal desinfección / limpieza, tal vez porque cuando la respuesta JSON se crea y analiza, está demasiado personalizada para hacerlo, pero no entiendo completamente por qué
1) Algunos mecanismos incorporados no están en su lugar
2) No se ha hablado más sobre esto; no pude encontrar discusión sobre el paso inseguro de etiquetas HTML / Script en la representación JSON de las aplicaciones Rails o Sinatra en la web (solo pude encontrar una pequeña cantidad de información acerca de la desinfección el hash de params, por lo que los valores de desinfección en el modo IN, que posiblemente sea mejor, pero puede que no funcione para todo, ya que es una solución única para todos, es posible que desee conservar algunas etiquetas HTML pero solo eliminarlas etiquetas <script>
, por ejemplo).
3) Por qué, en el mundo de Ruby, al menos, solo hay una biblioteca que existe para desinfectar (la gema de desinfección, y realmente solo funciona en tipos de datos String; tienes que escribir tu propio código recursivo para desinfectar un Hash, como el hash params, ¡y parece que tampoco hay nada escrito en esto!). Rails tiene un desinfectante incorporado, pero se considera inferior a esta gema desinfectante de terceros, y no es tan flexible cuando se trata de tener algunos niveles de rigor en cuanto a cómo desinfectar (una cuerda).
¿Estoy malinterpretando la validez de la inyección en JSON como una vulnerabilidad, o se ha pasado por alto esta vulnerabilidad porque JSON no es una característica principal de todas las aplicaciones web?
Resultado final: usé un filtro anterior en el controlador principal de la aplicación en el back-end para sanear el hash params cada vez que sale de una solicitud, usando la biblioteca Sanitize.
Sin embargo, creo que esto ralentizó significativamente la aplicación porque tiene que ocurrir en cada solicitud, y el Desinfectante esencialmente ejecuta una serie de llamadas de expresiones regulares de forma recursiva en el hash. De esta manera, las etiquetas nunca ingresan a la base de datos, y tampoco pueden hacerlo a través de JSON, pero es un golpe costoso en cuanto al rendimiento. ¿Hay una mejor manera?