1 简述
- XSS,跨站脚本攻击(Cross Site Scripting),为避免和CSS缩写同名,缩写为XSS
- XSS通常是指攻击者利用网页开发的漏洞,植入恶意的代码指令到网页中并使用户加载并执行,恶意的脚本指令大多为JS,但也可以是Java、VBScript、HTML等。恶意的脚本执行后,攻击者可以获得私密的网页内容、会话和cookie等各种内容,以及获得更高的页面操作权限
- XSS本质就是恶意的脚本代码和正常的代码混杂在一起,浏览器无法分辨,导致恶意脚本执行
2 XSS分类
2.1 存储型XSS攻击
会经常发生在内容驱动、用户保存数据的社区网站上,比如具备论坛发帖、商品评论、用户私信等功能的网站,危害比较大,可以说是永久型的
- 攻击者事先将恶意脚本代码提交到目标网站服务端数据库内(通过用户提交时夹杂脚本代码)
- 当用户打开该目标网站时,服务端将恶意代码取出拼接HTML返回给浏览器
- 用户浏览器接收到响应后立即执行,而恶意的脚本代码也被自动执行,从而冒充用户,窃取用户数据发送到攻击者网站,或者调用接口执行其他操作
2.2 反射型XSS攻击
反射型XSS漏洞常见于具有通过URL传递参数的功能网站,如网站搜索、跳转等,需要引导用户主动打开URL,和存储型XSS攻击的区别是反射型存储在URL中,存储型存储在数据库中
- 攻击者通过混杂入恶意脚本构造恶意的URL
- 用户点击打开含有恶意脚本的URL,网站服务端将恶意代码从URL中取出,拼接在HTML返回给浏览器
- 用户接收到后,浏览器执行恶意代码,同上,窃取用户数据或者调取接口执行操作
2.3 DOM型XSS
DOM型XSS攻击主要是前端浏览器直接取出恶意代码,而前两者是由后端先取出再拼接返回。
- 攻击者利用恶意脚本构造恶意URL
- 用户直接点开恶意的URL,浏览器响应后直接解析执行,前端JS取出URL并执行
- 浏览器执行恶意代码,同上,窃取用户数据或者调取接口执行操作
比如是诱导用户点击后往img标签src属性里插入恶意脚本等
以上三种XSS攻击主要都是要攻击者构造恶意的脚本执行攻击,存储型和反射型主要是后端安全问题,DOM型主要是前端安全问题
2.4 通用型XSS
通用型XSS,UXSS,主要是浏览器和浏览器扩展漏洞造成产生XSS并执行代码的XSS攻击,浏览器的漏洞到被官方发现解决都要有一段时间,并且许多的浏览器扩展程序漏洞更多,这一过程很有可能被用于UXSS。
比如一些浏览器扩展漏洞可以造成从外部获取数据填充网页表单,伪造文件访问邮件网站设置添加转发地址等
2.5 突变型XSS
突变型XSS,MXSS,大概是用户提供的原本是安全的文本信息,但一些意外的变化,可能使得原本正常的标签等不再是正常的,浏览器执行的时候会出现意外的情况
大多数MXSS是通过恶意脚本拼接在innerHTML中,通过意外的转义各种情况导致恶意的攻击
详见这一次,彻底理解XSS攻击
3 XSS攻击的预防
XSS攻击有两大要素
- 攻击者提交恶意代码
- 浏览器执行恶意代码
3.1 输入过滤
过滤调用户输入时攻击者伪造的脚本的代码,但攻击者绕开前端输入直接构造请求就可以避免掉
3.2 前端渲染时代码和数据分开
在前端渲染的过程中,明确告诉浏览器,下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。并在JS中,可以使用textContent或者innerText的地方,尽量不使用innerHTML;
3.3 预防DOM型XSS攻击
主要是防止JS把不可信的数据当作代码执行,尽量使用 .textContent、.setAttribute(),减少使用.innerHTML、.outerHTML、document.write()
3.4 转义HTML
把 & < > " ’ / 这几个字符转义掉,不过只对于HTML标签文字内容和属性值有效,其他的CSS内联样式,内联JSON无效,也可以使用一些完善的转义库进行转义