AngularJS客户端模板注入(XSS)
介绍
在过去十年中,前端开发发生了巨大的变化。大多数现代Web应用程序都是使用诸如AngularJS、React、Vue等前端框架。根据谷歌的说法,“AngularJS是一款基于javascript的开源前端Web框架,主要由谷歌和社区进行维护,它可用来解决在开发单页应用时遇到的众多挑战”。大多数人都默认为这些框架对XSS这样的漏洞应该天生免疫,但事实并非如此,它们只是利用方式(和传统XSS对比)有点不同。
Angular
在处理Angular应用时,有几件事情你需要了解。我将简要介绍几个Angular的特点,比如模板、表达式和作用域,它们对理解Angular中的客户端模板注入至关重要。
当你在浏览器中查看Angular应用时,实际上是在查看一个模板。一个模板是一个HTML片段,告诉Angular如何在Angular应用中渲染组件。模板的主要优点是你可以传递数据,动态生成HTML代码。下面是一个模板示例:
<h1>Welcome {{Username}}!</h1>
正如你所看到的,模板创建了一个h1
标签来欢迎当前的用户。{{Username}}
是一个表达式,它会根据你的用户名进行更改。如果用户名是ghostlulz
,那么应用将显示Welcome ghostlulz!
,Angular的这种动态生成方式使HTML页面变得非常灵活,无需使用下面的静态页面:
<h1> Welcome ghostlulz!</h1>
表达式也像javascript的代码片段。和javascript表达式一样,Angular表达式也可以包含文字、操作符和变量,如下图所示:
- 1+1
- a+b
- user.name
- items[index]
与针对全局窗口的javascript表达式不同,Angular表达式针对的是作用域对象。这意味着如果你试图使用alert(1)
,它就会报错,因为作用域内没有“alert”函数(除非你定义了一个)。作用域只是一个对象,你可以在其中定义变量和函数,如下图所示:
$scope.username = "Ghostlulz";
$scope.greetings = function() {
return 'Welcome ' + $scope.username + '!';
};
客户端模板注入(XSS)
根据谷歌“当应用把用户输入嵌入到客户端模板框架时,客户端模板注入漏洞就出现了”的说法。Angular是一个客户端模板框架,你可以将用户输入嵌入到这些模板中。这也使得Angular成为这类漏洞的完美攻击目标。
在下面的演示中我将使用liveoverflow提供的网站:https://old.liveoverflow.com/angularjs/
假设你在一个站点上测试XSS,你可以这样做:
你可以发现,并没有弹出警告框,这是因为服务器在解析输入之前进行了编码,具体代码如下所示。
<?php
// GET parameter ?q= mit sicherem escaping
$q = $_GET['q'];
echo htmlspecialchars($q,ENT_QUOTES);
?>
这(编码)是一种非常流行的防御XSS的方法,对于大多数应用来说已经足够了,但是Angular不同。在Angular中,我们可以使用不需要使用特殊字符的表达式,这不会受到htmlspecialchars
函数的影响,如下所示:
如上图所示,我使用了表达式{{1+1}}
,它的值是“2”。而这就表明应用很容易受到客户端模板注入的影响。
仅仅让目标应用将两个数字相加并不那么令人兴奋,但是如果我们可以注入javascript代码呢?现在我们知道不能简单地插入一个alert(1)
函数,因为该函数并没有在作用域对象中定义。
默认情况下,作用域对象包含另一个名为“构造器”的对象,该对象包含一个也被称为“构造器”的函数。此函数可用于动态生成和执行代码。而这正是我们执行XSS的payload所需要的,如下图所示:
{{constructor.constructor('alert(1)')()}}
请注意这个payload不包含任何特殊字符。因此编码函数无法对此进行防御(编码也是大多数XSS的防御手段)。
正如你在上面看到的,我们的恶意Angular表达式被注入到页面中,导致应用程序动态地生成和执行我们的payload。
为了防御这种类型的攻击,Angular 1.2-1.5版本包含了一个沙箱。但在1.6版以上版本中被删除了,因为沙箱没有提供真正的安全性,存在很多绕过。如果你所测试的应用的Angular版本在1.2 - 1.5之间,那么就需要查找对应该版本的沙箱绕过,这样才能使XSS有效执行。
结论
新技术往往会带来新漏洞。任何接受用户输入的客户端模板框架都可能受到客户端模板注入的攻击。由于Angular使用了“表达式”,所以我们可以借此绕过传统的XSS防护。大多数开发人员严重依赖过去的安全防护方法,忽视了新技术可能带来的新风险。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:http://ghostlulz.com/angularjs-client-side-template-injection-xss/
最新评论