2021-07-12 03:07:40
XSS攻击详解
XSS(跨站脚本攻击)是一种安全漏洞,攻击者通过在网页中注入恶意脚本,当用户浏览该网页时,恶意脚本会在用户的浏览器中执行,从而窃取用户数据、冒充用户行为或执行其他恶意操作。
一、XSS注入方法
在HTML内嵌文本中注入:恶意内容以<script>标签形式注入,当浏览器解析时,会执行这些脚本。
在内联JavaScript中注入:拼接的数据突破了原本的限制(如字符串、变量、方法名等),导致恶意代码被执行。
在标签属性中注入:恶意内容包含引号,从而突破属性值的限制,注入其他属性或标签。
在标签的href、src等属性中注入:包含javascript:等可执行代码,当点击链接或加载资源时,恶意代码被执行。
在事件属性中注入:如onload、onerror、onclick等事件中,注入不受控制的代码,当事件触发时执行恶意代码。
在style属性和标签中注入:包含类似background-image:url("javascript:...");的代码(新版本浏览器已防范),或expression(...)的CSS表达式代码(新版本浏览器已防范)。
二、XSS分类
存储型XSS
攻击步骤:
攻击者将恶意代码提交到目标网站的数据库中。
用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在HTML中返回给浏览器。
用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。
常见场景:带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
反射型XSS
攻击步骤:
攻击者构造出特殊的URL,其中包含恶意代码。
用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回给浏览器。
用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。
与存储型XSS的区别:恶意代码存在于URL中而非数据库中。
常见场景:通过URL传递参数的功能,如网站搜索、跳转等。
触发条件:需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。
DOM型XSS
攻击步骤:
攻击者构造出特殊的URL,其中包含恶意代码。
用户打开带有恶意代码的URL。
用户浏览器接收到响应后解析执行,前端JavaScript取出URL中的恶意代码并执行。
恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。
与前两种XSS的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,而其他两种XSS都属于服务端的安全漏洞。
三、XSS攻击的预防
输入过滤:预防存储型和反射型XSS攻击,通过过滤用户输入,防止恶意代码被存入数据库或在URL中传递。
纯前端渲染:
浏览器先加载一个静态HTML,不包含任何与业务相关的数据。
执行HTML中的JavaScript。
JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上。
预防DOM型XSS攻击:
在使用.innerHTML、.outerHTML、document.write()时要特别小心,避免把不可信的数据作为HTML插到页面上,而应尽量使用.textContent、.setAttribute()等。
如果使用Vue/React等技术栈,并且不使用v-html/dangerouslySetInnerHTML功能,就在前端render阶段避免innerHTML、outerHTML的XSS隐患。
避免将不可信的数据拼接到字符串中传递给如location、onclick、onerror、onload、onmouseover等事件监听器,以及href属性、eval()、setTimeout()、setInterval()等API。
综上所述,XSS攻击是一种严重的安全威胁,但通过合理的预防措施,可以有效降低其风险。