APP下载

XSS攻击机制及防御技术浅谈

2016-11-30葛强李俊胡永权

计算机时代 2016年10期

葛强 李俊 胡永权

摘 要: 跨站脚本攻击(XSS)是客户端Web安全的主要威胁。因跨站脚本攻击的多样性以及Web安全漏洞的隐蔽性,使得该类型的攻击很难彻底防御。介绍了跨站脚本攻击的基本概念,针对不同环境发生的跨站脚本攻击机制进行了分析,探讨了不同环境下如何防御跨站脚本攻击的具体技术。

关键词: Web安全; XSS; 跨站脚本攻击; Web漏洞; XSS防御

中图分类号:TP393 文献标志码:A 文章编号:1006-8228(2016)10-11-03

Discussion on XSS attack mechanism and defense technology

Ge Qiang1,2, Li Jun3, Hu Yongquan1

(1. College of Computer and Information Engineering, Henan University, Kaifeng, Henan 475004, China;

2. College of Environment and Planning, Henan University; 3. Information Office)

Abstract: Cross site scripting (XSS) attack is a major threat to the security of Web client. Because of the diversity of XSS attacks and Web security vulnerabilities hidden, this type of attack is very difficult to completely defense. This paper introduces the basic concept of XSS attacks, analyzes the XSS attack mechanisms of different environment, and discusses the specific technology to defense the XSS attacks of different environment.

Key words: Web security; XSS; cross site scripting attack; Web vulnerability; XSS defense

0 引言

在当今的Web2.0时代,Web上的大多数站点实际上是应用程序,它们功能强大,提供各种各样的服务。网站向用户展示的内容是以动态形式生成的,并且能够满足用户的个性化需求[1]。但这些个性化的应用也给站点带来一定的安全隐患,例如,跨站脚本攻击等,同时,AJAX技术的流行使得XSS攻击威胁变得更加严重。XSS攻击在OWASP组织公布的OWASP TOP 2013中位列第三[2-3],可见XSS攻击所造成的威胁之大。

1 XSS原理

XSS攻击是一种间接攻击,攻击者通过Web服务器来攻击其他用户。攻击者向服务器提交一段恶意代码,而在服务器端并没有对用户的输入做足够的安全处理,就将用户输入写入数据库。当其他用户向服务器再次请求含有恶意代码的网页时,服务器就会把包含恶意代码的网页返回,浏览器收到返回信息后进行相应的渲染、解码工作,此时恶意代码被触发执行,用户的机密信息将被窃取,甚至可以控制用户的系统[4]。XSS攻击原理如图1所示。

先举一个简单的例子来展示跨站脚本攻击的效果,主要代码如下:

请输入你的姓名:

Result.jsp代码如下:

你好:<%=request.getAttribute("name")%>

如果用户输入恶意内容,并且没有对用户的输入做安全处理,因此在result页面就可能会出现安全威胁。如用户输入“”,该字符串没有经过安全检查就写入数据库,当该name值被再次取出时,这个字符串会被浏览器解析执行,浏览器将弹出“Hello”。

2 浏览器的解码

防御XSS攻击的主要方式是对用户的输入进行安全检查并进行适当的编码。对用户在不同地方的输入应当进行不同的编码。只有对用户的输入进行完整的安全检查和正确的编码才能有效防御XSS攻击。

对于下面这段代码,浏览器会进行三种解码。HTML解码、JS解码、URL解码。

This is a test

Link

首先,对于段落“This is a test”浏览器会进行HTML解码。其次,对于“Hello”浏览器会首先进行HTML解码,然后进行JS解码。最后对于连接“www.a.com”浏览器会进行URL解码[5]。因此,如果上述三个位置都是用户可编辑的,则开发人员就需根据浏览器对以上几处位置所进行的解码顺序来进行对应的编码操作。

3 XSS解决方案

3.1 ESAPI解决方案

防御XSS攻击的有效办法就是对用户输入进行安全检查,然后采取相应措施,主要的措施有替换、移除、编码[6-7]。下面主要讨论采用编码方法防御XSS攻击。

ESAPI是一个免费、开源的Web应用程序安全控制组件,可以帮助编程人员开发低风险应用程序。为了防御XSS攻击,在实际情况中,应根据网页显示用户输入内容位置的不同,而采用不同的编码方式。用户的输入可能在网页的多个地方进行输出,比如HTML标签中、HTML属性中,URL中,事件中等等。ESAPI提供了对以上输出场景的编码方案。

⑴ 对于在HTML标签中输出和在Html属性中输出时均可采用HtmlEncode编码方案。例如:

String safeinput=ESAPI.encoder().encodeForHTML

(request.getParameter(“userinput”));

⑵ 在事件中输出时可采用JavascriptEncode编码方案。

String safeinput=ESAPI.encoder().encodeForJavaScript

(request.getParameter(“userinput”));

⑶ 在地址栏中输出时可采用URLEncode编码方案。例如:

Link

经过URLEncode编码后将变为:

28123%29%22”>

⑷ 处理富文本

论坛中的帖子是最常见的“富文本”。它允许用户插入图片、视频、音频等。在处理富文本时的思路还是进行“输入检查”。在处理富文本时,“事件”应该被严格禁止,而且一些危险的标签也应该被过滤掉,例如

属性“name”的值是用户的输入内容,对此,浏览器会对该值进行两种解码,首先是进行HTML解码,然后进行JS解码。因此对于此位置上的用户输入应当在服务器端先进行HTML编码,其次进行JS编码[8]。

String safeinput=ESAPI.encoder().encoderForJavaScript

(request.getParameter("name"));

safeinput=ESAPI.encoder().encoderForHTML(safeinput);

如果对“name”的值只进行HTML编码而不进行JS编码结果会怎样?首先测试最简单的字符串,将“name”的值赋值为“”,浏览器弹出“”。对于期待的效果弹出字符串“XSS”似乎并没有实现,这样看来只使用HTML编码似乎起到了作用,但适当改变“name”的值就会是另一种结果。如果改变“name”的值为“正常弹出);alert(‘XSS攻击”,则会出现“正常弹出”,然后出现“XSS攻击”。不难看出,当改变“name”的值后,alert的闭合情况发生了改变。“name”值中的“);”首先闭合了第一个alert,即“alert(‘正常弹出)”,然后是“alert(‘XSS攻击)”。由此看来,在此只进行HTML编码是不行的。如果在此同时进行了HTML编码与JS编码,效果如图2所示。

3.2 其他防御XSS攻击的办法

除了第2小节的方法外,还需要以下几种手段进行辅助。

⑴ 防止Cookie劫持

针对此攻击有一个比较不错的防御办法是使用HttpOnly属性。通过为Cookie增加HttpOnly属性,即可大大降低Cookie被劫持的风险。如果Cookie带有HttpOnly属性,则浏览器会禁止JavaScript访问该Cookie。添加方法是在web.xml中配置为true。

⑵ 输入检查

对于用户的输入都必须进行输入检查。主要检查在用户的输入中,是否包含了一些危险字符如<、、”和一些危险标签如

公司地址: 北京市西城区德外大街83号德胜国际中心B-11

客服热线:400-656-5456  客服专线:010-56265043  电子邮箱:longyuankf@126.com

电信与信息服务业务经营许可证:京icp证060024号

Dragonsource.com Inc. All Rights Reserved

icp