Problemas para evitar el secuestro JSON con AntiForgeryToken de MVC3, o una validación de token similar

5

Dudo en implementar las soluciones de secuestro anti-JSON propuestas desde

  1. Las soluciones recomendadas para mitigar el secuestro JSON implican POST JSON no REST-REST para obtener datos

  2. La solución alternativa (ajuste de objetos) causa problemas con los controles de terceros a los que no tengo acceso con código fuente.

  3. No puedo encontrar una implementación verificada por la comunidad que implemente la Solución alternativa (que se muestra a continuación) sobre cómo componer el token de seguridad, o entregarlo de manera segura dentro de la página web. Tampoco pretendo ser un experto suficiente para rodar mi propia implementación.

  4. No se puede confiar en los encabezados de referencia

Background

Este blog describe un problema de CSRF relacionado con el secuestro de JSON y recomienda usar POST de JSON para Obtener datos. Dado que el uso de HTTP POST para obtener datos no está muy lleno de REST, buscaría una solución más RESTfull que habilite acciones REST por sesión o por página.

Otra técnica de mitigación es envolver los datos JSON en un objeto como se describe aquí . Me temo que esto puede retrasar el problema hasta que se encuentre otra técnica.

Implementación alternativa

Para mí, parece natural extender el uso ASP.NET MVC's AntiForgeryToken con jQuery HTTP GET para mi JSON.

Por ejemplo, si OBTENGO algunos datos confidenciales, de acuerdo con el enlace de Haacked anterior, el siguiente código es vulnerable:

$.getJSON('[url]', { [parameters] }, function(json) {
    // callback function code
});

Estoy de acuerdo en que no es RESTfull para obtener datos utilizando la solución POST recomendada. Mi pensamiento es enviar un token de validación en la URL. De esa manera, el atacante al estilo CSRF no sabrá la URL completa. En caché, o no en caché, no podrán obtener los datos.

A continuación se muestran dos ejemplos de cómo se podría realizar una consulta JSON GET. No estoy seguro de qué implementación es la más efectiva, pero puedo suponer que la primera es más segura de los proxies errantes que almacenan en caché estos datos, lo que los hace vulnerables a un atacante.

enlace

o

enlace

... que bien podría ser AntiForgeryToken de MVC3, o una variante ( see swt ) del mismo. Este token se establecería como un valor en línea en cualquier formato de URL que se haya elegido anteriormente.

Preguntas de muestra que me impiden lanzar mi propia solución

  1. ¿Qué formato de URL (arriba) usaría para validar el JSON GET (barra diagonal, cuestionario, etc.) responderá un proxy a enlace con enlace data?

  2. ¿Cómo entregaría ese token codificado a la página web? ¿En línea o como variable de página?

  3. ¿Cómo compondrías el token? ¿Construido en AntiforgeryToken, o por algún otro medio?

  4. El AntiForgeryToken utiliza una cookie. ¿Se usaría / necesitaría una cookie de respaldo en este caso? Sólo HTTP? ¿Qué pasa con SSL junto con HTTP solamente?

  5. ¿Cómo establecería los encabezados de su caché? Algo especial para el acelerador web de Google (por ejemplo)

  6. ¿Cuáles son las implicaciones de solo hacer la solicitud JSON de SSL?

  7. ¿Debería la matriz JSON devuelta todavía estar envuelta en un objeto solo por razones de seguridad?

  8. ¿Cómo se interoperará esta solución con la propuesta de Microsoft? características y enlaces de datos

Las preguntas anteriores son las razones por las que no estoy avanzando y haciendo esto por mí mismo. Sin mencionar que es probable que haya más preguntas en las que no haya pensado y que, sin embargo, son un riesgo.

    
pregunta random65537 06.02.2011 - 17:52
fuente

2 respuestas

2

Esta técnica fue iniciada por Jeremiah Grossman . Esto solo fue un problema porque el json devuelto también contiene javascript que podría incluirse en una página a través de una etiqueta <script> . La mayoría de las respuestas de json no se pueden abusar de esta manera porque la política del mismo origen prohíbe el javascript para obtener los resultados. Para solucionar este problema Google usó un pie no analizable .

    
respondido por el rook 29.03.2011 - 18:14
fuente
2

Este documento resume una variedad de defensas razonables.

Incluir un token impredecible en la URL es, de hecho, una forma razonable de defenderse contra la amenaza. (Consulte la Sección 3 del documento para mencionar esto). Una forma razonable de enviarlo al servidor es como un parámetro. El token puede ser una copia de la cookie de sesión, o un valor secreto que el servidor conoce y que no puede predecir un atacante. Las técnicas para implementar esto probablemente sean muy similares a las de defensa contra CSRF.

Creo que HTTP vs HTTPS es un problema ortogonal; No veo ninguna relevancia aquí.

    
respondido por el D.W. 31.03.2011 - 09:46
fuente

Lea otras preguntas en las etiquetas