跨站脚本(cross-site scripting,XSS)是一种安全攻击,其中,攻击者在看上去来源可靠的链接中恶意嵌入译码。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了
HTML以及用户端脚本语言。
简介
跨站脚本(cross-site scripting,XSS)是一种安全攻击,其中,攻击者在看上去来源可靠的链接中恶意嵌入译码。当有人点击链接,嵌入程序作为客户网络要求的一部分提交并且会在用户电脑上执行,一般来说会被攻击者盗取信息。
动态回复包括用户输入数据在内的错误信息这种网络形式使得攻击者可能改变控制结构和/或页面的行为。攻击者用多种方式进行攻击,如通过在论坛信息或垃圾邮件信息链接中嵌入密码。攻击者可能用电邮诈骗假装可信来源。
像其它网络攻击一样,如SQL injection,很多对跨站脚本(cross-site scripting, XSS)的指责都指向引起可能性的不安全应用。动态产生页面的网络服务器应用如果不能确认用户输入并确保产生的页面都正确编码了,他们会易受跨站脚本攻击。能造成跨站脚本的攻击有时候指得是跨站脚本漏洞。
为了不受跨站脚本(cross-site scripting, XSS)的攻击,专家建议,网络应用应该包括适当的安全机制,且服务器应该理所当然地确证输入。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是
JavaScript,但实际上也可以包括
Java,
VBScript,ActiveX,Flash或者甚至是普通的
HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和
cookie等各种内容。
背景和现状
当
网景(Netscape)最初推出
JavaScript语言时,他们也察觉到准许网页服务器发送可执行的代码给一个
浏览器的安全风险(即使仅是在一个浏览器的
沙盒里)。它所造成的一个关键的问题在于用户同时打开多个浏览器
视窗时,在某些例子里,
网页里的片断代码被允许从另一个网页或
对象取出数据,而因为恶意的
网站可以用这个方法来尝试窃取机密信息,所以在某些情形,这应是完全被禁止的。为了解决这个问题,浏览器采用了同源决策——仅允许来自相同域名系统和使用相同协议的对象与网页之间的任何交互。这样一来,恶意的网站便无法借由JavaScript在另一个浏览器窃取机密数据。此后,为了保护用户免受恶意的危害,其他的浏览器与服务端指令语言采用了类似的
访问控制决策。
XSS漏洞可以追溯到1990年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如
Twitter,
Facebook,
MySpace,
Orkut,
新浪微博和
百度贴吧。研究表明,最近几年XSS已经超过
缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于
代码注入(Injection)。
检测方法
通常有一些方式可以测试网站是否有正确处理特殊字符:
攻击手段和目的
攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以
数据库等形式记录在攻击者自己的服务器上。
常用的XSS攻击手段和目的有:
漏洞的防御和利用
过滤特殊字符
避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对
HTML的过滤:
使用HTTP头指定类型
很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在
PHP语言中使用以下代码:
即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。
用户方面
包括
Internet Explorer、
Mozilla Firefox在内的大多数浏览器皆有关闭JavaScript的选项,但关闭功能并非是最好的方法,因为许多网站都需要使用JavaScript语言才能正常运作。通常来说,一个经常有安全更新推出的浏览器,在使用上会比很久都没有更新的浏览器更为安全。