AngularJS - 绕过表达式沙箱以进行XSS攻击

工程 | Rob Winch | 2016年1月28日 | ...

更新:这是对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>&lt;script&gt;alert(&#39;Rob&#39;)&lt;/script&gt;</div>
</body>
</html>

你会注意到输出已正确进行HTML编码。这意味着我们的应用程序目前安全,不会受到XSS攻击。

添加AngularJS

我们的应用程序目前对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
  • 我们在body元素中添加了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找到此博客文章随附的示例。

获取Spring新闻通讯

通过Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部