vue parse how example crear convert archivo javascript json xss security xmlhttprequest

javascript - parse - xml json



¿Es posible realizar un ataque de falsificación de solicitud de sitio entre sitios en una URL que devuelve un objeto JSON? (3)

Soy consciente de que hay un ataque de falsificación en el sitio cruzado que se puede realizar en una solicitud que devuelve una matriz al sobrecargar el constructor Array. Por ejemplo, supongamos que tengo un sitio con una URL:

foo.com/getJson

eso vuelve:

[''Puff the Dragon'', ''Credit Card #'']

Esto normalmente sería eval JavaScript en mi propio sitio después de una solicitud XHR, pero otro sitio puede oler estos datos incluyendo algo como:

<script> function Array() { var arr = this; var i = 0; var next = function(val) { arr[i++] setter = next; document.write(val); }; this[i++] setter = next; } </script> <script src="http://foo.com/getJson"></script>

Mi pregunta es, ¿se puede hacer lo mismo cuando la solicitud devuelve un objeto Javascript? es decir

{ name: ''Puff the Dragon'', cc: ''Credit Card #'' }

No pude encontrar una manera de hacer esto, pero tal vez me falta algo. Sé que hay mejores soluciones para proteger mi sitio, como usar el while (1) hack o requerir un token de autenticación en la URL, pero estoy tratando de averiguar si existe este tipo de agujero de seguridad.


Las fuentes que he visto, como Haacked y Hackademix , indican específicamente que los objetos raíz son seguros (presumiblemente en todos los principales navegadores). Esto se debe a que un script no puede comenzar con un objeto literal. De forma predeterminada, ASP.NET envuelve ambos objetos y matrices con un prefijo d , pero creo que esto es solo para simplificar la biblioteca del cliente.


Parece que de la especificación Ecmascript , el objeto JSON no debe tratarse como un programa Javascript válido:

"Tenga en cuenta que un ExpressionStatement no puede comenzar con un corchete de apertura, ya que podría hacerlo ambiguo con un Bloque.

Asumiendo que todos los navegadores implementan esto correctamente, una respuesta como { name: ''Puff the Dragon'', cc: ''Credit Card #'' } no se ejecutará como Javascript válido. Sin embargo, las expresiones como ({name: ''Puff the Dragon'', cc: ''Credit Card #'' }) y {[''Puff the Dragon'', ''Credit Card #'']} harán.


Podría usar la misma técnica para Object . No afectaría la cadena del prototipo, por lo que no sería heredada por todos los objetos. Pero podría, por ejemplo, registrar todos los objetos nuevos que se crean con esto:

function Object() { var obj = this; if (window.objectarray === undefined) { window.objectarray = []; } window.objectarray.push(this); return this; }

Cualquier código de tiempo en su página utiliza un new Object() , se escribiría en window.objectarray , incluso si se creó en un ámbito privado. Entonces, por ejemplo, mira este código:

var Account = function() { var createToken = function() { var objToken = new Object(); objToken.timestamp = new Date().getTime(); objToken.securestring = "abc123"; return objToken.timestamp + objToken.securestring; } var objPrivate = new Object(); objPrivate.bankaccount="123-456789"; objPrivate.token = createToken(); }; var myAccount = new Account();

En este caso, si crea una cuenta nueva con una cuenta new Account() , se creará un token usando propiedades privadas (y tal vez métodos) y nada sobre myAccount se dejará afuera en público. Pero tanto ''objectToken'' como objPrivate se registrarán en window.objectarray .