XSS(Cross Site Script,跨站脚本)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,跨站脚本攻击缩写为XSS。
一、危害
1、盗取各类用户账号,如机器登录账号、用户网银账号、各类管理员账号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
二、XSS分类
1、存储型XSS
攻击步骤:
1)攻击者将将恶意代码提交到目标网站的数据库中。
2)用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
3)用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4)恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
2、反射型XSS(非持久型XSS)
非持久型XSS攻击是一次性的,仅对单次的页面访问产生影响。非持久型XSS攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户浏览器执行,从而达到攻击的目的。
攻击步骤:
1)攻击者构造出特殊的 URL,其中包含恶意代码。
2)用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
3)用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4)恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
3、DOM型XSS
DOM(Document Object Model,文档对象模型)
攻击步骤:
1)攻击者构造出特殊的 URL,其中包含恶意代码。
2)用户打开带有恶意代码的 URL。
3)用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
4)恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
DOM型XSS和反射型XSS的去区别:反射型XSS提交的数据会经过服务器,而DOM型XSS不会。
三、XSS的预防
XSS攻击发生有两大要素:
1)攻击者提交恶意代码
2)浏览器执行恶意代码
1、客户端预防
浏览器一般都有关闭Javascript的功能,但是关闭并不能解决问题,因为所有的网站都有用到Javascript,如果关闭了,则会造成很多功能失效。
有些浏览器自带XSS过滤器,可以在一定程度上预防。但是一旦攻击者绕过前段过滤,直接构造请求,仍然可以提交恶意代码。
2、服务器端预防
1)输入验证
页面上如果要求输入的是年龄或者年月日,那么只允许输入整型;如果是邮件,那么就按照邮件的格式做严格检查,如果不符合预先定义的格式或有效范围,则拒绝此次请求。但是随着网站内容的丰富多彩,用户的需求也越来越多,有些输入框加上限制反而会影响用户体验度,这些情况下,只靠输入检查就不能解决问题。
2)网络防火墙
大部分的WAF是通过制定规则,然后分析消息内容中是否和规则匹配,如果匹配则说明可能存在XSS注入问题。但是最大的局限性就在于如何制定一个匹配所有XSS可能攻击的规则。另外借助一些第三方的软件或者硬件,把希望寄托于别人,总不是太好的方法。
3)输出编码
肯定有人要问为什么不在输入的地方做编码?如果输入的地方只在一个地方输出,那么只需要一种编码即可,但是如果在多页面输出,而且输出的背景环境也不一样,那么就不需要不同的编码,再输入时,就没有办法也不可能统一处理。即使目前所有的输出编码是一样的,将来也有可能出现其他的编码情况,所以,需要在输出之前进行编码。
①URL编码
②HTML编码
③JavaScript编码