领先一步
VMware提供培训和认证,以加速您的进步。
了解更多更新:这是对XSS without HTML: Client-Side Template Injection with AngularJS的总结。之前引用位于文档中间,难以查找。本总结旨在简要介绍漏洞利用和修复方法,并非声称对该工作的拥有权。
AngularJS是一个流行的JavaScript框架,允许在双大括号内嵌入表达式。 例如,表达式1+2={{1+2}}
将呈现为1+2=3
。
这意味着如果服务器回显包含双大括号的用户输入,则用户可以使用Angular表达式执行XSS攻击。
让我们探索一个安全地进行HTML编码用户输入的页面。在下面的示例中,我们使用Thymeleaf进行HTML编码,然后将属性username
输出到页面div的文本中。
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>AngularJS - Escaping the Expression Sandbox</title>
</head>
<body>
<div th:text="${username}"></div>
</body>
</html>
如果用户名是<script>alert('Rob')</script>
,输出可能如下所示
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>AngularJS - Escaping the Expression Sandbox</title>
</head>
<body>
<div><script>alert('Rob')</script></div>
</body>
</html>
你会注意到输出已正确进行HTML编码。这意味着我们的应用程序目前安全,不会受到XSS攻击。
我们的应用程序目前对XSS攻击是安全的。让我们更新应用程序以使用AngularJS
<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>
你会注意到两处更改
angular-1.4.8.min.js
ng-app
我们的应用程序现在容易受到XSS攻击,但是我们如何利用它呢?最大的线索应该是我们对Angular表达式的介绍。如果用户名是1+2={{1+2}}
会发生什么?结果将是
<html>
<head>
<title>Angular Expression - safe</title>
<script src="angular-1.4.8.min.js"></script>
</head>
<body ng-app="">
<div>1+2={{1+2}}</div>
</body>
</html>
然后Angular会更新DOM为
<html>
<head>
<title>Angular Expression - safe</title>
<script src="angular-1.4.8.min.js"></script>
</head>
<body ng-app="">
<div>1+2=3</div>
</body>
</html>
我们可以尝试用户名{{alert('Rob')}}
,但这会被表达式沙箱阻止。此时你可能会认为我们是安全的。然而,尽管出现在文档的安全部分,表达式沙箱并非旨在提供安全保障。
更具体地说,文档关于混合客户端和服务器端模板说明如下:
一般来说,我们建议不要这样做,因为它可能会产生意外的XSS漏洞。
最终,这意味着如果您允许在服务器端模板中呈现用户输入,则应用程序容易受到XSS攻击。让我们来看一个具体的例子。
如果我们的有效负载被沙箱化,我们如何提供有效的XSS攻击?如果我们的用户名是
{{
'a'.constructor.prototype.charAt=[].join;
eval('x=1} } };alert(1)//');
}}
通过覆盖原生函数charAt
,我们可以绕过Angular的表达式沙箱,并允许我们执行alert(1)
。 请参考XSS without HTML: Client-Side Template Injection with AngularJS,了解该漏洞利用的完整细节。
注意:此有效负载针对Chrome和AngularJS 1.4.8。据了解,它在其他浏览器中无法运行。
允许服务器将用户输入回显到Angular模板会使您的应用程序面临XSS攻击的风险。更一般地说,您不应该混合服务器端用户输入渲染和客户端模板。您可以在rwinch/angularjs-escaping-expression-sandbox找到此博客文章随附的示例。