XSS分析及预防(转)

阅读目录

XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息的泄漏。如今,仍然没有统一的方式来检测XSS漏洞,但是对于前端开发人员而言,仍是可以在某些细微处避免的,因此本文会结合笔者的学习和经验总结解决和避免的一些方案,并简要从webkit内核分析浏览器内核对于XSS避免所做的努力,了解底层基础设施对预防XSS所做的贡献。

XSS的种类和特点

此处不详细讲解XSS的一些细节

XSS的目标是让其他站点的js文件运行在目标站点的上,这主要发生在页面渲染阶段。在该阶段发生了某些非预期的脚本行为,该脚本可能来自用户的输入,也可能来自域外的其他js文件,不一而足。XSS的发生起源来自于用户输入,因此XSS根据用户输入数据以何种形式、何时触发XSS、是否有后端服务器的参与划分为三种类型,分别是反射型XSS、持久型XSS和DOM XSS。

反射型XSS

反射型XSS,顾名思义在于“反射”这个一来一回的过程。反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。因此如果要避免反射性XSS,则必须需要后端的协调,在后端解析前端的数据时首先做相关的字串检测和转义处理;同时前端同样也许针对用户的数据做excape转义,保证数据源的可靠性。

e.x.
localhost/test.php

<?php echo $_GET['name'] ?>

如果通过 localhost/test.php?name=alert(document.cookie) 访问页面,那么经过后端服务器的处理,就会造成反射性XSS的发生。

同理,通过传入data uri编码的字符串也会导致XSS,如 localhost/test.php?name=data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+ 会导致同样的问题。该段编码的字串解码后是“alert(document.cookie)”。

持久型XSS

持久型XSS仍然需要服务端的参与,它与反射型XSS的区别在于XSS代码是否持久化(硬盘,数据库)。反射型XSS过程中后端服务器仅仅将XSS代码保存在内存中,并为持久化,因此每次触发反射性XSS都需要由用户输入相关的XSS代码;而持久型XSS则仅仅首次输入相关的XSS代码,保存在数据库中,当下次从数据库中获取该数据时在前端未加字串检测和excape转码时,会造成XSS,而且由于该漏洞的隐蔽性和持久型的特点,在多人开发的大型应用和跨应用间的数据获取时造成的大范围的XSS漏洞,危害尤其大。这就需要开发人员培养良好的WEB前端安全意识,不仅仅不能相信用户的输入,也不能完全相信保存在数据库中的数据(即后端开发人员忽视的数据安全检测)。针对持久型XSS没有好的解决方式,只能由开发人员保证。当然规则是由开发者制定,如果忽略用户体验的话,可以制定一套严谨的输入规则,对相关关键词和输入类型(如data URI检测,禁止输入)的检测和禁止,尽可能规避用户发现XSS漏洞的可能性,从源头处理。

DOM XSS

DOM XSS完全在前端浏览器触发,无需服务端的参与,因此这是前端开发工程师的“地盘”,理应获得我们的关注。

e.x.
localhost/test.html

<script>
eval('alert(location.hash.slice("1"))');
</script>

如果访问localhost/test.html#document.cookie ,那么就会触发最简单的危害非常大的DOM XSS。它完全没有服务端的参与,仅仅由用户的输入和不安全的脚本执行造成,当然在本例中仅仅是最简单的情况,如果用户输入字符串‘’或者text/html格式的data URI,则更难检测,也危害更大,黑客操作起来更为容易。

因此预防DOM XSS,需要前端开发人员警惕用户所有的输入数据,做到数据的excape转义,同时尽可能少的直接输出HTML的内容;不用eval、new Function、setTimeout等较为hack的方式解析外站数据和执行js脚本;禁止内联事件处理函数;如果在考虑安全性的前提下需要获取外站脚本的执行结果,可以采用前端沙盒(建立空的iframe执行脚本,该iframe无法操作当前文档对象模型)、worker线程的方式完成,保证DOM的安全。

XSS预防

