跨站脚本攻击,Cross-site script,是Web程序中最常见的漏洞。为了和CSS层叠样式表区分开,所以取名为 XSS。
一、XSS的重点
跨域和客户端执行。
二、XSS的原理
攻击者向有XSS漏洞的网站中输入恶意的html或js代码,当其它用户浏览该网站时,html或js代码会自动执行,从而达到攻击的目的。
三、XSS的分类
1、存储型,持久型
在客户端文本框输入某脚本代码,提交到服务器,如果服务器没有过滤或转义掉这些脚本,直接存入数据库,其他用户访问这个页面的时候就会运行这段脚本。存储型XSS的攻击影响力比较大,有时候服务端需要删好几张表,查询很多库才能将恶意代码的数据进行删除。
例如,在评论文本框中输入
<script> while(true) { alert('你关不掉我'); } </script>
2、反射型,非持久型
一来一去,脚本代码被服务器反射回来给浏览器执行,称为反射型XSS。反射型XSS是一次性的,仅对当次的页面访问产生影响。反射型XSS是对一个页面的URL中的某个参数做文章,把精心构造好的恶意脚本包装在URL参数中,再将这个URL发布到网上,骗取用户访问,从而进行攻击。反射型XSS的安全威胁比较小,因为只要服务器调整业务代码进行过滤,黑客精心构造的这段URL就会瞬间失效了。
例如,某网站A页面有搜索功能,历史记录的存取是前端通过cookie实现的,前端从文本框获取关键字及信息存入cookie,然后从url中的kw参数值来读出对应的cookie信息。
如果在地址栏url后面手动拼接
sfrom=syiconf8uk1"><script>alert(1)</script>m4cho
,回车后,页面会弹出1,也就是说url里面的代码执行了。解决办法是在存cookie的时候,对关键字进行特殊格式过滤。
function stripscript(s) { var pattern = new RegExp("[`~!@#$^&*()=|{}':;',\[\].<>/?~!@#¥……&*();—|{}【】‘;:”“'。,、?]"); var rs = ""; for (var i = 0; i < s.length; i++) { rs = rs + s.substr(i, 1).replace(pattern, ''); } return rs; }
3、基于DOM或本地的XSS攻击。
一般是提供一个免费的wifi,但是提供免费wifi的网关会往你访问的任何页面插入一段脚本或者是直接返回一个钓鱼页面,从而植入恶意脚本。DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。
四、XSS的危害
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
2、盗取用户的Cookie;
3、破坏页面结构;
4、重定向到其它网站。
五、XSS的防御
理论上,网站内所有可输入的地方没有对输入内容进行处理的话,都会存在XSS漏洞,漏洞的危险取决于攻击代码的威力,攻击代码也不局限于script,防御XSS最简单直接的方法就是过滤用户的输入。
1、将重要的cookie标记为http only这样Javascript中的document.cookie语句就不能获取到cookie了;
2、只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉;
3、对数据进行Html转义处理;
4、过滤或移除特殊的html标签,例如: <script>, <iframe> , < for <, > for >, " for;
5、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。