跨站脚本
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
“跨站脚本”的各地常用名称 | |
---|---|
中国大陆 | 跨站脚本 |
台湾 | 跨网站指令码 |
此条目可参照英语维基百科相应条目来扩充。 |
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
背景和现状
当网景(Netscape)最初推出JavaScript语言时,他们也察觉到准许网页伺服器发送可执行的代码给一个浏览器的安全风险(即使仅是在一个浏览器的沙盒里)。它所造成的一个关键的问题在于用户同时开启多个浏览器视窗时,在某些例子里,网页里的片断代码被允许从另一个网页或物件取出资料,而因为恶意的网站可以用这个方法来尝试窃取机密资讯,所以在某些情形,这应是完全被禁止的。为了解决这个问题,浏览器采用了同源决策——仅允许来自相同域名系统和使用相同协议的物件与网页之间的任何交互。这样一来,恶意的网站便无法借由JavaScript在另一个浏览器窃取机密资料。此后,为了保护用户免受恶意的危害,其他的浏览器与服务端指令语言采用了类似的存取控制决策。
XSS漏洞可以追溯到1990年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter[1],Facebook[2],MySpace,Orkut[3][4] ,新浪微博[5]和百度贴吧 。研究表明[6],最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。[7]
缩写
Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross(意为“交叉”)改以交叉形的X做为缩写。但早期的文件还是会使用CSS表示Cross-site scripting。
检测方法
通常有一些方式可以测试网站是否有正确处理特殊字符:
><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
"><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert('vulnerable')</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
<img src="http://888.888.com/999.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)"></div>
(这个仅于IE7或以前有效)
攻击手段和目的
攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感资讯),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的伺服器上。
常用的XSS攻击手段和目的有:
- 盗用cookie,获取敏感资讯。
- 利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
- 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
- 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DoS攻击的效果。
漏洞的防御和利用
过滤特殊字符
避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:
- PHP的
htmlentities()或是htmlspecialchars()
。 - Python的
cgi.escape()
。 - ASP的
Server.HTMLEncode()
。 - ASP.NET的
Server.HtmlEncode()
或功能更强的Microsoft Anti-Cross Site Scripting Library (页面存档备份,存于互联网档案馆) - Java的xssprotect (Open Source Library) (页面存档备份,存于互联网档案馆)。
- Node.js的node-validator。
使用HTTP头指定类型
很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:
<?php header('Content-Type: text/javascript; charset=utf-8'); ?>
即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。
用户方面
包括Internet Explorer、Mozilla Firefox在内的大多数浏览器皆有关闭JavaScript的选项,但关闭功能并非是最好的方法,因为许多网站都需要使用JavaScript语言才能正常运作。通常来说,一个经常有安全更新推出的浏览器,在使用上会比很久都没有更新的浏览器更为安全。
参阅
- 内容安全策略
- 苍月浏览器—过滤跨站脚本(XSS)的网络浏览器
- SGML实体
- Metasploit—一个包含XSS测试的开源渗透测试工具
外部链接
- CERT® Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests (页面存档备份,存于互联网档案馆) (英文)
- Cross Site Scripting Info (页面存档备份,存于互联网档案馆) (英文)
- The Same Origin Policy (页面存档备份,存于互联网档案馆) (英文)
- XSS (Cross Site Scripting) Cheat Sheet (英文)
脚注
- ^ Arthur, Charles. Twitter users including Sarah Brown hit by malicious hacker attack. The Guardian. September 21, 2010 [September 21, 2010]. (原始内容存档于2011-01-20).
- ^ Leyden, John. Facebook poked by XSS flaw. The Register. May 23, 2008 [May 28, 2008]. (原始内容存档于2011-10-11).
- ^ Full List of Incidents. Web Application Security Consortium. February 17, 2008 [May 28, 2008]. (原始内容存档于2010-10-21).
- ^ Obama site hacked; Redirected to Hillary Clinton. ZDNet. April 21, 2008 [May 28, 2008]. (原始内容存档于2014-03-27).
- ^ 新浪微博病毒事件分析. SOHU. 2011-06-28 [2011-10-18]. (原始内容存档于2011-09-05).
- ^ Berinato, Scott. Software Vulnerability Disclosure: The Chilling Effect. CSO (CXO Media). January 1, 2007: 7 [June 7, 2008]. (原始内容存档于2008-04-18).
- ^ OWASP Top 10 - 2010 Document (PDF). OWASP. April 19, 2010 [Jan 2, 2013]. (原始内容 (PDF)存档于2012年12月4日).