XSS漏洞难以检测,但是为了WEB安全仍需要尽力避免,在本节将会针对三种类型XSS漏洞提出对应解决方法,并从其他角度提供更具启发性的意见。

针对反射型XSS,在对应的小节中也提到过,需要服务端和前端共同预防,针对用户输入的数据做解析和转义,对于前端开发而言,则是善于使用escape,针对data URI内容做正则判断,禁止用户输入非显示信息,如MIME类型为“text/html,text/plain”类型的内容。
对于存储型XSS,处理方式仍然类同于反射性XSS。
对于DOM XSS,则需要慎之又慎。由于造成XSS的原因在于用户的输入,因此在前端,需要特别注意以下的用户输入源:


document.URL,
location.hash,
location.research,
document.referrer(此处应尤为注意,referrer属性虽然可用于避免CSRF,但可触发XSS攻击),
XHR返回值(跨域返回值),
form表单及各种input框

针对以上输入源,需要做相对于的检测和转义。在以上输入源中获取数据后,可能会有各种DOM操作或纯粹的js计算,这些操作则是真正触发XSS的罪魁祸首:


1,直接输出HTML内容
document.body.innerHTML = ...
document.body.outterHTML = ...
document.write()
2,HTML标签内联脚本

<img src='abc' onerror=alert('error')>
3,直接执行脚本
eval
new Function(){}
setTimeout()
window.execScript()
4,打开新页面触发XSS(包括反射型XSS和持久型XSS)
window.open()
location.href = ...
location.hash = ...

在操作DOM时,需要尤其注意上述操作,针对可能造成的XSS需要进行字串转义。当然,有些操作是完全可以避免的:对于innerHTML的拼接操作,需要摒弃jQuery式的链式操作而使用前端模版如artTemplate,也可选择使用由后端渲染好的可靠的数据,这样既保证性能也确保安全;对于HTML标签内嵌js,则需要完全避免,这是一种容错率很低的实现;直接执行脚本和解析数据,则需避免eval和new Funciton等操作,改为JSON.parse、iframe沙盒和webWorker执行;而针对打开新页面触发的XSS则需要开发人员自行把控。

另外的尝试

上文提到的仅仅是对应的XSS避免方案,但是如果将目光放置在全局,站在浏览器的角度上,则会变的更为柳暗花明。现阶段,大多数浏览器都支持多种安全策略,如沙盒机制,跨域机制,跨文档消息和CSP。在这里,我们关注CSP(Content Security Policy),又称内容安全协议,CSP通过服务端响应的HTTP头部来制定网页相关资源的加载域,这些资源限定于js文件、css文件、image、iframe、字体和其他对象(如object、applet)。

CSP通过HTTP头部由服务端制定,头部类型由于历史原因总共由三种,这三种仅仅是兼容性的差别,针对chrome浏览器,我们仅需关注Content-Security-Policy头部。CSP头部的定义规则如下:
Content-Security-Policy: 名 值; 名 值; 名 值;

具体的指令名如下图:

指令值的规范如下图:

因此,如果我们要避免XSS攻击,可以限定脚本的来源域,如:
Content-Security-Policy: default-src 'self' ajax.googleapis.com;
这样,非本域和ajax.googleapis.com域下的其他脚本不会被加载,避免了XSS。

在这里需要强调一点的是,默认CSP会禁止script代码块的执行;禁止内联事件处理函数;禁止内联样式;禁止eval和new Function。对于内联script代码块和内联样式,可通过CSP的header设置,如Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline';。

CSP有一个指令需要注意,即report-uri,它会将错误信息主动发送至改cgi(sevlet),用于管理员的统一管控。report-uri属性将会在下文中涉及到。

webkit中的XSS组件

XSS攻击主要发生在页面的渲染时,当浏览器的渲染引擎获取到该页面并开始解析时,是可以在该阶段进行安全校验的,具体的时间节点则是在词法分析后针对每个token做过滤。

