2010-06-30 21 views
33

Las respuestas JSON pueden aprovecharse anulando los constructores de Array o si los valores host no son JavaScript de cadena de caracteres escapada.¿Es posible explotar las respuestas JSON de XSS con la cadena de JavaScript adecuada al escaparse

Supongamos que ambos vectores se tratan de la manera normal. Google atrapa famoso respuesta JSON abastecimiento directo con el prefijo toda JSON con algo como:

throw 1; < don't be evil' > 

y luego el resto de la JSON sigue. Así que el Dr. El mal no puede, utilizando el tipo de explotar discutido aquí http://sla.ckers.org/forum/read.php?2,25788 obtener la cookie (suponiendo que está conectado), colocando lo siguiente en su sitio:

<script src="http://yourbank.com/accountStatus.json"> 

En cuanto a la cadena de escapar de las reglas, así que si' Si utilizamos comillas dobles, necesitamos ponerles una barra diagonal inversa y cada barra invertida con otra barra invertida, etc.

Pero mi pregunta es, ¿qué pasa si estás haciendo todo esto?

Burpsuite (la herramienta de seguridad automatizada) detecta los intentos de XSS incrustados que se devuelven escaneados sin HTML en una respuesta JSON y lo informa como una vulnerabilidad XSS. Tengo un informe de que mi aplicación contiene vulnerabilidades de este tipo, pero no estoy seguro. Lo he intentado y no puedo hacer que un exploit funcione.

Así que no creo que esto es correcto, pero les pido que Stackoverflow comunidad, a pesar adentro.

Hay un caso específico, el de IE tipo MIME oler que creo que podría dar lugar a un exploit . Después de todo, IE 7 aún tenía la "característica" de que las etiquetas de script incrustadas en los comentarios de imagen se ejecutaran independientemente del encabezado de tipo de contenido. Dejemos ese comportamiento claramente estúpido a un lado al principio.

Seguramente el JSON sería analizado por el analizador nativo de JavaScript (Window.JSON en Firefox) o por un eval() según el antiguo comportamiento predeterminado de jQuery. En ninguno de los casos, la siguiente expresión dará como resultado que se ejecute la alerta:

{"myJSON": "legit", "someParam": "12345<script>alert(1)</script>"} 

¿Estoy en lo cierto o estoy equivocado?

Respuesta

25

Esta vulnerabilidad de xss potencial se puede evitar utilizando el Content-Type correcto. Basado en RFC-4627, todas las respuestas JSON deben usar el tipo application/json. El siguiente código no es vulnerables a XSS, adelante probarlo:

<?php 
header('Content-type: application/json'); 
header("x-content-type-options: nosniff"); 
print $_GET['json']; 
?> 

la cabecera nosniff se utiliza para desactivar el contenido rastreadores en las versiones antiguas de Internet Explorer. Otra variante es la siguiente:

<?php 
header("Content-Type: application/json"); 
header("x-content-type-options: nosniff"); 
print('{"someKey":"<body onload=alert(\'alert(/ThisIsNotXSS/)\')>"}'); 
?> 

cuando el código anterior es visto por un navegador se le pide al usuario descargar un archivo JSON, el código JavaScript no se ha ejecutado en versiones modernas de Chrome, Firefox e Internet Explorer. Esto sería una violación de RFC.

Si usa JavaScript para eval() el JSON anterior o escribe la respuesta a la página, entonces se convierte en DOM Based XSS. DOM basado en XSS está parcheado en el cliente al desinfectar el JSON antes de actuar sobre esta información.

+0

OK, así que supongo que podría haberlo aclarado, pero la respuesta JSON de la que hablo se define por la presencia del encabezado Content-Type que tiene el valor "application/json". Entonces parece que estás confirmando que no hay ningún exploit. ¿No se puede explotar su código mediante el abastecimiento directo en un dominio hostil, es decir, utilizando la etiqueta de script y parametrizando la fuente para incluir código que luego se ejecutará en el contexto del dominio del que proviene? En ese caso, las cookies del dominio serían accesibles y podrían ser capturadas por la página llamante utilizando document.write. ¿Derecha? –

+0

@Chris Mountford, el JavaScript inyectado no se ejecuta porque el servidor le dice también al navegador que no. Piénselo así, ¿y si tuviera JavaScript en .exe? Este * podría llevar * Dom Based XSS, pero también otros diseños. Dom xss se ejecuta con la misma política desde la que se ejecuta. La única forma en que esto puede ser un problema para usted es si usted 'evalúa 'el código en su propio sitio. – rook

