基于改进CSP策略的XSS防御系统和方法与流程

文档序号:16630924发布日期:2019-01-16 06:33阅读:246来源:国知局
基于改进CSP策略的XSS防御系统和方法与流程

本发明属于web安全领域,涉及xss(跨站脚本攻击)防御方向,通过设计一种基于改进csp(内容安全策略)的xss防御技术,命名为jscsp(基于javascript的csp),实现web应用的安全性需求。具体讲,涉及基于改进csp策略的xss防御方法。



背景技术:

目前主流的xss攻击防御主要可以分为三种:基于waf(web应用防火墙),基于规则过滤以及基于安全策略的防御。其中前两种方式容易出现误报,漏报的情况,并且不能针对不同的web应用采取不同的防御手段。而基于安全策略的防御则可以有效地改善这些缺点。csp由w3c(万维网联盟)组织制定,是目前主流的基于安全策略的防御方式。csp包含多种策略指令,大概格式如下:

default-src'self';script-src'self”userscripts.example.com';img-src'statics.example.com';

清单1:csp指令格式

清单1中共有三组策略指令default-src,script-src和img-src,分别对不同html元素的源进行了限制。其中script标签的源只能来源是自身的域或者是userscripts.example.com,img标签的源只能是statics.example.com,其它标签的源则只能来源于网页自身的域。

csp指令通常在http头部给出,然后由浏览器内核解析并执行。然而这种实现方式存在一些缺点:a)不同的浏览器对csp的支持程度不同,存在兼容性问题;b)csp只能对整个页面进行整体限制,不能做更细粒度的控制;c)csp策略指令只能手动制定,不够灵活。



技术实现要素:

为克服现有技术的不足,本发明旨在提出一种新型的基于安全策略的xss防御技术jscsp。相比csp,它具有更丰富的特性和更细粒度的控制,并且完全由javascript实现,可以兼容不同版本的浏览器。利用此种技术,能够在不修改后端源代码的情况下,有效地防御xss攻击。为此,本发明采用的技术方案是,基于改进csp策略的xss防御系统,由四个部分组成,策略生成模块,策略执行模块,后端模块以及浏览器本地存储模块,其中策略生成模块根据纯净的web页面,即不含恶意代码的页面生成对应的安全策略,并向后端模块下达命令,将策略存储在浏览器本地存储模块中,策略执行模块用于向后台下达命令,获取之前生成的安全策略并执行;后台端模块还会对恶意脚本所发出的请求进行拦截。

安全策略具体包括:

1)沙盒策略:通过加入一条策略指令”eval”:false来禁止javascript函数eval的使用;

2)元素策略:用于限制页面中dom元素的源,另外通过标记script标签,以及含有事件监听器event-handler的元素的位置,来生成白名单策略;

3)数据策略:用于保护dom文档中的重要数据,使之无法被攻击者读写,这些数据包括form表单的password输入框的value值,document对象的cookie属性,window对象的localstorage属性。

策略生成具体地:

1)沙盒策略:对于未在正常页面使用过的危险对象或函数的get方法添加钩子,从而确定哪些函数或对象没有使用过,然后据此生成相应的策略指令;

2)dom元素策略:所有dom树里面的元素会被提取出来,他们的标签名会被保存到一个白名单中;

3)数据策略:使用object.defineproperty方法来限制javascript脚本对这些重要数据的读写权限。

策略执行具体地:

首先会停止渲染dom树,以防恶意脚本执行,然后重新加载当前页面并且将内容复制到一个安全的dom树中,这个dom树中的所有节点都会被设置为不可修改的状态,从而阻止攻击者修改某些已有的dom属性,在此之后浏览器本地存储里面的安全策略将会被取出,并交给策略执行器去执行,dom树将会被修改,恶意元素会被打上标记然后随后删除,策略禁止的危险函数和对象将会被直接删除,从而得到一个干净的dom树,如果在安全策略中有某些数据或者是元素需要被保护,则采用dom监听器去监听对这些元素的访问,并把重要的数据置为不可读写的状态,同时向dom中加入了一些内联脚本,这些脚本会给那些用来新建或者是添加标签的函数添加函数钩子hook,这些函数钩子会对动态创建的元素施加类似的限制;最后,修改后的dom文档内容以及施加函数钩子所需的脚本会被写入原页面中的dom树,并交由浏览器继续渲染。

