Encontré un error que te permite escapar de la caja de arena de la plantilla de AngularJS. Angular es un lenguaje de plantillas basado en el bigote. Te permite poner expresiones que son evaluadas en tu html. Por ejemplo, {{1 + 1}} se representa en 2
El sandbox lo hace para que los usuarios no puedan acceder a las ventanas / constructores desde dentro de Angular dentro de las expresiones. No puedes hacer {{{} .constructor = ...}} por ejemplo. Esto se debe a que esas operaciones se consideran inseguras si el sitio también guarda plantillas desde la entrada del usuario. Abre el sitio a XSS.
Al revisar el código fuente, descubrí que hay una comprobación de obj === {} .constructor que se puede omitir.
Básicamente, todo se reduce a evitar esto:
if (obj) {
if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor ||
obj === {}.constructor || obj === [].constructor || obj === Function.constructor) {
throw $parseMinErr('isecaf',
'Assigning to a constructor is disallowed! Expression: {0}', fullExpression);
}
}
Pude superar esas comprobaciones ocultando mis llamadas de constructor dentro de otro objeto (literal de objeto o literal de matriz).
Como objeto literal:
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert('Evaluated Object Literal')');}}
O como una matriz:
{{x = [''.constructor.prototype]; x[0].charAt=[].join; $eval('x=alert('Evaluated Array')');}}
¿Cómo pueden mejorarse las verificaciones anteriores para que estos casos fallen?
En su lugar, intenté cambiar los obj === {} .constructor cheques a instanceof y eso hace que los cheques funcionen, pero creo que puede introducir sus propios problemas de seguridad. Me gustaría enviar una solicitud de extracción, pero espero que otros investigadores de seguridad contribuyan a la conversación para que la caja de arena sea lo más fuerte posible.
Este es mi problema publicado en el proyecto Angular para referencia: enlace
Aquí hay material relacionado: enlace
Aquí hay un jsFiddle: enlace