web安全—XSS攻击

web安全—XSS攻击
最新回答
给十年后的我

2021-07-12 03:07:40

XSS攻击详解

XSS(跨站脚本攻击)是一种安全漏洞,攻击者通过在网页中注入恶意脚本,当用户浏览该网页时,恶意脚本会在用户的浏览器中执行,从而窃取用户数据、冒充用户行为或执行其他恶意操作。

一、XSS注入方法

  1. 在HTML内嵌文本中注入:恶意内容以<script>标签形式注入,当浏览器解析时,会执行这些脚本。

  2. 在内联JavaScript中注入:拼接的数据突破了原本的限制(如字符串、变量、方法名等),导致恶意代码被执行。

  3. 在标签属性中注入:恶意内容包含引号,从而突破属性值的限制,注入其他属性或标签。

  4. 在标签的href、src等属性中注入:包含javascript:等可执行代码,当点击链接或加载资源时,恶意代码被执行。

  5. 在事件属性中注入:如onload、onerror、onclick等事件中,注入不受控制的代码,当事件触发时执行恶意代码。

  6. 在style属性和标签中注入:包含类似background-image:url("javascript:...");的代码(新版本浏览器已防范),或expression(...)的CSS表达式代码(新版本浏览器已防范)。

二、XSS分类

  1. 存储型XSS

    攻击步骤

    攻击者将恶意代码提交到目标网站的数据库中。

    用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在HTML中返回给浏览器。

    用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

    恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。

    常见场景:带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

  2. 反射型XSS

    攻击步骤

    攻击者构造出特殊的URL,其中包含恶意代码。

    用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回给浏览器。

    用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

    恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。

    与存储型XSS的区别:恶意代码存在于URL中而非数据库中。

    常见场景:通过URL传递参数的功能,如网站搜索、跳转等。

    触发条件:需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。

  3. DOM型XSS

    攻击步骤

    攻击者构造出特殊的URL,其中包含恶意代码。

    用户打开带有恶意代码的URL。

    用户浏览器接收到响应后解析执行,前端JavaScript取出URL中的恶意代码并执行。

    恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作。

    与前两种XSS的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,而其他两种XSS都属于服务端的安全漏洞。

三、XSS攻击的预防

  1. 输入过滤:预防存储型和反射型XSS攻击,通过过滤用户输入,防止恶意代码被存入数据库或在URL中传递。

  2. 纯前端渲染

    浏览器先加载一个静态HTML,不包含任何与业务相关的数据。

    执行HTML中的JavaScript。

    JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上。

  3. 预防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攻击是一种严重的安全威胁,但通过合理的预防措施,可以有效降低其风险。