基于改进csp策略的xss防御方法,步骤如下:

第一步,在浏览器上安装并加载jscsp扩展;

第二步,选定需要添加xss防御的web页面,首先需要保证该页面未被注入xss攻击代码;

第三步,待第二步中的页面加载完毕后,生成安全策略,这些安全策略包括三类:沙盒策略、dom元素策略和数据策略;

第四步,jscsp执行模块则会根据已生成的安全策略对攻击向量进行过滤,从而得到纯净的页面。

安全策略具体包括:

1)沙盒策略:通过加入一条策略指令”eval”:false来禁止javascript函数eval的使用;

2)元素策略:用于限制页面中dom元素的源,另外通过标记script标签,以及含有事件监听器event-handler的元素的位置,来生成白名单策略;

3)数据策略:用于保护dom文档中的重要数据,使之无法被攻击者读写,这些数据包括form表单的password输入框的value值,document对象的cookie属性,window对象的localstorage属性。

策略生成具体地:

1)沙盒策略:对于未在正常页面使用过的危险对象或函数的get方法添加钩子,从而确定哪些函数或对象没有使用过,然后据此生成相应的策略指令;

2)dom元素策略:所有dom树里面的元素会被提取出来,他们的标签名会被保存到一个白名单中;

3)数据策略:使用object.defineproperty方法来限制javascript脚本对这些重要数据的读写权限。

策略执行具体地:

首先会停止渲染dom树,以防恶意脚本执行,然后重新加载当前页面并且将内容复制到一个安全的dom树中,这个dom树中的所有节点都会被设置为不可修改的状态,从而阻止攻击者修改某些已有的dom属性,在此之后浏览器本地存储里面的安全策略将会被取出,并交给策略执行器去执行,dom树将会被修改,恶意元素会被打上标记然后随后删除,策略禁止的危险函数和对象将会被直接删除,从而得到一个干净的dom树,如果在安全策略中有某些数据或者是元素需要被保护,则采用dom监听器去监听对这些元素的访问,并把重要的数据置为不可读写的状态,同时向dom中加入了一些内联脚本,这些脚本会给那些用来新建或者是添加标签的函数添加函数钩子hook,这些函数钩子会对动态创建的元素施加类似的限制;最后,修改后的dom文档内容以及施加函数钩子所需的脚本会被写入原页面中的dom树,并交由浏览器继续渲染。

本发明的特点及有益效果是:

1.该技术能有效抵御各种xss绕过技术,例如编码和混淆,因为它首先会将页面解析成一个完整的dom(文档对象模型)树,然后再进行过滤处理,而这个时候各种编码和混淆都会被还原。

2.该技术所有逻辑均由javascript代码实现,能方便地部署到所有支持es5(即ecmascript5,是一种主流的javascript语言版本,现代浏览器均支持)的浏览器中,兼容性良好。另外,对于普通用户,安全策略可以自动生成,减少了用户的学习成本。

附图说明:

附图1整体架构图。

附图2策略生成模块。

附图3策略执行模块。

具体实施方式

1.整体架构

本发明涉及的xss防御技术整体结构如附图1所示,主要由四个部分组成,策略生成模块,策略执行模块,后端模块以及localstorage(浏览器本地存储)。其中策略生成模块可以根据纯净的web页面(即不含恶意代码的页面)生成对应的安全策略,并向后台模块下达命令,将策略以json(一种轻量级的数据交换格式)的形式存储在localstorage中。策略执行模块则可以向后台下达命令,获取之前生成的安全策略并执行。另外,后台模块还会对恶意脚本所发出的请求进行拦截。

2.策略格式

jscsp中的安全策略有三种,清单2中给出了一个例子:

