1. beplay体育能用吗网络安全学院
  2. 跨站脚本
  3. 上下文
  4. Angularjs

Angularjs沙箱

在本节中,我们将描述Angularjs沙箱,解释利用如何从沙箱中逃脱,并阐明如何如何内容安全策略((CSP)可以在Angularjs沙箱的上下文中绕过。

什么是Angularjs沙箱?

Angularjs沙箱是一种防止使用潜在危险物体的机制,例如窗户或者文档,在AngularJS模板表达式中。它还可以防止进入潜在危险的特性,例如__proto__。尽管不被AngularJS团队视为安全边界,但更广泛的开发人员社区通常会认为其他方式。尽管绕过沙箱最初具有挑战性,但安全研究人员发现了许多这样做的方法。结果,最终将其从版本1.6中的Angularj中删除。但是,许多旧版应用程序仍然使用较旧版本的AngularJS,因此可能很容易受到伤害。

Angularjs沙箱如何工作?

沙箱通过解析表达式,重写JavaScript,然后使用各种函数来测试重写代码是否包含任何危险对象。例如,确保AftereObject()函数检查给定对象是否引用本身。这是一种检测窗户例如,对象。这功能通过检查构造函数是否引用本身,以大致相同的方式检测构造函数。

确保Afemembername()功能检查对象的每个属性访问,如果它包含危险属性,例如__proto__或者__ lookupgetter __,将阻止对象。这确保fefunction()功能预防称呼(),,,,申请(),,,,绑(), 或者构造函数()从被称为。

您可以通过访问自己看到动作中的沙箱这个小提琴并在第13275行中设置断点Angular.js文件。变量fnstring包含您的重写代码,因此您可以查看AngularJS如何转换它。

Angularjs沙箱如何逃脱?

沙盒逃生涉及欺骗沙箱以思考恶意表达是良性的。最著名的逃生使用修改后charat()在表达式中全球函数:

'a'.constructor.prototype.charat = []。

最初发现它时,AngularJS并不能阻止这种修饰。攻击通过使用[]。加入方法,导致charat()函数返回发送给它的所有字符,而不是特定的单个字符。由于逻辑ISIDEND()在AngularJS中的功能,它比较了它认为是一个字符与多个字符的单个字符。由于单个字符总是小于多个字符,因此ISIDEND()函数始终返回true,如以下示例所示:

ISIDENT = function(ch){return('a'<= ch && ch ='z'||'a'<= ch && ch && ch&ch <='z'||'_'====== ch || ch = || ch ==='$');} isinent('x9 = 9a9l9e9r9t9(919)')

一旦ISIDEND()功能是愚弄的,您可以注入恶意的JavaScript。例如,诸如$ eval('x =警报(1)')允许,因为Angularj会将每个字符视为标识符。请注意,我们需要使用Angularjs的$ eval()功能是因为覆盖charat()只有在执行沙盒代码后才生效。然后,此技术将绕过沙箱并允许任意JavaScript执行。

构建先进的Angularjs沙箱逃生

因此,您已经了解了基本的沙盒逃脱如何工作,但是您可能会遇到更严格的网站,这些网站对其允许的角色更具限制性。例如,一个站点可能会阻止您使用双重或单语引号。在这种情况下,您需要使用诸如string.fromcharcode()生成你的角色。虽然Angularjs阻止了进入细绳表达式中的构造函数,您可以使用字符串的构造函数来解决此处。这显然需要一个字符串,因此要构建这样的攻击,您需要找到一种在不使用单个或双引号的情况下创建字符串的方法。

在标准的沙箱逃生中,您将使用$ eval()要执行您的JavaScript有效负载,但在下面的实验室中$ eval()功能不确定。幸运的是,我们可以使用订单过滤器。一个典型的语法订单过滤器如下:

[123] | orderby:'一些字符串'

请注意|操作员的含义与JavaScript不同。通常,这是一个位或者操作,但在AngularJ中,它表示过滤器操作。在上面的代码中,我们发送数组[123]在左边订单右侧过滤。结肠表示要发送到过滤器的参数,在这种情况下是字符串。这订单过滤器通常用于对对象进行分类,但它也接受表达式,这意味着我们可以使用它来传递有效载荷。

现在,您应该拥有解决下一个实验室所需的所有工具。

AngularJS CSP旁路如何工作?

内容安全策略(CSP)以类似于标准沙盒逃逸的方式绕开工作,但通常涉及一些HTML注入。当CSP模式在AngularJS中处于活动状态时,它以不同的方式解析模板表达式并避免使用功能构造函数。这意味着上述标准的沙箱逃生将不再起作用。

根据特定策略,CSP将阻止JavaScript事件。但是,AngularJS定义了自己可以使用的事件。在活动中,AngularJS定义了一个特殊$ event对象,仅引用浏览器事件对象。您可以使用此对象执行CSP旁路。在Chrome上,有一个特殊财产$ event/event对象调用小路。该属性包含一系列对象,该对象导致事件被执行。最后一个属性始终是窗户对象,我们可以用来执行沙箱逃生。通过将这个数组传递到订单过滤器,我们可以枚举数组并使用最后一个元素(窗户对象)执行全局函数,例如警报()。以下代码证明了这一点:

<输入自动对焦ng-focus =“ $ event.path | orderby:'[]。constructor.from([1],alert)'

注意从()使用函数,它允许您将对象转换为数组,并在该数组的每个元素上调用给定函数(在第二个参数中指定)。在这种情况下,我们正在调用警报()功能。我们无法直接调用该函数,因为AngularJS沙箱将解析代码并检测到窗户对象被用于调用函数。使用从()相反,功能有效地隐藏了窗户来自沙箱的对象,使我们能够注入恶意代码。

绕过具有Angularjs沙箱逃生的CSP

下一个实验室采用长度限制,因此上述向量将不起作用。为了利用实验室,您需要考虑隐藏的各种方式窗户来自Angularjs沙箱的对象。一种方法是使用array.map()作用如下:

[1] .map(警报)

地图()接受作为参数的函数,并将其称为数组中的每个项目。这将绕过沙箱,因为引用了警报()正在使用功能,而无需明确引用窗户。要解决实验室,请尝试各种执行方式警报()没有触发Angularjs的窗户检测。

如何防止Angularj注射

为防止AngularJS注入攻击,请避免使用不受信任的用户输入来生成模板或表达式。

免费注册以跟踪您的学习进度

通过Portswigger的网络安全学院工作的好处beplay官网可以赌beplay体育能用吗
  • 练习在现实目标上利用漏洞。

  • 记录您从学徒到专家的发展。

  • 看看您在我们的名人堂中排名。

已经有一个帐户?在此登录