行为模糊引起浏览器崩溃

图片

在本文中,我将告诉您如何使用模糊测试在Firefox中查找多个崩溃。 通常,模糊测试的目的是查找表明内存损坏的故障,但我的目标却不同:我要检测浏览器的意外反应。 这些字符可以是打开或关闭异常标记的字符,也可以是JavaScript解析器忽略的字符。 这样的意外反应通常可以用来进行XSS攻击,绕过安全过滤器并避免使用JavaScript沙箱。

我要谈的第一个错误是如何以其他方式关闭HTML注释。 如果您阅读HTML规范,就会知道可以使用->或-!>关闭注释。 但是如何做不同呢? 开始模糊的好问题! 您只需要生成将给出答案的代码即可。

早在2008年,当我将Shazzer组装成模糊浏览器的行为时,我被限制为每页大约10,000个方向。 今天,在2019年,一切运行得更快,因此我们可以更频繁地进行测试。 另外,使用DOM可以加快模糊测试的速度,因为您不再需要将每个方向都添加到当前文档中。 值得注意的是,这是一种不可靠的方法,因为您可以获得不同的结果。 确实,我发现DOM在属性参数(例如href)中允许空值的情况,但HTML解析器不允许。 这些仍然是非关键性的失败,但是您不能总是信任结果以完整了解HTML解析器将执行的操作。 但是,在大多数情况下,它可以工作,并且比服务器端的HTML输出要快得多。

第一步已经采取-我们有一个问题:“哪些字符可以关闭HTML注释?”。 为了解决这个问题,我们需要使用现有的字符来关闭HTML注释,并模糊我们不知道的字符。 下一步是使用适当的模糊测试软件。 就我而言,我使用Hackvertor工具,但是使用本地Web服务器可以达到相同的结果。 该工具的想法是将输入放入输入字段,对标签进行一些转换,然后对输出进行一些处理。 由于没有任何要转换的内容,因此我们可以将代码直接放在输出字段中。 因此,单击文本输出区域,然后创建一个用于存储模糊字符的数组和一个用于测试HTML的div元素:

log = []; div=document.createElement('div'); 

然后,我们需要模糊处理超过1,000,000个Unicode字符,或更确切地说是0x10ffff。 我们需要一个简单的for循环:

 for(i=0;i<=0x10ffff;i++){ 

然后,我们重复使用为每个字符创建的div元素。 在这种情况下,我将测试!之后的位置,以便在!之后输入字符。.然后,我使用img元素查看模糊是否成功。 如果该元素存在,则HTML注释已关闭,并且我们有一些有趣的字符!

 div.innerHTML = '<!-- --!'+String.fromCodePoint(i)+'><img>-->'; 

最后,使用querySelector检查img是否存在并将字符添加到日志中。 然后关闭if语句和for循环。 最后,我在左侧的输入字段中输入结果:

 if(div.querySelector('img')){ log.push(i); } } input.value=log 

这是代码的完整版本 。 您需要在Firefox中打开URL,然后将输入的字符放在输出字段中,然后单击“执行JS”按钮以模糊字符。 完成模糊测试后,您应该在输入字段中看到数字,它们与成功的字符代码相对应。 在撰写本文时,Firefox(版本67)仍允许换行符-\ n和\ r-在!之后,以关闭注释。 我被告知,此问题已在Firefox的未来版本中修复。 因此,模糊测试的最后一步是构建有效负载,这非常简单。 您需要用字符替换字符代码并添加XSS有效负载:

 <!-- --! ><img src=1 onerror=alert(1)> --> 

通过将以上内容粘贴到输出字段中,然后单击“测试HTML”,可以再次使用Hackvertor来测试其操作。 应该出现一个警告窗口,因为Firefox(版本67)将换行作为最终注释的一部分。

因此,这使我们能够在Firefox HTML解析器中找到非严重错误。 让我们找到另一个! 我们需要一个新问题:“哪些字符可以打开HTML注释?”。 现在,我们将使用HTML注释来超越现有的HTML属性,而不是超越现有的HTML注释。 可以肯定,大家都知道可以使用<!打开HTML注释。 - 可以吗 我们将再次使用相同的代码,但是这次更改了innerHTML的用途,以检查注释是否打开:



因此,我们模糊的符号将在第一个连字符之后。 如果角色成功创建了开头的HTML注释,它将在div元素上进行注释,从而退出title属性。 这次,当我们运行“ Execute JS”时,在Firefox(版本67)中得到了两个结果:“ 0.45”。 应该使用代码45,因为它是连字符,但0是NULL字符! 这意味着Firefox将序列<!-NULL-解释为开放注释。 某种游戏! (我认为浏览器提供商需要更多的行为模糊测试)。 为了完成这个测试案例,现在我们需要创建方向。 让我们做同样的事情:再次,将String.fromCodePoint函数替换为NULL和XSS符号,其方向如下:

 document.body.innerHTML = '<!-\x00- ><div title="--><img src=1 onerror=alert(1)>"></div>'; 

让我们切换到JavaScript而不是HTML。 我测试了每种浏览器,对不起Mozilla,但是Firefox又在制作某种游戏。 我感到鼓舞的是,来自jinmo123 鸣叫的模糊使用有趣的ES6新功能来调用函数而没有括号。 我想到的一个模糊问题是:“在in或instanceof运算符之后允许使用哪些字符?” 然后,我们再次在Hackvertor中创建代码,它遵循类似的模式,但是这次不使用DOM。 首先,创建一个数组和一个for循环:

 log = []; for(i=0;i<=0x10ffff;i++){ 

然后,我们将使用eval而不是innerHTML来模糊我们的值。 首先,我们需要使用try catch块来检测由无效字符引起的任何异常。

 try{ eval("/a/"+String.fromCodePoint(i)+"instanceof function(){}"); 

eval函数用于查看我们的JavaScript是否有效。 如果是这样,它将转到下一行;如果不是,它将抛出将被注意到的异常,然后转到下一个字符。 下一行仅注册字符,然后关闭try catch块和for循环。 然后,该函数将结果显示在输入字段中。

 log.push(i); }catch(e){} } input.value=log 

如果使用“ Execute JS”运行此代码,则会得到很多结果! Firefox忽略许多字符。 如果您在Chrome上尝试该代码,则将获得更合理的结果。 在您要使用的输入字段中找到字符代码,在我的情况下为十六进制的“ 1114110”或“ 0x10fffe”。 现在我们将创建我们的JavaScript向量:

 eval("1337"+String.fromCodePoint(1114110)+"in"+String.fromCodePoint(1114110)+"alert(1337)"); 

您也可以在SVG脚本中想象它:



DEDIC.SH上提供了带有2019 Intel可扩展处理器的专用服务器的最新双处理器配置:
  • 2个Xeon Silver 4214-总共24个内核
  • 2x Xeon Gold 5218-总共32核
  • 2个Xeon Gold 6240-配置36核。

具有两个至强银4214的服务器的成本- 从15210卢布/月
我们也准备为您收集任何配置 - 写信给我们

如果不需要大功率的专用服务器-您需要150卢布/月的VDS

Source: https://habr.com/ru/post/zh-CN455602/


All Articles