变种XSS:持久控制

tig3r · 2015/11/30 10:42

0x00 引言


首先声明,这不是一个新洞,看过 Homakov 文章(最后附)以及译文的人想必对这种漏洞有所了解。

但原文写的太过简单(没有说明利用条件、情景和特性),且译文和我的理解略有偏差,于是就有了这篇文章。

这种漏洞已经存在一段时间了,有没有被利用过尚不得知,虽然利用条件较苛刻,但是当符合条件的站点被攻击后, 影响面和影响程度巨大,并且普通用户不知如何清除, 可导致长期持续攻击。

2014年底的时候,这种漏洞的利用条件没有现在苛刻(比如没有Service-Worker-Allowed头),一年过来 W3C 对规范优化了不少(包括安全方面), 相信不久的将来,很快会被标准更新所扼杀了。

弥留之际,让这个漏洞放点异彩吧。

0x01 一切都从 serviceWorker 说起


Service Worker是基于Web Worker的事件驱动的,他们执行的机制都是新开一个线程去处理一些额外的,以前不能直接处理的任务。对于Web Worker,我们可以使用它来进行复杂的计算,因为它并不阻塞浏览器主线程的渲染。而Service Worker,我们可以用它来进行本地缓存,相当于一个本地的proxy。说起缓存,我们会想起我们常用的一些缓存技术来缓存我们的静态资源,但是老的方式是不支持调试的,灵活性不高。使用Service Worker来进行缓存,我们可以用javascript代码来拦截浏览器的http请求,并设置缓存的文件,直接返回,不经过web服务器,然后,做更多你想做的事情。

  • 我们可以用 javascript 代码来拦截浏览器的 http 请求,并设置缓存的文件,直接返回

相信很多人看到这句已经明白了,通过 js 来代理浏览器 http 请求,也就是说通过执行 js 代码来控制浏览器的请求, 很容易想到,利用 xss 来修改浏览器请求的返回内容。

可怕的是,即便 xss 漏洞被修复了,攻击仍然持续,并且渗透到攻击范围内的每一个 url。

