APP下载

基于DOM型跨站脚本攻击防御的设计与实现

2018-01-13保永武

网络安全技术与应用 2018年1期
关键词:服务端脚本字符

◆高 岩 保永武

(武汉虹旭信息技术有限责任公司 湖北 430000)

0 引言

跨站脚本攻击(Cross-Site Scripting,XSS)在 OWASP TOP10-2017中被列为了第三威胁漏洞,仅次于注入和失效的身份认证和会话管理。成为近年来出现频率最高的Web漏洞之一,跨站脚本攻击具有攻击范围广泛,跨平台,破坏力强等特性受到攻击者的重视;并且由于开发者以及用户对跨站攻击的防范意识的缺乏,很多开发人员在web开发过程中没有意识到跨站脚本漏洞的危害,导致跨站脚本漏洞被忽视。

现有的防御措施大多数依靠服务端纯文本过滤来实现,但服务端纯文本过滤存在许多问题:首先是设定黑名单时很难全面包含所有恶意函数,无法正确地涵盖所有标签以及属性,攻击者可以利用黑名单外的标签构造恶意代码进行攻击;其次是白名单的使用可以有效地阻止跨站脚本攻击,但会极大地影响用户体验,导致用户输入的非恶意数据被过滤;然后是无法完全匹配浏览器特性,如“svg/onload”适用于Chrome浏览器,但不适用于IE浏览器;另外针对DOM型XSS攻击防御效果不理想。

1 XSS概述

跨站脚本攻击发生在目标网站中目标用户的浏览器层面上,在用户浏览器渲染整个 HTML文档的过程中出现脚本指令控制用户浏览器进行攻击。

通常,根据XSS攻击的攻击方式以及利用手法不同,将跨站脚本分为三类:反射型XSS、存储型XSS、DOM型XSS。

1.1 反射型跨站脚本攻击

反射型跨站脚本攻击的注入点通常存在于网页的 URL中,主要实现方式是通过修改 URL地址内的参数,将恶意脚本作为输入提交到服务端。由于服务端未对跨站脚本进行完全过滤就直接返回至客户端,在浏览器响应内容中出现这段跨站脚本并在浏览器上执行,从而使用户受到攻击。反射型跨站攻击具有实现难度较低、攻击及时的特点,因此大多数跨站脚本攻击案例为反射型跨站攻击。在反射型跨站攻击过程中,攻击者通常利用精心构造的恶意代码进行钓鱼,攻击者通过通信工具发送包含攻击代码的URL给受害者,当受害者点击攻击者构造的URL时会触发攻击者构造的攻击代码,然后向服务端发出请求,服务端响应后返回给受害者浏览器,攻击代码得以顺利执行,攻击行为完成。

1.2 存储型跨站脚本攻击

存储型跨站脚本攻击与反射型跨站脚本攻击最明显的差别在于攻击者精心构造的跨站脚本会存储在服务端(服务端的数据库或者文件系统中),攻击者再次请求该页面时不需要再次提交跨站脚本。反射型跨站脚本攻击的注入点通常存在于 URL中,存储型跨站脚本攻击的注入点一般出现在有交互功能的地方,如网站的留言板、评论区、博客日志、个人信息等。跨站脚本被存储到服务端,当其他用户或管理员浏览该信息时,浏览器将会直接从服务端读取攻击者构造的跨站脚本,并在浏览器执行该跨站脚本。

1.3 DOM型跨站脚本攻击

DOM型XSS不同于上述提到的反射型XSS以及存储型XSS,DOM型XSS取决于输出位置,而不取决于输出环境。其输出点在DOM中,DOM型XSS是从JavaScript中输出数据到HTML页面的。因此DOM型XSS既有可能是反射型XSS,也有可能是存储型XSS。DOM型XSS在服务端处理后的代码输出到页面后,可能会再次经过客户端脚本处理后输出,因此仅仅在服务端部署防御是无法过滤DOM型XSS的。

2 跨站脚本攻击防御系统设计

传统的协同过滤(图1)是将非信任数据先进行客户端过滤,然后进行服务端过滤,最后输出到客户端的浏览器进行解析。攻击者可以利用抓包软件对HTTP数据包进行拦截并修改从而绕过客户端过滤,导致客户端过滤失效。针对此种攻击,本文设计了一套更为完善的客户端与服务端协同过滤体系,在服务端进行过滤后再通过客户端对代码进行过滤,过滤流程如图2所示。该方法相对于纯服务端过滤而言,可以减少服务端的压力的同时有效防止DOM型跨站脚本攻击,比纯客户端过滤在防范非DOM型跨站脚本攻击中的效果更好。该方法不仅具有传统的协同过滤的优点,而且可以防范攻击者通过抓取HTTP并修改的方式绕过客户端过滤,更好地针对跨站脚本攻击进行防御。

