首页
社区
课程
招聘
[翻译]没有括号和分号的XSS
发表于: 2019-7-21 23:33 9743

[翻译]没有括号和分号的XSS

2019-7-21 23:33
9743

几年前我发现了一种在JavaScript中利用调用onerror和throw函数而不使用括号的技术。它的工作原理是将onerror处理程序设置为您要调用的函数,该throw语句用于将参数传递给函数:

onerror每次创建JavaScript异常时都会调用该处理程序,并且该throw语句允许创建包含发送到onerror处理程序的表达式的自定义异常。因为throw是一个语句,所以通常需要onerror使用分号来完成赋值,以便开始一个新的语句而不是形成一个表达式。

如果遇到一个过滤括号和分号的网站,能够使用这种技术来执行一个没有分号的函数。第一种方法非常简单:可以使用花括号来形成一个块语句,在其中进行onerror分配。在块语句之后,可以使用不带分号的throw (或新行):

上面构造出来的语句很好用,但还有另外一个更适合的选择。由于throw语句可以接受一个表达式,所以可以让onerrorthrow语句中进行赋值,并且因为表达式的最后一部分被发送到onerror处理程序,所以将使用所选参数调用该函数。以下是它的工作原理:

如果已尝试运行代码,则会注意到Chrome将发送到异常处理程序的“Uncaught”字符串作为前缀。

在我之前的博客文章中,我展示了如何使用eval作为异常处理程序并评估字符串。回顾一下,你可以在字符串前加上一个=,然后将'Uncaught'字符串变成一个变量并执行任意JavaScript。例如:

发送到的字符串eval是“ Uncaught=alert(1337)”。这在Chrome上可以执行,但在Firefox上,异常会以两个字符串“uncaught exception”作为前缀,这当然会在评估时导致语法错误。我开始寻找方法。

另外值得注意的是,从控制台执行throw行,onerror/throw技巧无效。这是因为当throw在控制台中执行语句时,结果将发送到控制台而不是异常处理程序。

Error在Firefox中使用该函数创建异常时,它不包含“Uncaught”前缀。但相反,只有字符串Error

throw new Error("My message")//Error: My message

我显然无法调用该Error函数,因为它需要括号,但我想如果我使用带有Error原型的对象文字来模拟行为。实际上这不起作用 - Firefox仍然使用相同的字符串作为前缀。然后我使用Hackability Inspector)检查Error对象以查看它具有的属性。我将所有属性添加到对象文字中并且它有效!我一个接一个地删除了一个属性,找到了所需的最小属性集:

您也可以使用fileName属性在Firefox上发送第二个参数:

我在推特上发布了这些东西@terjanq@cgvwzq(Pepe Vila)后面跟着一些很酷的向量。这里@terjanq删除所有字符串文字:

通过使用类型错误将字符串发送到异常处理程序,Pepe完全突破了对throw语句的限制。

原文:8a3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8%4u0@1M7%4N6A6k6$3N6W2M7W2)9J5k6h3&6W2N6q4)9J5c8X3u0D9L8$3N6Q4x3V1k6^5M7%4y4Q4x3X3c8%4K9i4c8Z5L8%4g2@1i4K6u0V1M7r3q4J5k6h3&6@1K9r3g2K6k6i4y4Q4x3X3c8S2L8X3c8Q4x3X3c8K6k6h3#2A6i4K6u0V1j5$3!0D9L8$3&6K6

翻译:Lipss

校队:skeep


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 5752
活跃值: (5864)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习啦
2019-12-31 20:58
0
游客
登录 | 注册 方可回帖
返回