http://mdsec.net/auth/405/
如果进一步扩展上述基本攻击,攻击者可以在其界面中使用复杂的脚本代码,以诱使受害用户执行更加复杂的操作,而不仅仅是单击按钮。比方说,要实施攻击,需要诱使用户在输入字段(如转账页面的“金额”字段)中输入一些文本。在这种情况下,攻击者可以在其用户界面中包含一些诱使用户输入文本的内容,如用于输入电话号码以赢得奖励的表单。然后,攻击者的页面中的脚本可以对进行键击选择性处理,在用户输入相关字符时,将键击操作有效传递到目标界面,从而填写所需的输入字段。如果用户输入攻击者不希望在目标界面中输入的字符,该键击将不会传递给目标界面,攻击者的脚本将等待下一次键击。
另外,攻击者的页面中可以包含诱使用户执行拖动鼠标操作(就像玩简单的游戏一样)的内容。随后,在攻击者的页面中运行的脚本将选择性地处理生成的操作,使用户在不知情的情况下选择目标应用程序界面中的文本,并将其拖动到攻击者的界面中的输入字段中(或相反)。例如,在针对Web邮件应用程序实施攻击时,攻击者可以诱使用户将电子邮件中的文本拖动到其能够读取的输入字段中。或者,攻击者可以诱使用户建立某种规则,向某转发所有电子邮件,并将所需电子邮件地址从攻击者的界面拖动到定义该规则的表单的相关输入字段中。此外,由于链接和图像均可以作为URL进行拖动,攻击者甚至可以通过诱发拖动操作从目标应用程序的界面中拦截敏感URL,包括反CSRF令牌。
有关这些和其他攻击向量,及其实施方法的详细说明,请参阅以下文档:
http://ui-redressing.mniemietz.de/uiRedressing.pdf
在UI伪装攻击最初受到广泛关注时,许多知名的Web应用程序寻求采用一种称为破坏框架(framebusting)的技术来防范这类攻击。在某些情况下,这种技术已用于防范其他基于框架的攻击。
破坏框架可以表现为各种形式,但基本上,它是指每个相关的应用程序页面都会运行一段脚本来检测自己是否被加载到iframe中。如果是,应用程序会尝试“破坏”该iframe,或执行其他防御性操作,如重定向到错误页面或拒绝显示应用程序自己的界面。
斯坦福大学2010年的一项研究表明,排名前500的网站均采用了“破坏框架”防御技术。同时,这项研究还发现,这些防御都可以通过某种方式突破。突破这种防御的方法因每种防御的实施细节而异,下面我们通过一段“破坏框架”示例代码来加以说明:
这段代码检查页面本身的URL与浏览器窗口中的顶部框架的URL是否匹配。如果不匹配,则说明页面已加载到子框架内。在这种情况下,脚本会尝试将页面重新加载到窗口内的顶层框架中,从而“逃离”该框架。
实施UI伪装攻击的攻击者可以通过各种方式避开这种防御,将目标页面成功嵌入框架。
由于攻击者的页面控制着顶层框架,因而可以重新定义top.location的含义,在子框架尝试引用它时导致异常。例如,攻击者可以在Internet Explorer中运行以下代码:
这段代码将location重新定义为顶层框架中的本地变量,在子框架中运行的代码无法访问该变量。
顶层框架可能会钩住window.onbeforeunload事件,从而在“破坏框架”代码尝试设置顶层框架的位置时运行攻击者的事件处理程序。这时,攻击者的代码可以对返回HTTP 204(无内容)响应的URL执行进一步的重定向。这会导致浏览器取消重定向调用链,使顶层框架的URL保持不变。
顶层框架可以在将目标应用程序加载到子框架中时定义sandbox属性。这会在子框架中禁用脚本,同时将其cookie保持为启用状态。
如第12章所述,顶层框架可以利用IE XSS过滤器在子框架中选择性的禁用“破坏框架”脚本。当攻击者的页面指定iframe目标的URL时,可以创建一个新参数,在参数值中包含一段适当的“破坏框架”脚本。IE XSS过滤器将标识该参数值及目标应用程序返回的响应中的脚本代码,并禁用响应中的脚本,设法为用户提供保护。