+0

Mi entendimiento era que JSON era eval() 'd muy comúnmente en el pasado, al menos por defecto en jQuery (como dije). Sin embargo, estoy interesado no en la inyección de JavaScript, sino en la inyección de HTML en JSON, que conduce a la ejecución de JavaScript. ¿Puedes comentar sobre eso? Además, como dije IE, tan reciente como v7, he confirmado que puedo IGNORAR el encabezado Content-Type bajo ciertas circunstancias. Sí, esto es un error en IE, pero Microsoft argumentó que no (independientemente del RFC) y, al final, por seguridad, solo importa lo que los navegadores no especifiquen las especificaciones. –

0

Si limitamos nuestro alcance a IE (todas las versiones), supongamos que está ejecutando un sitio basado en PHP o ASP.NET e ignora el filtro IE anti-xss, entonces está equivocado: sus usuarios son vulnerables. El ajuste 'Content-type: application/json' tampoco ayudará.

Esto se debe a (como usted menciona) el comportamiento de detección de contenido de IE, que va más allá de oler las etiquetas HTML en el cuerpo de la respuesta para incluir el análisis de URI.

Esta entrada de blog explica esto muy bien:

http://blog.watchfire.com/wfblog/2011/10/json-based-xss-exploitation.html

+0

Bien, pero el URI aún está totalmente bajo el control del servidor. –

+0

Veo que el comportamiento de olfateo de IE crea múltiples vectores de ataque posibles, pero la modificación de la información de ruta no es posible en mi aplicación. También, finalmente puedo dejar este problema de olfateo en reposo ya que la versión IE 8+ desactivará el olfateo MIME usando esto: X-Content-Type-Options: nosniff Para cualquiera que lea esto, creo que he establecido que JSON puede transportar valores con seguridad con la entrada del usuario contaminada, siempre que esté codificado con el valor JSON y, por supuesto, nunca debe estar conectado a un DOM HTML sin la codificación html del lado del cliente. –

+0

Para aclarar, quiero decir que no hay oportunidad para que los atacantes elijan su propia información de ruta. Esto significa que mi aplicación no tiene ninguna vulnerabilidad en esa categoría. Además, en mi pregunta original, afirmé que quería dejar de lado la cuestión del olfateo MIME de IE, porque quería concentrarme en otras categorías (ya tenía una solución para el olfateo MIME de IE). –

7

Burpsuite (la herramienta de seguridad automatizado) detecta incrustado XSS intenta que se devuelven unHTML-escapó en una respuesta JSON y se informa que como una vulnerabilidad XSS.

Quizás se trata de evitar la vulnerabilidad descrita en el rule 3.1 of OWASP XSS Cheat Sheet.

Ellos dan el siguiente ejemplo de código vulnerable:

<script> 
    var initData = <%= data.to_json %>; 
</script> 

Incluso si comillas dobles, barras y saltos de línea se escapan correctamente, puede salir de JSON si está incrustado en HTML:

<script> 
    var initData = {"foo":"</script><script>alert('XSS')</script>"}; 
</script> 

jsFiddle.

to_json() función puede evitar este problema anteponiendo cada barra con una barra invertida. Si se usa JSON en el atributo HTML, toda la cadena JSON debe ser escapada en HTML. Si se usa en un atributo href="javascript:", debe ser URL-escapado.

+0

Este es un error muy básico en el php (supongo que es php). No debe insertar datos viciados en HTML sin que se escape HTML. Pero como indiqué en mi pregunta, no estoy haciendo esto. Si bien es posible que Burpsuite intente evitar este problema, ese enfoque es erróneo. –

+0

¿Qué enfoque está mal orientado? No te entiendo En cuanto a "No debe insertar datos viciados en HTML sin que se escape HTML". Adivine qué, no debe incluir datos no contaminados sin escaparse. –

+0

El asunto de lo que puede alinear está completamente fuera del alcance de esta pregunta. Ciertamente puede alinear datos no contaminados si esos datos están compuestos de HTML. De hecho, si tiene HTML y lo inserta con WITH escaping, terminará con doble salida de escape, que, aunque no es un error de seguridad, sigue siendo un error. El enfoque que describo como equivocado es el intento de "prevenir la vulnerabilidad descrita en la regla 3.1 de la Hoja de referencia XSS de OWASP", que usted sugiere como la intención de Burpsuite. Si su sugerencia acerca de Burpsuite es verdadera, entonces están equivocados. –

Cuestiones relacionadas