跳到主要内容

XSS 攻击

什么是 XSS 攻击?

跨站脚本攻击(Cross-site scripting,XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码,攻击者就可以突破网站的访问限制并冒充受害者。

如果 Web 应用程序没有部署足够的安全验证,那么,这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的,所以,这些脚本可以任意读取 cookie,session tokens,或者其他敏感的网站信息,或者让恶意脚本重写HTML内容。

XSS 的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合 在一起了,浏览器没有办法分辨哪些脚本是可信的,从而导致了恶意 代码的执行。

在以下 2 种情况下,容易发生 XSS 攻击:

数据从一个不可靠的链接进入到一个 Web 应用程序。 没有过滤掉恶意代码的动态内容被发送给 Web 用户。 恶意内容一般包括 JavaScript,但是,有时候也会包括 HTML,FLASH 或是其他浏览器可执行的代码。XSS 攻击的形式千差万别,但他们通常都会:将 cookies 或其他隐私信息发送给攻击者,将受害者重定向到由攻击者控制的网页,或是经由恶意网站在受害者的机器上进行其他恶意操作。

XSS 攻击类型

存储型 XSS 注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。

  1. 攻击者将恶意代码提交到⽬标⽹站的数据库中。
  2. ⽤户打开⽬标⽹站时,⽹站服务端将恶意代码从数据库取出,拼接 在 HTML 中返回给浏览器。
  3. ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏ 为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。 这种攻击常⻅于带有⽤户保存数据的⽹站功能,如论坛发帖、商品评 论、⽤户私信等。

反射型 XSS 当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web 服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。由于浏览器认为这个响应来自"可信任"的服务器,所以会执行这段脚本。

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. ⽤户打开带有恶意代码的 URL 时,⽹站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏ 为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别:

存储型 XSS 的恶意代码存在 数据库⾥,反射型 XSS 的恶意代码存在 URL ⾥。 反射型 XSS 漏洞常⻅于通过 URL 传递参数的功能,如⽹站搜索、跳 转等。 由于需要⽤户主动打开恶意的 URL 才能⽣效,攻击者往往会 结合多种⼿段诱导⽤户点击。

基于 DOM 的 XSS 通过修改原始的客户端代码,受害者浏览器的 DOM 环境改变,导致有效载荷的执行。也就是说,页面本身并没有变化,但由于 DOM 环境被恶意修改,有客户端代码被包含进了页面,并且意外执行。

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. ⽤户打开带有恶意代码的 URL。
  3. ⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL 中的恶意代码并执⾏。
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏ 为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:

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

如何防御 XSS 攻击?

  1. 输入验证和过滤:对用户输入的数据进行验证和过滤,确保只接受预期的数据类型和格式,并阻止特殊字符和标签的注入。可以使用安全的编码函数对输入数据进行处理,如将 < 替换为 &lt;> 替换为 &gt; 等。

  2. 输出编码:在将用户输入或其他动态内容输出到 HTML 页面时,使用适当的编码函数对内容进行转义。比如,将 < 转义为 &lt;> 转义为 &gt;" 转义为 &quot; 等。

  3. 内容安全策略(Content Security Policy,CSP):通过设置响应头的内容安全策略,限制浏览器加载和执行特定资源的策略。可以指定允许加载的资源来源、禁止执行内联脚本和样式等,从而减少 XSS 攻击的风险。

  4. HttpOnly Cookie:将敏感信息存储在 HttpOnly Cookie 中,防止 JavaScript 通过 document.cookie 访问和修改。

  5. 输入长度限制:对于输入框等用户可输入的区域,设置合理的长度限制,防止攻击者注入过长的代码。

  6. 安全的响应头设置:通过设置适当的响应头,如 Content-Security-Policy、X-XSS-Protection、X-Content-Type-Options 等,增加浏览器的安全性和防御能力。

  7. 防御点击劫持:使用适当的防御措施,如设置 X-Frame-Options 响应头来限制页面在 iframe 中的使用,防止点击劫持攻击。

  8. 定期更新和修补系统和库:及时更新和修补系统、框架和库,以确保修复已知的安全漏洞。