清单2:jscsp策略格式

4)沙盒策略(2~5行)。某些javascript函数和对象比较危险,容易被攻击者利用,其中对象包括proxy,xmlhttprequest,函数只包括eval。如第3行所示,我们可以通过加入一条策略指令”eval”:false来禁止eval函数的使用。

5)元素策略(6~32行)。本类策略用于限制页面中dom元素的源,另外通过标记script标签,以及含有event-handler(事件监听器)的元素的位置,来生成白名单策略。

6)数据策略(33~38行)。本类策略用于保护dom文档中的重要数据,使之无法被攻击者读写。这些数据包括form表单的password输入框的value值,document对象的cookie属性,window对象的localstorage属性。

3.策略生成

附图2显示了jscsp在策略生成部分的架构。首先我们需要等待页面完全加载完毕,否则一些资源可能会被错误地添加到黑名单中。然后页面中的javascript脚本,html标签,敏感的数据会被dom解析器解析出来,然后下面的三种安全策略将会自动生成。

1)沙盒策略。这种安全策略是用来禁止某些未在正常页面使用过的危险对象或函数。我们会给这些函数,或对象的get方法添加钩子,从而确定哪些函数或对象没有使用过,然后据此生成相应的策略指令。例如eval没有被使用过,则会添加一条策略指令”eval”:false。

2)dom元素策略。所有dom树里面的元素会被提取出来,他们的标签名(比如img)会被保存到一个白名单中。另外,某些元素(iframe,script)的href或者是src属性会被保存到源白名单中,另外,一些常用的站点的源也会被加入其中。对于那些内联脚本,我们会标记它们在dom树中的位置,并生成相应的安全策略。出现在其它位置的恶意脚本随后会被删除。

3)数据策略。我们还会添加一些策略指令用于保护重要的数据。我们会使用object.defineproperty方法来限制javascript脚本对这些重要数据的读写权限。

4.策略执行

附图3显示了jscsp在策略执行部分的架构。在这个阶段,假设用户访问了一个被污染的页面(被插入了恶意脚本)。首先我们的脚本会停止渲染dom树,以防恶意脚本执行(步骤1)。然后我们重新加载当前页面并且将内容复制到一个安全的dom树中,这个dom树中的所有节点都会被设置为不可修改的状态,从而阻止攻击者修改某些已有的dom属性(步骤2)。在此之后浏览器本地存储里面的安全策略将会被取出,并交给策略执行器去执行。dom树将会被修改,恶意元素会被打上标记然后随后删除,策略禁止的危险函数和对象将会被直接删除,从而得到一个干净的dom树(步骤3,4)。如果在安全策略中有某些数据或者是元素需要被保护,我们会用dom监听器去监听对这些元素的访问,并把重要的数据置为不可读写的状态。然而,动态创建的元素并不会受到限制,所以我们又往dom中加入了一些内联脚本,这些脚本会给那些用来新建或者是添加标签的函数(包括document.createelement,appendchild)添加hook(函数钩子)(步骤5)。这些函数钩子会对动态创建的元素施加类似的限制。最后,修改后的dom文档内容以及施加函数钩子所需的脚本会被写入原页面中的dom树(步骤6),并交由浏览器继续渲染。

本发明最终的实现形式是一个浏览器扩展。利用该扩展对web应用进行保护的流程如下:

第一步,在浏览器上安装并加载jscsp扩展。

第二步,选定需要添加xss防御的web页面,首先需要保证该页面未被注入xss攻击代码,例如新上线的页面即可满足要求。

第三步,待第二步中的页面加载完毕后,点击按钮生成安全策略,这些安全策略包括三类:沙盒策略、dom元素策略和数据策略。策略的具体内容见具体实施方式中的第2小节。

第四步,假设攻击者在受保护的页面中成功插入xss攻击向量。

第五步,用户重新访问该页面,jscsp执行模块则会根据已生成的安全策略对第四步中的攻击向量进行过滤,从而得到纯净的页面。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1