图1 传统跨站脚本过滤流程图

2.1 服务端过滤

通常攻击者想要利用XSS漏洞进行攻击,需要将网页中的标签闭合掉(如”

”,””,””等),或直接利用内联函数注入恶意代码。而想要构成此类攻击,输入数据时大多会包含一些固定的特殊字符。本文中把这些字符定义为敏感字符,再对这些敏感字符进行针对性地替换或删除。常用的敏感字符包括:”<”、”>”、””、”/”、”\”、”%”。

图2 改进后的跨站脚本过滤流程图

对于敏感字符的处理,本文通过相应的符号对其进行替换。首先对输入的非信任数据进行遍历,判断数据中的每个字符串是否包含前文所规定的敏感字符,若是敏感字符则对其进行替换。如表1所示。

表1 敏感字符替换表

经过上述操作,可完成对敏感字符的替换,破坏攻击者所构造的代码。将过滤后的代码输出至客户端,由客户端过滤系统完成后续过滤。

2.2 客户端过滤

服务端通过对敏感字符进行替换的防御方式主要对非 DOM型跨站脚本过滤,但由于DOM型XSS的特性导致纯服务端过滤并不能完全过滤跨站脚本,因此,针对DOM型XSS攻击的防御将在客户端进行部署。防御成功时可以通过查看页面元素看到攻击代码以脚本的形式输出,但是攻击代码并未执行。过滤流程图如图3所示。

图3 客户端过滤流程图

(1)内联函数处理

内联函数是攻击者常用的跨站脚本攻击,本文对所有内联函数进行拦截,采用监听document对象的方法。因为所有的on事件对应的都是“document.on******”这类属性,所以直接遍历document对象即可获得所有on事件,并对所有on事件进行拦截。提取on事件的属性值,并对on事件的属性值与黑名单进行正则匹配。若存在于黑名单中,则删除on事件并向后台发送警报。

(2)静态脚本处理

使用MutationObserve函数监听DOM树中子节点和属性的变动。当DOM节点或属性发生变动时对其进行拦截后进行过滤处理。在过滤处理中对iframe标签以及script标签进行扫描,判断标签中是否含有src属性,并对src属性采取白名单匹配,若存在于白名单中则认定为非恶意输入。

(3)动态脚本处理

针对脚本是动态生成的,因此需要在脚本插入DOM树前捕获脚本,并过滤恶意脚本,而MutationObserve方法只能监听DOM中子节点的变动,无法在脚本执行之前过滤脚本。因此,需要对动态生成的脚本做采取以下措施:拦截动态生成的 src以及innerHTML属性、重写document.write属性、重写setattribute属性、重写Ajax请求、重写Websocket请求、重写postMessage请求。

3 跨站脚本攻击防御系统测试

在系统整体功能测试中,需要在服务端引入JSP编写的防御模块进行服务端的跨站脚本防御,并在服务端向客户端输出过程中引入 JavaScript编写的防御模块进行客户端跨站脚本防御。最终起到协同防御效果。

在系统测试中,本文将该防御系统部署在带有输入功能的留言板中,对留言板进行模拟攻击测试。选取跨站攻击脚本:

提交后页面源代码对应的脚本如下:

</textarea><input onload=alert(1)>

可以看到半角的”<”被替换成全角的” <”导致攻击脚本以文本的形式输出,无法执行脚本。证明了服务端过滤的有效性。

为了证明客户端过滤的有效性,在此仅仅部署客户端防御模块,对留言板进行模拟攻击测试。用同样的攻击代码进行测试,提交后观察页面源代码对应脚本如下:

代码以脚本的形式输出,但是”alert”并未执行。通过浏览器控制器可以看到攻击脚本被客户端拦截,证明了客户端过滤的有效性。

4 总结

随着Web应用的功能越来越全面,人们对Web应用越来越依赖,随之而来的 Web安全问题也越来越严重。跨站脚本攻击是一种非常常见的web攻击,跨站脚本攻击的防御是如今网络安全研究的热点 。本文提出的客户端与服务端协同防御跨站脚本攻击系统中,使用JavaScript语言编写适用于主流浏览器。可对跨站脚本攻击进行有效过滤的同时减轻服务端压力。

[1]OWASP Top Ten project for 2017 [EB/OL].http://www.owasp.org.cn/owasp-project/ 2017-owasp-top-10,2017.

[2]邱永华.XSS跨站脚本攻击剖析与防御[M].人民邮电出版社,2013.

[3]吴翰清.白帽子讲Web安全[M].电子工业出版社,2012.

猜你喜欢

服务端脚本字符
酒驾
安奇奇与小cool 龙(第二回)
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
新时期《移动Web服务端开发》课程教学改革的研究
快乐假期
小编的新年愿望
摸清黑客套路防范木马侵入

杂志排行

网络安全技术与应用的其它文章