XSS
称为跨站脚本攻击(Cross Site Scripting),它的缩写原本应是CSS
,但是由于与层叠样式脚本(Cascading Style Sheets,简称CSS)重名,所以将缩写改为XSS
。
它是一种代码注入攻击,发生在目标网站中目标用户的浏览器层面上。攻击者在目标网站上注入恶意代码,当用户浏览目标网站时,浏览器会渲染整个HTML
文档,这个过程中出现了不被预期的脚本指令,并且被浏览器执行了,XSS
就会发生。
利用这些恶意代码,攻击者可以获取用户的敏感信息如Cookie
、sessionId
等,控制用户的账号权限,进而危害数据安全。
在XSS
攻击中,恶意代码与网站正常的代码混合在一起,浏览器没办法分辨出哪些代码是可信的,哪些代码是不可信的,于是会将恶意代码与正常代码一起执行,导致用户信息泄漏。
根据攻击的来源,XSS
攻击可以分为存储型、反射型、DOM型3类。
反射型XSS
又称为非持久型XSS
,这种攻击一般是一次性的,攻击代码被存储在url中,作为输入提交到服务端,服务端解析后响应,响应内容中出现这段XSS
代码,最后浏览器解析执行。这个过程就像一次反射,所以叫反射型XSS
。
反射型XSS
基本攻击步骤如下:
XSS
代码的链接发送给用户,诱导用户点击链接。url
中取出,拼接在HTML
中返回给浏览器。例如,当前我写了这样一段html
:
<div>
你好<%- xss%>
div>
如何我输入这个url
:http://xxx?xss=
,那么页面中会弹出写着“XSS
”的对话框。
存储型XSS
又称为持久型XSS
,它与反射型XSS
的区别在于,攻击代码被存储在服务端(包括数据库、内存和文件系统等),下次请求目标页面时不用再提交XSS代码,具有更强的隐蔽性。
存储型XSS
基本攻击步骤如下:
HTML
中返回给浏览器。最典型的例子就是留言板XSS
。
DOM型XSS
与反射型、存储型的区别在于,DOM型的XSS
代码不需要服务器解析响应的直接参与,触发XSS
靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
DOM的XSS
也是一种非持久性的攻击,⼀般通过修改URL
参数的⽅式加⼊攻击代码,诱导⽤户访问链接从⽽进⾏攻击。攻击步骤如下:
URL
,其中包含恶意代码。URL
。JavaScript
取出URL
中的恶意代码并执行。例如,触发XSS
的方式可以是输入一段这样的url
:http://xxx.com#alert(1)
,常见的输入点有:
document.URL
document.location
document.cookie
常见的输出点:
document.write()
document.body.innerHtml = ...
document.create...(...)
document.open(...)
XSS
攻击的实现需要有两个必要条件:
纯前端渲染是指,浏览器首先加载一个空白的HTML
,然后执行该HTML
引入的JS
文件,JS
通过AJAX
获取业务数据,调用DOM API,更新到页面上。
在纯前端渲染中,我们会明确的告诉浏览器:这是文本.innerText
,还是属性.setAttribute
,还是样式.style
等等。
纯前端渲染可以避免存储型和反射型的攻击,但没法避免DOM型,攻击者可以通过onload
事件、href
中嵌入javascript:...
进行攻击。
对于需要考虑SEO
的SSR
项目,不得不在服务端拼接HTML
文件。那么必须使用HTML
转义库,基本规则是将& < > " ' /
几个字符转义掉,但是并不完善:
XSS安全漏洞 | 简单转义是否有防护作用 |
---|---|
HTML标签 | 有 |
HTML属性值 | 有 |
CSS内联样式 | 无 |
内联js | 无 |
内联JSON | 无 |
跳转链接 | 无 |
DOM 型XSS
攻击,实际上就是网站前端JavaScript
代码本身不够严谨,把不可信的数据当作代码执行了。
在使用.innerHTML
、.outerHTML
、document.write()
时要小心,不要把不可信的数据作为HTML
插到页面上,而应尽量使用.textContent
、.setAttribute()
等。
如果用Vue/React
技术栈,并且使用v-html/dangerouslySetInnerHTML
功能,就要在前端注意render
阶段innerHTML
、outerHTML
的XSS
隐患。
DOM 中的内联事件监听器,如location
、onclick
、onerror
、onload
、onmouseover
等,标签的
href
属性,JavaScript
的eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些API,很容易产生安全隐患。
Content Security Policy
(内容安全策略,简称csp
)用于检测并阻止网页加载非法资源的安全策略,可以减轻xss
攻击带来的危害和数据注入等攻击。
严格的CSP
在XSS
的防范中可以起到以下的作用:
XSS
,利于尽快修复问题禁止JavaScript
读取某些敏感Cookie
,攻击者完成XSS
注入后也无法窃取此Cookie
。
加入验证码,防止脚本冒充用户提交危险操作