XSS 概述
XSS(Cross Site Script)即跨站脚本攻击,发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML 文档过程中出现了不被预期的脚本指令并执行时,XSS 就会发生。
关键点是:
1.目标网站的目标用户:这里强调了场景。
2.浏览器:因为这类攻击是由浏览器来解析执行的。浏览器当然不会看到什么就解析什么,它们会严格执行共同约定的同源策略,不符合约定的就不会执行。
3.不被预期的:那么就很有可能是攻击者在输入时提交了可控的脚本内容,然后在输出后被浏览器解析执行。
XSS 类型
XSS 有三类:反射性XSS(也叫非持久型XSS)、存储型XSS(也叫持久型XSS)和DOM XSS。
反射型XSS
发出请求时,XSS 代码出现在URL 中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS 代码,最后浏览器解析执行。这个过程就像一次反射,故称为反射型XSS。
反射型XSS 只是简单地把用户输入的数据“反射” 给浏览器。也就是说,黑客往往需要诱使用户“点击” 一个恶意链接,才能攻击成功。反射型XSS 也就早“非持久型XSS”(No-persistent XSS)
存储型XSS
存储型XSS 和反射型XSS 的差别仅在于:提交的XSS 代码会存储在服务端(不管是数据库、内存还是文件系统等),下次请求目标页面时就不要那个再提交XSS 代码。
最典型的例子是留言板XSS,用户提交一条包含XSS 代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS 代码,就当作常常的HTML 与JS 解析执行,于是就触发了XSS 攻击。
还有一个比较常见的场景就是,黑客写下一篇包含有恶意JavaScript 代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的代码。黑客把恶意的脚本保存到服务器端,所以这种XSS 攻击就叫做“存储型XSS”。
存储型XSS 的攻击是最隐蔽的。
DOM XSS
DOM XSS 与存储型XSS 和反射型XSS 的差别在于,DOM XSS 的XSS 代码并不需要服务器解析响应的直接参与,触发XSS 靠的就是浏览器端的DOM 解析,完全可以认为是客户端的事情。
实际上,这种类型的XSS 并非按照“数据是否保存在服务器端”来划分,DOM XSS 从效果上来说也是反射型XSS。单独划分出来,是因为DOM XSS 的形成原因比较特别,发现它的安全专家专门提出了这种类型的XSS。处于历史原因,也就把它单独作为一个分类了。
通过修改页面的 节点形成的XSS,称之为DOM XSS。
XSS 危害
1.挂马。
2.盗取用户Cookie。
3.Dos(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级钓鱼技巧。
5.编写针对性的XSS 病毒,删除目标文章、而已篡改数据、嫁祸、“借刀杀人”。
6.劫持用户Web 行为,甚至进一步渗透内网。
7.爆发Web 2.0 蠕虫。
8.蠕虫式的DDoS 攻击。
9.蠕虫式挂马攻击、刷广告、刷流量、破坏网上数据。
XSS 防御
1.XSS filter
微软率先在IE 8 中推出了XSS filter 功能,用以对抗反射性XSS。当用户方位的URL 中包含了XSS 攻击的脚本时,IE 就会修改其中的关键字符使得攻击无法完成,并对用户弹出提示框。
2.Content Security Policy(CSP)
Firefox 在Firefox 4 中推出了CSP。其做法是由服务器端返回一个HTTP 头,并在其中描述页面应该遵守的安全策略。
由于XSS 攻击在没有第三方插件帮助的情况下,无法控制HTTP 头,所以这项措施是可行的。
参考文档
1.《Web 前端黑客技术解密》 第3 章 前端黑客之XSS
2.【基本功】 前端安全系列之一:如何防止XSS攻击? 美团技术团队