跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码(通过HTML代码和客户端Javascript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。
开放式Web应用程序安全项目(Open Web Application Security Project,OWASP)是世界上最知名的Web安全与数据库安全研究组织,在该组织发布的2017年的统计中,XSS跨站脚本漏洞高居第三位。
1.Web浏览器本身的设计。浏览器包含了解析和执行JavaScript等脚本语言能力,这些语言可以创建各种格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否有恶意;
2.交互过程。输入与输出是Web应用程序最基本的交互,在这个过程中若没有做好安全防护,Web应用程序很容易出现XSS漏洞;
3.XSS漏洞危害意识。很多人没有真正意识到XSS漏洞的危害,导致XSS漏洞受到开发人员忽视;
4.触发方式简单。只要向HTML代码中注入脚本即可,且执行手段众多,譬如CSS、Flash等,完全防御是一件相当困难的事情;
5.Web2.0的流行。Web2.0时代鼓励用户信息分享与交互,产生了越来越丰富的交互功能,如论坛、博客或社交网络,所以产生XSS漏洞的概率增加。
反射型跨站脚本(Reflected Cross-site Scripting)也称作非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见的,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中。
反射型XSS的利用一般是攻击者通过特定的手法(如电子邮件),诱使用户去访问一个包含有恶意代码的URL,当受害者点击这些链接的时候,恶意的JavaScript代码会直接在受害者主机上的浏览器执行。只有在用户点击时才触发,而且只执行一次,非持久化,恶意URL的暴露问题可通过各种编码转换解决,以增强其迷惑性。此类XSS通常出现在网站的搜索栏、用户登入口的地方,常用来窃取客户端Cookie或进行钓鱼欺骗。
持久型跨站脚本(Persistent Cross-site Scripting)也称作存储型跨站脚本(Stored Cross-site Scripting),比反射型跨站脚本更具有威胁性,并且可能影响到Web服务器自身的安全。
持久型跨站脚本的利用不需要用户点击特定的URL,持久型XSS一般出现在网站的留言、评论、博客日志等交互处,攻击者事先将恶意的JavaScript代码上传或存储到具有漏洞的服务器中,只要用户浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
持久型跨站脚本的危害比反射型XSS大,更严重的是持久型跨站脚本能轻易编写危害性更大的XSS蠕虫,跨站蠕虫是使用Ajax/JavaScript脚本语言编写,能在网站中事先病毒的几何数级传播,其感染程度和攻击效果十分可怕。
1. 绕过XSS-Filter
为了防御跨站脚本攻击,会在Web应用中设计一个XSS Filter,即跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击、恶意的HTML或简单的HTML格式错误。XSS Filter一般是基于黑白名单的安全过滤策略,在用户提交信息时,会对所有的输入进行检验,如检测到黑名单中的数据,便进行拦截、编码和消毒过滤等处理。
以下从“攻”的角度探讨一些测试用例:
(1)利用<>标记注入HTML/JavaScript
如果未限制<>等标记,那攻击者就能操作一个HTML标签,然后通过<script>标签插入恶意代码脚本;
<script>alert(1);</script> //弹出窗口显示“1”
(2)利用HTML标签属性值执行XSS
很多HTML标记中的属性都支持JavaScript:[code]伪协议形式,这个特殊的协议类型声明了URL主体是任意的JavaScript代码,由JavaScript的解释器运行,攻击者可以利用部分HTML标记的属性值进行XSS攻击;此类攻击具有一定的局限性,并不是所有的浏览器都支持Javascript伪协议
<table background="javascript:alert(1);"></table> //通过表格背景属性插入javascript代码
<img src="javascript=alert(1);"> //通过图片链接插入javascript代码
还有如下属性:href=、lowsrc=、bgsound=、value=、action=、dynsrc=等
注:通常只有引用文件的属性才能触发跨站脚本,也并非所有嵌入到Web页面中的脚本都是Javascript,还允许有其他值,比如Vbscript。
(3)空格回车Tab键
如果XSS Filter仅仅把敏感的输入字符列入黑名单,对敏感字javascript而言,用户可以利用空格、回车和Tab键绕过限制:
<img src="java script:alert(1);"> //java和script中的间隔为Tab键
产生原因为JavaScript语句通常以分号结尾,如果JavaScript引擎确定一个语句是完整的,而这一行的结尾有换行符,那就可以省略分号,如果同一行由多个语句,那么每个语句就必须使用分号结束。除了在引号中分割单词或强制结束语句外,额外的空白无论与何种方式添加都无所谓;
var a= true //单语句可省略分号
var a= true; var b= "this is also true"; //同一行多语句以‘;’结束
var a
='hello word'; //换行赋值成功
(4)对标签属性值转码
对普通的HTML标签属性值进行过滤,攻击者可以通过编码处理来绕过,因为HTML中属性值本身支持ASCII码形式。
<img src="javascript:alert(1);"> //标准代码
<img src="javascript:alert(1);"> //ASCII编码后
//‘t’的ASCII码值为166,用‘t’表示,‘:’则表示为‘:’
//此外Tab键的ASCII码‘ ’、换行键的‘
’、回车键的‘
’可以被插入到代码的任意位置。
为了防范利用HTML标签属性值编码的XSS,最好也过滤‘&’,‘#’,‘\’等字符;
(5)产生自己的事件
JavaScript与HTML之间的交互是通过事件来实现的,事件就是用户或浏览器自身执行的某些动作,而响应事件的函数就叫做事件处理函数(或事件侦听器)
//点击【click me】按钮,触发onclick事件,执行JavaScript代码
<input type="button" value="click me" onclick="alert('click me')" />
攻击者可以通过大量事件执行跨站脚本,只列举部分:
<img src=x onerror=alert(1)>
//onerror是img标记的一个事件,只要页面发生错误,该事件立即被激活
ondblclick //鼠标双击某个对象
onkeypress //某个键盘的键被按下或按住
onload //某个页面或图像被完成加载
onmousemove //鼠标被移动
onsubmit //提交按钮被点击
(6)扰乱过滤原则
<img src="javascript:alert(1);"> //正常
<IMG SRC="javascript:alert(1);"> //转换大小写
<iMg sRC="jaVasCript:alert(1);"> //大小写混淆
<img src='javascript:alert(1);'> //使用单引号
<img src=javascript:alert(1);> //不使用引号
<img src="java/*javascript*/script:alert(1);"> //使用注释
//除了/**/之外,样式标签中的‘\’和结束符‘\0’也是被浏览器忽略
以上的XSS构造技巧只是冰山一角,由于Web浏览器种类、版本的不同,各自的HTML、CSS、JavaScript等引擎也存在着各种各样的差异,再加上各个站点采用了不同的XSS检测和防范策略,XSS构造技术五花八门、包罗万象。在测试XSS的过程中,需要尝试各种XSS注入语句,以绕过服务器端对跨站脚本的过滤,国外著名安全工程师Rsnake把自己对XSS的研究总结成XSS Cheat Sheet,当中罗列了各种各样的XSS代码,引用中文翻译的一片文章。
XSS Filter Evasion Cheat Sheet 中文版
XSS攻击属于被动式攻击,具有一定的局限性,只能在用户访问特定页面的时候才会触发漏洞,离开页面后攻击也随之失效。以下简单剖析一些常见的XSS攻击的利用:
窃取客户端Cookie资料是XSS攻击最常见的应用方式之一。
Cookie是用户浏览网页时网站存储在用户机器上的小文本文件,记录了与用户相关的一些状态或设置,比如用户名、ID、访问次数等,当用户再一次访问这个网站的时候,网站会先访问用户机器上对应的该网站的Cookie文件,并从中读取信息,以便快速访问。
Session会话控制:Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。Session和Cookie的最大区别在于:Session是保存在服务器端的内存里面,而Cookie保存于浏览器或客户端文件里面。
会话劫持指攻击者利用XSS劫持了用户的会话去执行某些恶意操作,这些操作往往能达到提升权限的目的。
**网络钓鱼(Phishing)**是一种利用网络进行欺诈的手段,主要通过受害者心理弱点、好奇心、信任度等心理陷阱来实现诈骗,属于社会工程学的一种。网络钓鱼利用有一定概率使人信任并相应的原则进行攻击,现今在很多客户端和大型Web网站加入了反钓鱼功能,因此成功率较低。
但人们未意识到集合XSS技术的网络钓鱼是最具威胁的一种攻击手段,传统的钓鱼攻击通过复制目标网站与用户进行交互而实现,这种钓鱼网站域名和页面一般是独立的,而结合XSS技术后,攻击者能通过JavaScript动态控制页面内容和Web客户端的逻辑,使XSS钓鱼的欺骗性和成功率大大增加。
运用一些JavaScript/CSS的技巧,攻击者能获取用户浏览器的某些历史记录,甚至是在搜索引擎输入的查询字符,其原理只是利用了CSS能定义和控制链接样式的特性
通过JavaScript/XSS提取有用的客户端信息,如浏览器访问记录、IP地址、开发端口等,即可发动新一轮的攻击
(1)JavaScript实现端口扫描
JavaScript可对用户本地网络中的主机进行端口扫描,这可以探测其主机提供的计算机网络服务类型,这些服务与端口号相关,例如21端口对应FTP服务,3306端口对应Mysql服务等。
(2)截取剪切板内容
JavaScript有一个很强大的特性,就是可以操作客户端的剪贴板内容,在用户浏览网页时,粘贴复制的一些重要的信息,这些信息可能含有用户账号、密码等一些隐私数据。如果网站存在XSS漏洞,攻击者就可以窃取到这些重要的信息:
clearData(sDataFormat) //删除剪贴板中指定格式的数据
getData(sDataFormat) //从剪贴板获取指定格式的数据
setData(sDataFormat, sData) //给剪贴板赋予制定格式的数据
(3)获取客户端IP地址
利用JavaScript脚本代码,还能够获取客户端内网IP,依托一些IP查询网站,即可获取外网IP。
(1)网页挂马:网页木马隐蔽性很高,看似正常的网页,在用户浏览时运行木马程序,因为在浏览器中执行下载运行,用户是无法察觉的。网页挂马技术门槛不高,但下载的病毒危害性很高。网页挂马方式很多,一般都是通过篡改网页来实现的,例如在XSS攻击中使用
<iframe src=xxx width=0 height=0></iframe>
//由于高度宽度都设置为0,所以用户不会察觉到
(2)DOS和DDOS
DOS(Denial of Service)是拒绝服务攻击,这种攻击会利用大量数据包“淹没”目标主机,耗尽资源导致系统崩溃,使目标主机无法对用户作出相应反馈。
<script>for (;;) alert(1);</script> //无尽弹框,但可被浏览器禁止
<meta http-equiv=“refresh” content=“0”> //不断刷新页面
DDOS(Distributed Denial of Service)是指分布式拒绝服务攻击,是目前攻击者经常采用而难以防范的攻击手段。攻击者利用因特网上成千上万的Zombie(僵尸,即被利用的主机),对目标发动威力巨大的拒绝服务攻击。攻击者通过XSS注入恶意代码对一个网站持续不断地发送请求,或通过XSS劫持大量的浏览器实施此攻击
(3)XSS Virus/Worm:类似于个人计算机平台上的病毒,有潜伏、后门的特性,可以用于盗号、窃取用户隐私信息,主要在客户端执行恶意攻击,类似蠕虫病毒具有自我复制的攻击形态,因为使用JavaScript、Vbsccript等客户端语言编写,所以在Web平台能得到很好的支持。由于JavaScript等语言控制着Web客户端的逻辑,所以破坏性很强,能执行许多恶意操作,例如非法转账、任意篡改页面信息、删除目标文章等,如果利用XSS进行大批量的挂马,将造成更加严重的后果。
1.Google Chrome插件
(1)EditThisCookie
(2)HTTP Headers
(3)ModHeader
2.Firefox浏览器插件
3.Fiddler
Fiddler是一款免费且功能强大的HTTP/HTTPS网络调试器,该工具能检测和记录所有客户端和服务器之间的HTTP通信,此外还提供了清除IE缓存、请求构造器、文本转换等功能。
4.Kali-BeEF
BeEF是The Browser Exploitation Framework的缩写。它是一种专注于Web浏览器的功能强大的渗透测试工具。为经验丰富的渗透测试人员提供实用的客户端攻击向量。BeEF专注于利用浏览器漏洞来评估目标的安全状况。该框架包含许多使用简单而强大的API的命令模块,也支持自定义模块的开发。
5.在线XSS平台
XSS平台