在webkit中,由HTMLDocumentParser解析得到token后,使用XSSAuditor进行过滤,具体则是在filterToken中执行,不仅仅是针对token的名称,其属性也是监测重点。在webkit中采用黑名单机制,针对“,,,”做重点排查,当发现相关隐患时,生成相关信息XSSInfo,由XSSAuditorDelegate类发送给对应的cgi,该cgi的地址正是CSP中的指令值report-uri,当然也可以手动制定该值。

默认,XSSAuditor是启用的,但是XSSAuditor在发现XSS行为时却有多种,这些行为可以配置,这就涉及到HTTP头部X-XSS-Protection。该头部并不是W3C和IETF的规范,而是非标准实现,通过对该头部的赋值来定制XSSAuditor的相关行为。

默认情况,XSSAuditor处于重写模式(js代码处在非执行状态),即X-XSS-Protection:1;如果要禁用XSSAuditor,可以X-XSS-Protection:0;当设置为X-XSS-Protection:1;mode=block,则会在XSSAuditor作用时禁止网页显示,呈现给用户的则是空白页;若设置为X-XSS-Protection:1;report=... ,则会将相关统计信息发送给CSP中定义的report-uri。XSSAuditor无法完全避免XSS,但毕竟在浏览器层面提供了一层检查机制,从HTML tag上保证其可靠性。

总结

XSS漏洞难以发现,但是作为开发人员需要于细节处避免制造XSS漏洞,而对于CSP规范和webkit的XSSAuditor机制的使用,我们不应抱着依靠它们的想法来解决XSS,毕竟不是所有的页面都可以容忍CSP的严格,XSSAuditor机制也仅仅针对chrome而言,并且存在多种bypass绕过检查,如通过各种HTML实体编码、url编码和js编码。因此,我们仍需以人为本,规范开发习惯,提高WEB前端安全意识。

参考文章:
浏览器安全策略说之内容安全策略CSP
UNDERSTANDING XSS AUDITOR
3 webkit技术内幕

http://www.cnblogs.com/accordion/p/5446174.html

 

时间: 2024-11-01 21:30:26

XSS分析及预防(转)的相关文章

传智播客c/c++公开课学习笔记--C语言与木马恶意代码分析和360安全防护揭秘

黑客代码分析与预防 笔记 [课程简介] C/C++语言是除了汇编之外,最接近底层的计算机语言,目前windows,linux,iOS,Android等主流操作系统都是用C/C++编写的,所以很多病毒.木马也都是用C/C++实现的.课程的目的就是通过C语言揭秘木马和各种远程控制软件的实现原理以及如何防护.  [课程知识点] 1.木马入侵系统的方式: 2.木马入侵到宿主目标后的关键行为分析: 3.可信任端口以及端口扫描技术: 4.远程控制的实现代码实现: 5.恶意代码中使用TCP.UDP协议与防火墙

使用CakePHP框架开发网站

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现如今成熟的PHP开发框架有很多种,YII,zendframwork,国内轻量型框架Thinkphp,还有开发效率很高的CakePHP.公司可以根据自己的需求选择合适的开发框架,在这里,小编以自己公司使用的开发框架CakePHP作为重点介绍,阐述它的优点. CakePHP的简要介绍: PHP框架已被确认为最流行的编码框架,以创建网站.已经出现

浅谈银行业中数据挖掘的应用

  一.引言  数据挖掘(Data Mining)是一种新的商业信息处理技术,产生于20世纪80年代的美国,首先应用在金融.电信等领域,主要特点是对大量数据进行抽取.转换.分析和模型化处理,从中提取出有助于商业决策的关键性数据.银行信息化的迅速发展,产生了大量的业务数据.从海量数据中提取出有价值的信息,为银行的商业决策服务,是数据挖掘的重要应用领域.汇丰.花旗和瑞士银行是数据挖掘技术应用的先行者.如今,数据挖掘已在银行业有了广泛深入的应用. 二.数据挖掘在银行业应用的主要方面  现阶段,数据挖掘

