浏览器漏洞挖掘思路

浏览器漏洞挖掘思路

二向箔安全学院

二向箔安全学院

已认证的官方帐号

已关注

246 人赞同了该文章

在 Web 安全中,服务端一直扮演着十分重要的角色。然而浏览器的问题也不容小觑,它也会导致信息泄露等诸如此类的问题。然而许多人还没有意识到浏览器对于安全的重要性。在这篇讲座(文章)中,我们会给读者带来挖掘浏览器漏洞的思路。

挖掘漏洞的思路

确定目标

我们先来看看浏览器的大概结构:

我们应该如何从诸多功能中选取攻击目标?这时,我们可以这样入手:

检查新功能

刚刚公布的功能往往没有被太多的人研究,因此更有可能存在潜在的隐患。因此,我们可以试着在下列产品挖掘漏洞:

更新时,我们最好注意一下它们的发行日记或者开发者的 blog。这样我们可以在最短的时间内得知新加入的特性。

Firefox 在该版本中提供了 link 预加载,这看上去十分有趣!这时,白帽子们可以以此功能为基础,对其进行安全检测,或者思考能否用它扩展供给面。

这是能让我们获取一手消息的相关平台:





检查冷门的老功能

这些功能常常不被人们重视:

同样地,我们也可以通过发行记录,或者从已有的研究报告中来探索这些功能。

打个比方:

我用 dialogArguments/returnValue 时,发现数据可以传输到任意窗口,此处是否有 SOP 绕过漏洞呢?

在用 Dailog 时,用户不能操作其它窗口,这有没有可能引发 UI 相关的问题呢?

枚举法 — 延伸已经存在的漏洞

我们可以去挖掘一下常见机制的问题:

研究已经被列为高危的功能也很奏效:


通过枚举法,我们能更好地集中到有效目标上。比方说:

在这里,我们可以得知IE可以运行 CSS 里的脚本,这是否意味着我们可以用它来进行 XSS 或者过滤器绕过呢?

从 commit 历史中挖掘漏洞

我们可以通过 git 历史来发现有趣的特性,比如说:


那么,我们如何发现值得关注的点呢:

我们再来看个例子,这是一个 Chrome 的 commit 记录:Https://goo.gl/xo6MMV

在 commit 之前,chrome 并没有对国际化字符进行一个良好的处理,以下图片的 a 实际上是Cyrillic 字符集的 U+0430(并不是英语的a0):

而:则是 U+0589,/是 U+2215


我汇报了这个问题,不过谷歌的解决方法是简单粗暴地禁用国际化域名。


这个 commit 记录则增加了两个潜在的攻击点:

当浏览器的一个功能有如下特点时,就往往意味着该功能有问题:

如果你知道要攻击的具体目标,那么你可以检查:

寻找字符集漏洞

通过浏览器对字符集处理的不当,我们可以挖掘许多问题。

各个浏览器对字符集的支持:

比方说 CVE-2013-5612,当你在 POST 请求中不指定字符集,那么它就会默认使用上一个被指定的字符集。我们可以利用支持上的差异性来达到绕过 XSS Auditor

寻找第三方库的漏洞

在 Pwn2Own 比赛中,来自长亭科技的研究人员成功地利用 SQLite 的内存损坏攻破了 Safari。同理,我们也可以在下面的lib中寻找漏洞:


其它攻击面

浏览器解析特殊协议(比如 about)也可能产生种种问题。当我们在 firefox 输入about:neterror?e=nssBadCert&d=Hello%20Guys!时,会有:


不忘学习前人经验

在我们找漏洞的同时,不要忘记学习前人的思路,我们应该多想想这些问题:漏洞是什么类型的?他们是怎么找到漏洞的?这个漏洞又为何出现的?
我们可以通过 Security Advisor(mozillachrome),以及私人 blog 来学习寻找漏洞的过程。

深入研究目标

为了深入探索一个目标,我们需要了解一下特性:

那么,我们应该用什么手段去深度挖掘呢?

就拿 Fetch API 来说:

fetch('http://api.example.jp/path',{  //我在这里能代入哪些地址?  method:'POST',                        //我还能添加哪些方法?  headers: {
    'Content-Type':'text/plain'           //这里是否能插入其它header或者MIME类型?  },
  body:'Hello World!'                   //body能插入哪些文字?  }).then(function(res){
    console.log(res.headers.get('Content-Type')); //我能读取哪些header的值?  }).catch(function(err){
  console.error(err);                   //抛出的错误时候包含了敏感信息?});

一个通过逆向找漏洞的例子:

edge 的一个 dll 包含了 XSS 过滤器的正则表达式,我们通过反向推导,或许可以找出 bypass payload。

探索有趣的行为

当我们发现了一些异常行为时,我们需要继续留心,因为这往往意味着更深层次的漏洞:

比方说 CVE-2012-3695,我们输入aaa%2F@example.com/时,%2F会被解码,并返回aaa/@http://example.com。本来被用做认证的 aaa%2F 被转化成了一个域名,这很有可能导致网络钓鱼。

挖掘这类漏洞有什么技巧呢?我们可以通过检查如下功能:

举几个例子:

在 CVE-2017-7789中,如果 firefox 在响应中收到多个 HSTS 头,那么 HSTS 就不会被启用。这时只要攻击者在普通的 HTTP 响应中包含几个 HSTS 头,那么他/她就可以绕过 HSTS 机制。

而在CVE-2015-4483里,我们在`feed:`后添加 URL,就可以绕过 Content Mixed Blocker


漏洞利用

当你找到一个漏洞后,你应该如何利用它呢:



让我们来看看 firefox 插件的一怪异行为,虽然我们可以利用该漏洞对页面的 title(标签页的标题)进行 HTML 注入,然而由于 CSP,我们并不能触发 XSS。

当我们仔细观察%TITLE%,%CONTENT%的顺序后,就会发现一个模板注入漏洞:

这样的话,只要我们插入 form 元素到%TITLE%时,即使不能 XSS,也能外带%CONTENT%给攻击者。


在实际情境中,许多网站会将用户输入插入到页面 title,就拿 Google 来说:

然而获取别人的搜索结果似乎没什么卵用,我们是否能得到更敏感的资料呢?

Gmail 似乎是一个不错的目标,我们可以发送一封恶意邮件给目标,当他/她展开该邮件时,页面 title 会更换为邮件标题:

当用户点击 Click Me 时,邮箱信息就会被传送给攻击者


至此,我们成功地将该漏洞变废为宝。


作者:Masato Kinugawa


二向箔安全学院:主要专注于 Web 安全领域,团队曾为 Google、Apple、微软、W3C、Adobe、腾讯、阿里等输出过安全能力。致力于推进网络空间安全领域知识的创新和传播,为广大信安技术人士提供最前沿的安全技能。

二向箔安全学院twosecurity.cn图标

微信公众号:二向箔安全(twosecurity),这里有最新的课程资讯,优惠活动及免费干货分享。


编辑于 2019-10-30

网页浏览器

Web 安全测试

漏洞挖掘

赞同 2463 条评论

分享

收藏

文章被以下专栏收录