并且,当用户察觉到攻击,并且理解这种攻击,进入chrome后台(chrome://appcache-internals), 进行手动清除攻击缓存,攻击仍未失效!当然了,还是有办法清除的,且无须用户手工操作(下文会演示)。

0x02 漏洞原理和演示


serviceWorker 的官方标准文档:http://www.w3.org/TR/service-workers/

其操作可以参考:https://github.com/w3c-webmob/ServiceWorkersDemos

首先 serviceWorker 只有在 https 页面中才可以调用 regist。

而 serviceWorker 需要 Promise 支撑,目前支持的浏览器如下:

支持 serviceWorker 的浏览器:

firefox 默认关闭 serviceWorker,可以通过 about:config 打开开关:

支持 fetch 方法(抓包)的浏览器:


开始尝试攻击:

首先在 https 站点中找到一个 Xss,利用 Xss 注册一个 serviceWorker.registration 实例:

#!js
navigator.serviceWorker.register(url).then(function(registration) {
console.log(registration);
});

注意到有个未知参数 url,这个 url 就是拿来放我们的攻击代码(假设我们能上传一个js到根目录):

#!js
var url = '//victim.com/evil.js'

有人说这太难了,往根目录上传 js 文件不可能,那么可以尝试在子目录/任何一个可能的目录上传js文件, 或者和 Homakov 一样,利用 jsonp 接口来代替这个恶意 js 文件。

serviceWorker.register 只支持请求文件返回头的MIME类型为:text/javascript, application/x-javascript, application/javascript

我们知道,jsonp 的 callback 经常是可控的,那么找到一个这样可以写代码的 jsonp 难不难?

Google it !

点击第一个链接:

可以看到,以 taobao.com 为例,第一个 jsonp 接口就存在这样的弱点:callback 可以写入任意代码。

退一步说,只要能输入 []!() 等几个符号,就能构造任意代码了。

以往安全工程师修复 jsonp 接口的 xss 漏洞,都是将页面的 mime 修改为 application/javascript, 或者将 callback 的参数中的html符号实体转义,就觉得杜绝 xss 了,看来以后得换个修法了

若 callback 仅仅代表一个函数名,何不只允许数字、字母和下划线呢?

往 “js/jsonp接口” 里写入恶意代码:

#!js
onfetch = function(e) {
e.respondWith(new Response('任意内容',{
headers
...
});
);
}

通过 onfetch 方法拦截 http 请求,并构造返回内容,比如返回:<script>alert(/xss/)</script>

所有在 evil 路径下的请求的内容都被篡改。


让我们本地测试还原一遍场景(注意:本地测试不需要 https):

首先打开网站:

打开正常页面:

这时候点击被攻击页面,此页面事先被注入了 XSS 脚本:

可以看到,这时候 serviceWorker 已经成功注册了

刷新页面,此时返回内容以及被修改了:

这时候再看正常页面,也被攻击了:

首页也是相同的情况:

关闭浏览器,再打开,依旧如此:

0x03 优势、局限性

  • 优势

    • 生存周期久(即便浏览器重启还在)
    • 一旦中招不易清除,包括用户和网站业务方
  • 局限性
    • 需要同域中同时存在 XSS 和弱点 JSONP(或可控js文件)
    • 感染路径受弱点 js 路径的限制
    • 被攻击站点必须是 https

实际利用中,若弱点JSONP路径中不存在网站业务,这个漏洞依然能发挥一定价值。

比如:杀死该JSONP路径以及其子目录的全部接口,从而导致网站无法正常使用。

0x04 中止及防范攻击


1. 如何中止攻击

从上文可以知道,即便 xss 被修复了或者消失了,攻击依然生效,那么如何中止攻击呢?

作为一个普通用户,首先尝试打开 chrome://inspect/#service-workers 查看存活:

的确可以看到被用作攻击的 Worker,点击 terminate 尝试中止:

可以看到以及被清理了,但是打开页面,攻击仍然存在!

浏览器中打开F12,在console中输入:navigator.serviceWorker., 可以看到有 getRegistration 和 getRegistrations 这两种属性。

查询文档:https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/getRegistration

尝试获取注册器,并且调用注销(由于用到 Promise,需要使用 then 调取结果):

#!js
navigator.serviceWorker.getRegistration()
.then(function(registration) {
registration.unregister();
});

这一次终于清除了。

而对于网站方,如何清除所有攻击呢?

只要将“清除代码”部署在一个未受感染的同域的页面里,当用户访问过后,自然就清除了。

2. 防范方法:

  1. Jsonp 接口的 callback 可以做白名单,或者只允许特定字符(比如数字、字母和下划线)。
  2. Jsonp所在域不应该存在 XSS(一切类型),至少不应该存在业务页面。
  3. 如果做不到2,Jsonp 所在 url 路径下不应该存在网站业务。
  4. 域名内不应存在用户可控的 js 文件。

变种XSS:持久控制的更多相关文章

  1. Metasploit 读书笔记-持久控制

    Meterpreter的persisitence脚本允许主任meterpreter代理,以确保系统重启之后Meterpreter还能运行。如果是反弹连接方式,可以设置连接攻击机的时间间隔。如果是绑定方 ...

  2. xss利用——BeEF#stage2(初始并持续化控制)

    全文概览 浏览器攻击方法流程 攻击浏览器一般分为几个阶段,如下图 整个过程分为三个步骤,第一步是初始化控制,第二步是持续控制,第三步是攻击.在第三步中的七个攻击方法是可以交叉的,比如可以同时攻击用户和 ...

  3. 教你玩转XSS漏洞

    什么是存储性XSS那? 通俗理解就是”xss“语句存在服务器上,可以一直被客户端浏览使用,所有登陆某一个存在”存储性xss“的页面的人,都会中招,可以是管理员,可以是普通的用户,所以他的危害是持续性的 ...

  4. Rootkit XSS

    0x00 XSS Rootkit介绍 Rootkit概念: 一种特殊的恶意软件            类型: 常见为木马.后门等            特点: 隐蔽 持久控制 谈到XSS,一般都是想到 ...

  5. [转]XSS现代WAF规则探测及绕过技术

    初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果 ...

  6. Web安全--XSS现代WAF规则探测及绕过技术

    XSS现代WAF规则探测及绕过技术初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过 ...

  7. XSS绕过小结

    0x00前言 我们友情进行XSS检查,偶然跳出个小弹窗,其中我们总结了一些平时可能用到的XSS插入方式,方便我们以后进行快速检查,也提供了一定的思路,其中XSS有反射.存储.DOM这三类,至于具体每个 ...

  8. 关于xss攻击学习的总结

    关于xss攻击,网上相关的介绍很多,一搜索也是一大堆,这里我就对自己感兴趣的一些内容做个总结. xss简单介绍 成因:xss是将恶意代码(多是JavaScript)插入html代码中. 分类: 1. ...

  9. XSS绕过速查表

    0x00 目录 0x01 常规插入及其绕过 1 Script 标签 绕过进行一次移除操作: <scr<script>ipt>alert("XSS")< ...

随机推荐

  1. MySQL 判断数据库和数据表是否存在

    MySQL 判断数据库和数据表是否存在 如何使用SQL查询语句,判断数据库和数据表是否存在? 1.判断数据库是否存在 查询SQL如下: select * from information_schema ...

  2. PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)

    1026 Table Tennis (30 分)   A table tennis club has N tables available to the public. The tables are ...

  3. subprocess以及常用的封装函数

    从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn.os.popen.popen2..commands. ...

  4. swift 第二课 基础知识-2

    setter 和getter 的使用--> 适合计算使用 struct Point { var x = 0.0, y=0.0 } struct Size { var width = 0.0, h ...

  5. Python3 Selenium自动化web测试 ==> 第十一节 WebDriver高级应用 -- 显示等待 + 二次封装

    学习目的: 掌握显示等待 掌握二次封装 正式步骤: step1:显示等待的代码示例 # -*- coding:utf-8 -*- from selenium import webdriver from ...

  6. FFMPEG 常用命令行

    目录 1. 分离音视频 2. 解复用 3. 视频转码 4. 视频封装 5. 视频剪切 6. 视频录制 7.叠加水印 8.将MP3转换为PCM数据 9. 推送RTP流.接收RTP流并存为ts文件 10. ...

  7. Unity动态批处理和静态批处理学习

    本文转自:http://blog.csdn.net/lyh916/article/details/45725499,请点击链接查看楼主大神原文,尊重楼主版权. 参考链接:Unity圣典:http:// ...

  8. luogu P1115 最大子段和 (dp)

    链接: https://www.luogu.org/problemnew/show/P1115 题面: 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一 ...

  9. chrome 监听touch类事件报错:无法被动侦听事件preventDefault

    先上错误信息: Unable to preventDefault inside passive event listener due to target being treated as passiv ...

  10. kafka 名词解释(四)

    为什么要了解这些名词的解释呢?因为在学一个新的知识或者领域的时候,我们需要知道它所定义的概念和名词意思,因为只有这样我们才能理解和掌握这个新的知识点,才能更加系统的掌握这个技术. 一.名词解释 1.b ...