反XSS绕过过滤规则设计与研究∗
2018-04-26王万兵叶水生
王万兵 叶水生 肖 璐
(南昌航空大学信息工程学院 南昌 330000)
1 引言
跨站脚本(Cross—Site Scripting,XSS)是 Web应用程序中常见的一种安全漏洞。而在近些年中,随着移动客户端的大量普及,Web应用程序也逐渐受到不同行业的商家的追捧。但是由于开发Web应用人员的开发水平参差不齐,XSS漏洞的产生也变的不可避免。
对于Web应用产生的安全问题,在2013年由国际上知名网络安全机构,开放式Web应用程序安全 项 目 OWASP(Open Web Application Security Project)公布的Web应用十大安全漏洞显示,跨站脚本攻击XSS(Cross Site Scripting)高居第三位,其危害性不言而喻[1]。而2014年由国内知名组织乌云网公布的国内TOP 10 Security Risks for 2014数据显示XSS跨站脚本攻击/CSRF高居第七位[2],而这还只是公布了XSS有害的攻击类型排名,其危害性可见一斑。在2015年12月21日,360互联网安全中心发布的《中国网站安全报告(2015)》,报告显示,目前,四成网站存在漏洞,黑客利用漏洞对八万多家网站进行篡改,两成服务器被植入后门,黑客引导网民前往恶意网站。而从网上漏洞类型上看,跨站脚本攻击漏洞占21.9%,其排名更是居所有漏洞之首,漏洞级别达到了中危程度[3]。
XSS漏洞之所以屡防不止的原因并不是开发人员没有做好相关的防护,而是因为XSS攻击方法不断更新的原因。而在现阶段,XSS攻击所提倡的是绕过攻击,即:绕过开发人员设置的过滤方法,进而产生攻击向量,直接攻击网站。因此在下文中,将对XSS攻击做适当分析,研究并设计实现XSS反绕过过滤规则,保证Web应用的安全性。
2 XSS攻击原理
2.1 反射型XSS攻击原理
反射型XSS,是最常用,使用最广的一种方式。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行[4]。它的特点是非持久化,必须由用户点击带有特定参数的链接才能引起。
既然是需要用户点击才能触发的跨站,那么就需要足够高的伪装来实现攻击,如2013年年初,某论坛出现的XSS攻击,就是通过转账,然后被攻击者查看消息从而触发的一种反射型XSS攻击[5]。
2.2 存储型XSS攻击原理
存储型XSS就是攻击脚本被存储到了数据库或者文件中,服务器端(可能是别的应用或者别的页面)在读取了存储的内容后回显了,就是存储型攻击[6]。这种情况用户可能直接打开正常的页面就会看到被注入了。
其实现原理如下:
XSS代码被提交给网站→网站把XSS代码存储进数据库→当该页面再次被请求时,服务器发送已经被植入XSS代码的数据给客户端→客户端执行 XSS代码[7]。
比较常见的例子是在留言板上插入XSS代码,前提是留言板的内容未被过滤或者绕过留言板的过滤规则,如向留言输入框中添加如下代码<script>alert(“XSS”)</script>
则在打开留言管理时弹出如下对话框,即可发现XSS已成功注入。
如图1就是在用户留言管理中,未作拦截过滤处理,从而使得XSS攻击成功。
2.3 基于DOM的XSS攻击原理
DOM—based XSS漏洞是基于文档对象模型Document Object Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分[8]。DOM中有很多对象,其中一些是用户可以操纵的,如URI,location,refelTer等。
客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行[9],如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
DOM—based XSS攻击源于DOM相关的属性和方法,被插入执行XSS攻击的脚本。一个典型的例子如下:
HTTP 请 求 http://localhost: 8080/jxcx/test_show?name=test使用以下的脚本打印出登录用户test的名字,即
<SCRIPT>
var pos=docmnent.URL.indexOf(”name=”);
docment.write(docment.URL.substring(pos,doc⁃ument.URL.1ength));
</SCRIPT>
如果这个脚本用于请求http://localhost:8080/jxcx/test_show?name=<script>alert(‘XSS’)</script>时,就导致XSS攻击的发生。
当用户点击这个链接,服务器返回包含上面脚本的HTML静态文本,用户浏览器把HTML文本解析成DOM,DOM中的document对象URL属性的值就是当前页而的URL。在脚本被解析时,这个URL属性值的一部分被写入HTML文本,而这部分HT⁃ML 文本却是 JavaScript脚本,这使得<script>alert(‘XSS’)</script>成为页面最终显示的HTML文本,从而导致DOM—base XSS攻击发生。
3 XSS常见绕过过滤攻击处理
3.1 改变大小写
一般过滤函数都只是对相应的特殊字符进行过滤,而忽略了特殊字符串的大小写问题,但浏览器解析时是可以兼容大小写的。如:
<script>alert(“XSS”)</script>会被过滤函数识别到script敏感字符而对其进行相对应的拦截操作,但是如果是<sCrIpT>alert(“XSS”)</SCriPt>,由于未能检测到script敏感字符而被放行。
3.2 转义敏感字符
设计过滤函数时,通常会对各类敏感字符进行收集和过滤,因此正常情况下很难实现XSS攻击,如过滤函数的中过滤的敏感字符包含有“<”,那么XSS攻击<script>alert(“XSS”)</script>或<sCrIpT>alert(“XSS”)</SCriPt>都很难奏效。
但浏览器可以解析识别转义后的字符,如<script>alert(“XSS”)</script>转换成16进制的Uni⁃code编码为u003cu0073u0063u0072u0069u0070u0074u003eu0061u006cu0065u0072u007 4u0028u201cu0058u0053u0053u201du0029u0 03cu002fu0073u0063u0072u0069u0070u0074u 003e,而转义后的字符串中则不含有被过滤的敏感字符,因此可以顺利的绕过过滤函数执行。而类似地可以将其转换成8进制、16进制或URL转码等均可以绕过过滤函数。
3.3 利用fromCharCode()函数进行拼接攻击
当过滤函数对相应的转义字符做出特殊过滤时,那么fromCharCode()将会作为绕过攻击的一个主要杀手锏。如:运用String.fromCharCode(97,108,101,114,116,40,34,88,83,83,34,41)可以输出alert(“XSS”);而这就可以成功地绕过过滤函数实现恶意攻击。
3.4 利用关闭或注释标签实现恶意攻击
利用关闭标签,使得该输入标签提前结束,进而执行输入框中的恶意攻击代码,具体示例如:“/><script>alert(”XSS“);</script>”,其中“/>”会使输入标签关闭,而出现输入内容绕过过滤的情况。
3.5 UBB标签攻击
UBB标签是目前广泛运用到论坛,留言簿,以及其他网站系统的一种编码标签,类似[img]url[/img]这样的编码标签,用户在中间输入地址后即可进行攻击,在发表的时候系统会自动改成<img src=”url”></img>[10]。这个URL就是用户输入的图片地址,XSS攻击中,可以利用这个特点来达到无需用户输入“<”或“>”就能执行由用户所输入的代码,那么经过转换后就变成了<img src=“x”onerror=“alert(‘XSS’)”></img>。
3.6 利用系统外语言攻击
如目标系统的前端开发语言为javascript,那么系统采用的防护或过滤系统也是针对javascript来定制的,但是浏览器可以同时解析并执行多种前端语言,因此当攻击系统的语言由vbscript编写时,由于和javascript存在较大的差异性,可以轻松的绕过过滤系统,实现对目标系统的攻击。如:<script lang=vbscript>msgbox“XSS”</script>。
以上的XSS攻击规则均可以绕过不同的过滤函数,从而达到攻击系统的目的,给系统的防护和安全带来一定的隐患。
4 反绕过过滤规则设计与实现
该过滤规则是在以往的传统过滤基础上改进而来,传统过滤对敏感字符检测不严谨,收集能力不强,维护性差。因此,该过滤规则的设计将完善这些缺点。
首先,针对出现新型XSS攻击,老系统无法拦截问题进行处理。出现该问题的主要原因是过滤敏感字符不全,因此,设计可控的字符库,便于管理员维护和更新敏感字符。
其次,对字符库的排列顺序进行处理,根据敏感字符出现频次和危害度进行排序,排序靠前的优先匹配响应,提高系统的响应速度和处理速度。
最后,利用系统开发相关过滤功能,获取待检测内容,与字符库中的敏感字符进行过滤匹配处理,进行模块化封装。
4.1 反绕过过滤规则的核心思想
针对上述的攻击方式,采用定制的过滤系统,防护系统安全。定制的过滤系统核心由敏感字符库和过滤器组成,其主要的构造和设计思想如图2。
图2 过滤模块的组织结构图
图2中的滤模型中包含过滤器和对敏感字符库的处理过程,敏感字符库的基本设计如图3所示。
图3 敏感字符库基本设计
图4 敏感字符库示例
图3和图4中的character为收集的敏感字符,replace_character为替换character的转义后的字符,level为敏感字符出现及危害等级。其中level分为1~10个等级,并由高到低排序,1为最高等级,并优先匹配检测。
由图2示,待检测的提交内容经过滤模型处理时,将检测的内容与敏感字符库中的敏感字符匹配,如检测到敏感字符,则进行替换处理,使得输入变为原样输出(实现全角和半角转换),并修改字符库中敏感字符的level等级。
4.2 防护效果示例
为验证防护效果,搭建实验环境,以存储型XSS攻击示例:如网站中未加XSS防护的漏洞展示。
图5 XSS漏洞示例
图6 XSS攻击结果示例1
图7 XSS攻击结果示例2
图5、图6和图7分别展示了网站中有XSS漏洞的示例和危害,如不修补可能会被黑客利用获取session或cookie信息等,进而提权,对网站带来巨大的安全隐患。
图8 加入XSS过滤模块后攻击结果
图8所示为运用了过滤模型后的处理结果,和图4中的输入数据对比可以发现,商品名称输入框中的”<”和”>”,均被过滤器替换为了全角字符”<”和”>”,从而使得输入的内容原样输出,避免了存储型XSS攻击。
4.3 运用方法
4.3.1 标签加入法
以jsp WEB项目为例,项目由struts2框架搭建,并加入过滤模型,在项目中利用过滤器和拦截器进行改造处理,过滤器和拦截器中均加入过滤模型处理函数,对拦截到的内容进行过滤处理。该处理方法可以有效防护反射型XSS攻击或过滤掉链接中带有的恶意攻击代码。
标签内防护,以struts2中的S标签为例。重新构造 S 标签,如<s:textfield name=”test”id=”test”XSS=”true”/>,在标签中添加XSS属性,属性值设为true或false,默认为false,当XSS=”true”时,则标签内的函数执行标签内检测——对标签内的输入内容调用过滤模型函数进行过滤检测处理。具体运用如图9所示。
图9 标签运用过滤器示例
4.3.2 模块化配置使用方法
基于实验环境的测试用例,在WEB工程运用中,可直接对整站的安全模块做拦截配置,也可对单模块配置防护,如在test.xml文件中配置单例防护模块代码:
<interceptors>
<interceptor name=“xss”class=“com.jxcx.global.XSS”></in⁃
terceptor><!--单例XSS防护模块-->
<interceptor-stack name=“defaultStack”>
<interceptor-ref name=“defaultStack”></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name=“test_*”class=“testAction”method=“{1}”>
<!—引入单例XSS防护模块-->
<interceptor-ref name=“xss”></interceptor-ref>
<result name=“toAdd”>test.jsp</result>
<result name=“add”type=“redirect”>test_show</result>
<result name=“show”>show.jsp</result></action>
对整站的防护可直接配置在web.xml文件中。
5 结语
首先:在安全方面,该设计是基于字符库的建立和完善来实现的,可以随时收集绕过过滤的敏感字符并完善字符库,使得防护系统不断地完善,并起到很好的安全防护作用,进而达到反绕过过滤攻击的目的。
其次:系统的防护建立在过滤器和字符库的配合上,过滤器的设计是先响应后处理的模式,即,先响应用户,后处理含有敏感字符的数据,从而使得系统的响应时间更短,处理模式更加优化,也能够提高用户的体验度。
最后:该设计能够有效地降低安全开发和项目维护的成本,并可集成到系统的开发模块中,可移植性和可集成性强。系统维护人员可灵活控制并更新字符库,能够有效地应对新的威胁,而且可视性强,在保证安全的基础上,不需要经常对系统进行更新维护。
XSS攻击已泛滥于网络中,该过滤模型的运用,可以在一定程度上防护WEB服务器的网络安全,开发人员可直接利用现有的过滤模型,将其集成到自定义标签或改造现有标签中,进行有效过滤防护,避免了多次校验的问题,进而提高开发效率和服务器的响应速度。
过滤规则的实现形式为过滤模型的建立,其具有很强的可控性和可视性,但缺少敏感字符的自主收集能力,而这将在后期的研究中将逐步实现。
[1]Owasp.2013 Top 10 List[EB/OL].[2014-08-12].http://www.owasp.org/index.php/Top_10_2013-Top_10.
[2] Wooyun,Top 10 Security Risks for 2014[EB/OL].[2015-06-02].http://drops.wooyun.org/news/2731
[3]ym.“China Site Safety Report(2015)”published[EB/OL].[2015].http://sec.chinabyte.com/239/13653739.sht⁃ml.
[4]秦英.基于行为的跨站脚本攻击检测技术研究与实现[D].西安:西安电子科技大学,2010.QIN Ying.The behavior of XSS attack detection technolo⁃gy researc h and Implementation Based on[D].Xi'an:Xi'an Electronic and Sc ience Uni-versity,2010.
[5] X.Principle ofXSS [EB/OL].[2013-03-29].http://xxxxx0000sssss.lofter.com/post/14b1dc_50023e.
[6]丁永慧.基于页面链接分析技术的漏洞扫描方案的研究与实现[D].北京:北京邮电大学,2012.DING Yonghui.Re-search and implementation of vulnera⁃bility scanning scheme based on page link analysis[D].Beijing:Beijing University of Posts and Telecommunica⁃tions,2012.
[7] Windfire programmer.Principle of XSS [EB/OL].[2014-12-16].http://blog.csdn.net/phpfenghuo/article/details/41959971.
[8]黄文锋.DOM—basedX SS攻击原理与防范[J].华南金融电脑,2009(12):37-39.HUANG Wenfeng.DOM-basedX SS attack principle and prevention[J].Southern China financial computer,2009(12):37-39.
[9]洪志国,黄晓.利用DOM类库检索XML文档[J].计算机工程与设计,2004,25(6):968-970.HONG Zhiguo,HUANG Xiao.Using DOM class library to retrieve XML documents[J].computer engineering and design,2004,25(6):968-970.
[10]PORUIN.XSS for the bypass filtering method[EB/OL].[2009-04-24].http://www.2cto.com/Article/200904/37539.html.