年关将至,服务器被入侵了怎么办?

作者介绍 林伟壕,网络安全DevOps新司机,先后在中国电信和网易游戏从事数据网络.网络安全和游戏运维工作.对Linux运维.虚拟化和网络安全防护等研究颇多,目前专注于网络安全自动化检测.防御系统构建.   导读: 遇到服务器被黑,很多人会采用拔网线.封iptables或者关掉所有服务的方式应急,但如果是线上服务器就不能立即采用任何影响业务的手段了,需要根据服务器业务情况分类处理.   下面我们看一个标准的服务器安全应急影响应该怎么做,也算是笔者从事安全事件应急近5年以来的一些经验之谈,借此抛砖

银监会发布商业银行信息科技风险管理指引

为进一步加强商业银行信息科技风险管理,银监会近日发布<商业银行信息科技风险管理指引>(以下简称<管理指引>),原<银行业金融机构信息系统风险管理指引>(银监发[2006]63号,以下简称原<指引>)同时废止. 随着银行业信息化的发展,信息科技的作用已经从业务支持逐步走向与业务的融合,成为银行稳健运营和发展的支柱,原<指引>定位在信息系统风险管理的基本.原则性要求,已难以满足商业银行信息科技风险管理的需要.为此,银监会在原<指引>的基础

浅谈软件项目管理之测试

笔者从事软件行业相关工作将近十年,其中与测试相关时间有7年之久,现浅谈软件项目管理中测试的必要性,供大家参考. 一.测试的必要性 为什么需要测试,那是因为由于分工的精细化,软件开发必须经历客户.需求.设计.开发多个环节.为了保证最终的结果符合要求,上下游是需要确认的. 用户告诉我们:我需要什么?软件企业需要在理解正确.表达正确的情况下完成需求规则说明书,把客户的原始需求转变为IT需求,表达出能够提供什么 需求的下一环节是设计,设计主要是要要说清楚:我要让软件做什么.需要与前一环节确认理解正确了.

网站安全风险依然严峻 绿盟科技五种场景化方案随需所用

"截至2016年12月底,中国网站总量达到475.4万个,同比年度净增长48.7万个."近日由中国互联网协会.国家互联网应急中心(CNCERT)联合发布的<中国互联网站发展状况及其安全报告(2017)>显示,伴随着中国网站数量的增长还有互联网安全风险的提升. 网站安全仍然是网络空间安全的重灾区 虽然网站安全问题由来已久,但随着信息技术的发展和互联网的"触角"越来越广,网站安全也出现新的态势.例如,移动互联网恶意程序数量持续高速上涨且具有明显趋利性:来自境

大数据时代:银行如何玩转数据挖掘

数据挖掘(Data Mining)是一种新的商业信息处理技术,产生于20世纪80年代的美国,首先应用在金融.电信等领域,主要特点是对大量数据进行抽取.转换.分析和模型化处理,从中提取出有助于商业决策的关键性数据.银行信息化的迅速发展,产生了大量的业务数据.从海量数据中提取出有价值的信息,为银行的商业决策服务,是数据挖掘的重要应用领域.汇丰.花旗和瑞士银行是数据挖掘技术应用的先行者.如今,数据挖掘已在银行业有了广泛深入的应用.   数据挖掘在银行业主要应用在银行业哪些方面   现阶段,数据挖掘在银

IBM收购Resilient Systems——旨在为安全时间提供反应“行动手册”

IBM为了增强其安全业务,针对攻击提供自动化的反应行动手册,收购了Resilient Systems. 这笔交易的细节没有披露,但是Resilient带来了一个平台,协调并且对安全事件给出自动化的反应.Resilient公司的总部位于马萨诸塞州的Cambridge. 随着RSA Security大会的揭幕,似乎协调并针对漏洞和攻击进行自动反应已经开始变得流行.例如,Akamai在星期一宣布升级旗下Kona Site Defender服务,能够自动对分布式攻击做出反应. Resilient大约有1