保证Web安全不容易,其中很多精力都要花在浏览器上面。浏览器是一道重要的阻击线。
在一个假想的末日高科技的世界里,每一个站点都失陷成为恶意站点,而浏览器在这种情况应该依然能保证你的计算机安全。而要达到这个安全乌托邦,我们任重道远啊。
接下来该解释一下浏览器攻防的含义了。我们可以把这个过程分解为几个阶段,而不只满足于消除现有弱点,或者苟延残喘。为此,我们找到了一套方法,希望能够保证现有地带的持久安全。
下面我们就介绍这个方法,以及相关手段适用的情形,如图1-1所示,其中包含一个攻防流程和相应的路径。
图1-1 本书的攻防方法
这套方法的目标是涵盖浏览器攻防的各个方面,而本书接下各章也完全按照这套方法组织。每一章围绕一个阶段深入阐述相关的技术细节。一章一章地往后看,你会逐步加深对这套方法的理解。
对某些目标而言,这套方法中给出的路径可能比较简单,因为有很多免费安全工具可以自动完成相应过程。但另外一些情况下,可能就要具体问题具体分析了。
浏览器攻防方法由三部分构成,在图1-1中用三个大的虚线框表示。这样从最高层面来说,整个攻击过程就分三个阶段,首先是初始化,然后是持久化,最后是攻击。
第一个阶段是初始化,是整个过程的第一步。然后是相持阶段,考验你对浏览器的理解。这一步要在目标浏览器或浏览器所在设备上筑起防御工事,也是浏览器陷落的初始阶段。
真正的挑战来自于下一阶段。攻击阶段包含七大攻击方法,下面会简单介绍,余下几章会分别详细介绍。在介绍不同的方法时,我们会展示浏览器不同的侧面和可以利用的弱点。其中一些攻击技术的运用可能会在其他浏览器中表现为初始化阶段,从而导致攻击的循环,以及受害范围扩大。
1. 初始化
初始化只有一个阶段。这个看似至关紧要的阶段却是浏览器攻防最为紧要的阶段。没有这个阶段,任何攻击都不可能发生,目标浏览器也不会进入攻击者的视野。
初始控制
每一次攻击都以在浏览器中运行指令为开端。为此,浏览器必须要遭遇(并执行)你控制的指令。
这是第2章的主题,讨论一些方法,给浏览器布下陷阱,诱使、欺骗或者强迫浏览器遇到你的指令,然后更重要的是要执行任意代码。
2. 持久化
成功初始化攻击后,怎么扩大你对目标的控制范围?你要保持对浏览器的控制,而且要能够发动进一步攻击。
持久化控制
听说过一个精灵和三个愿望的故事吗,就是如何你遇到一个精灵,它会答应你三个愿望。可爱的受害者会对精灵说出自己的愿望,而且最后一个愿望是希望能许下更多愿望。这对精灵来说,不斥为一个压力测试啊!
再说回与被害浏览器保持通信吧。你的初始代码要让浏览器不断向你询问下一个愿望。你在纠缠阶段放出精灵,迷住浏览器让它不断答应你的要求。
就像精灵会在一阵烟雾中消失一样,这种状态也可能永远维持。想要不断地许愿,还得看用户后续的操作。用户可能会一下子关闭发动攻击的标签页,或者又用它打开了另一个网站。这样的话,JavaScript就会被清除,通信渠道也就关闭了。
在得意忘形地想要发动下一次攻击之前,明智的做法是耐心等待,而不是对浏览器过分施加影响。这个阶段,你要尽量降低失去浏览器控制权的可能,不让用户切换网址,或者关闭浏览器。
实现相持的目标也分几个不同的层面。最重要的是要有耐心,尽可能完全地利用这个阶段,为下一次攻击做好准备。因为你控制浏览器的时候越长,追究出来的攻击面就越广,你的攻击就越具有可控性。
应该注意的是,有时候在发起后续攻击期间,成功的攻击会揭示出巩固阵地的方法,从而提升控制水平。正因为如此,图1-1中这两个阶段之间才画了一个双向箭头。经验会告诉你什么时候应该巩固控制渠道而非发起攻击,什么时候发起攻击有助于幸控制渠道的灵活性和持久性。
3. 攻击
在这个阶段,就要利用对浏览器的控制,以当前情势为基础,探索攻击的可能性。攻击形式有很多,包括对浏览器的“本地”攻击,对浏览器所在操作系统的攻击,以及对任意位置系统的攻击。
细心的读者可能会发现在这一阶段的方法,绕过同源策略位于其他方法之首,而且高高在上。这是为什么呢?因为这个方法在攻击的每一步都用得着,同源策略是其他攻击阶段必须绕过和利用的安全措施。
另一个同样比较明显的地方就是攻击方法中心位置的循环箭头。倒不是说一定会循环起来,重要的是其中一个环节的成功攻击,很可能成为另一个环节成功攻击的先兆。从这个意义上说, 这个阶段应该经常权衡利弊,什么方法最有效,回报最丰厚,就采用什么方法。
这里给出了七种可以对浏览器发起的核心攻击方法。至于到底应该采取哪种方法,要根据很多因素来决定。最主要的有渗透的范围、期望的目标以及被害浏览器的能力。
3.1 绕过同源策略
可以把SOP看成浏览器的一个重要沙箱。如果你能绕过它,那只要访问之前被浏览器封死另一个来源,即可自动地成功实现攻击。绕过SOP,就可以使用后续一系列可用的攻击方法对新出现的源进行攻击。
关于SOP的深入解释将在第4章进行。而只要你绕过它,就可以进行多种攻击又不会发生干扰。第4章将介绍一些矛盾点,以及如何利用浏览器基本安全组件中的这些漏洞。
3.2 攻击用户
浏览器黑客方法中的第一个选项是攻击用户,具体将在第5章讨论。这一章涵盖涉及浏览器用户的攻击技术,以及他们对攻击者所控制环境的潜在信任。
使用浏览器提供的手段,以及你控制页面的能力,可以创造一个受控的环境,让用户输入敏感信息,以便捕获和利用。
可以给用户布下陷阱,让他们在不知不觉中让渡权限,并触发其他操作,比如运行任意程序或者授权访问本地资源。可以生成隐藏的对话框和透明的框架,或者控制鼠标事件以辅助实现以上目的,向用户展示一个假象以掩盖用户界面的真实功能。
3.3 攻击浏览器
攻击浏览器就是直接攻击浏览器的核心。第6章会带你探索指纹方法和全面利用。
浏览器是一个巨大的攻击面,它有着众多API和各种存储和取得数据的抽象机制。毫不奇怪,浏览器很多年来一直被自身这样或那样的隐患所困扰。更加令人惊讶的是,浏览器开发人员每次都解决问题都做得不赖。
3.4 攻击扩展
如果你攻击核心浏览器失败了,那正门就等关闭了。此时,可以考虑攻击它所安装的外部程序(可能会很多)。
相关内容会在第7章介绍,主题就是攻击扩展。这一章将讨论扩展变体及特殊扩展实现。
你会看到很多种扩展的隐患,利用这些隐患,可以实现跨源请求,甚至执行操作命令。
3.5 攻击插件
插件一直是浏览器隐患多发区。插件与扩展不同,它属于第三方组件,由它服务的网页独立初始化(而非一直整合到浏览器中)。 攻击插件的方法将在第8章介绍,包括攻击Java和Flash等普遍存在的插件。相关内容还有如何检测浏览器安装了哪些插件,了解该领域的研究者已经发现了哪些可以利用的弱点,以及哪些旨在保护插件安全的手段被滥用因而可以绕过,等等。
3.6 攻击Web应用
浏览器就是为了使用Web而生的,因此攻击Web应用就是自然而然的了。这个话题包括使用浏览器的标准功能攻击Web应用,就在第9章。 想象一下,很多组织的内部网都可以访问大量应用。如果另一个标签页中的外部网站能访问这些内部应用会怎么样?你会发现受到防火墙保护的内部应用在外部攻击面前居然形同虚设。
3.7 攻击网络
你会发现居然有浏览器连接到了非标准的端口,而且这种情况相当普遍。很多服务器安装的应用都随意指定端口,而互联网上的有些网站甚至不使用80和443端口发布内容。
如果浏览器根本不会连接服务器怎么办呢?如果浏览器连接到了一个目的完全不同,而且还使用了完全不同协议的服务呢?这种情况不会违反SOP,而且在多数情况下,从浏览器安全控件角度看都是合法的。改变这些浏览器的行为可以达到深度攻击的目的。
攻击网络的方法会涉及OSI网络模型的底层。第10章,我们就来讲解这些技术,一视同仁地将它们应用到攻击任意TCP/IP网络。