跨站点脚本(XSS)解释和预防

解释XSS是最常见的web应用程序漏洞之一.

View Products

什么是跨站点脚本(XSS)?

跨站点脚本(XSS)是一种针对web应用程序的代码注入安全攻击, 客户端脚本到用户的web浏览器中执行. 目标不会被直接攻击, 相当脆弱的网站和web应用程序被用来在用户与这些网站/应用程序交互时进行跨站点脚本攻击.

毫无戒心的用户会, for example, 访问被入侵的网站, 此时,攻击者的恶意脚本被加载并由用户的浏览器执行. 这可能导致敏感数据的泄露/盗窃、会话劫持等等.

因为它在许多web浏览器和平台上的广泛支持, JavaScript一直是XSS攻击作者的流行选择, 但是攻击可以使用浏览器支持的任何语言. 而XSS攻击已经存在超过15年了, 它们已经被证明是非常有效的,并且现在仍然经常被观察到作为一种常见和可行的攻击媒介.

Learn more about the 常见的网络攻击类型.

跨站点脚本的影响

当一个网页被跨站点脚本攻击时,一系列问题很快就会出现. 可能的问题包括但不限于:

  • 敏感用户数据被暴露
  • 攻击者获取在线账户并冒充用户
  • 破坏网站内容展示
  • 上传恶意“特洛伊木马”程序
  • 将网页重定向到有害的位置

如果没有及时检测和处理跨站点脚本,则可能对组织造成损害. 企业和客户都面临XSS攻击的风险, 成功注入恶意软件后,声誉和职业关系可能会受到负面影响.

跨站点脚本的一个不幸的例子发生在2018年假日季节,一种名为“Magecart”的信用卡刷卡恶意软件的兴起.恶意软件利用了一个 vulnerability 通过将自己注入在线结账网站, 这是第一次发生如此大规模的袭击. 用户信用卡信息很可能被上传到攻击者控制的服务器上,并可能被出售或用于欺诈性购买.

跨站脚本攻击的类型

跨站点脚本攻击通常被归类为以下类型之一.

  • Reflected XSS
  • Persistent XSS
  • Dom-Based XSS

Reflected XSS

反射式跨站攻击涉及易受攻击的网站接受数据(例如.e. 恶意脚本)由目标自己的web浏览器发送来攻击目标. 因为恶意脚本是由客户端自己发送的,而不是存储在易受攻击的服务器上, 这种类型的攻击也被称为“非持续性攻击”.”

反射XSS攻击的一个简单示例可能涉及攻击者伪造一个URL,该URL传递一个小的, 将恶意脚本作为查询参数发送到具有易受XSS攻击的搜索页面的网站;

http://vulnerable-website.com/search?search_term=”

然后攻击者需要让目标从他们的web浏览器访问这个URL. 这可以通过发送包含URL的电子邮件(用合理的理由诱骗用户点击它)或将URL发布到公共场所来实现, 非易受攻击的网站,供目标点击.

当目标点击链接时, 易受攻击站点接受查询参数“search_term”。, 期望该值是目标在搜索漏洞网站时感兴趣的东西.Com网站的时候,实际值就是恶意脚本.

The search page then, 就像大多数网站搜索页面在用户搜索某些东西时所做的那样, displays “Searching for ...”, 但是因为易受攻击的站点没有清除search_term值, 恶意脚本被注入到目标浏览器正在加载的网页中,然后由目标浏览器执行.

Persistent XSS

顾名思义,持久XSS攻击存储/持久化在易受攻击的服务器本身. Unlike a reflected attack, 目标将恶意脚本发送到哪里, 易受攻击的网站或web应用程序的用户在与易受攻击的网站/应用程序进行日常交互时可能会受到攻击.

持久XSS攻击的一个简单示例可能涉及攻击者向托管在易受攻击网站上的论坛发布消息. Rather than a usual, innocuous forum post, 此帖子内容包含攻击者的恶意脚本. 当用户访问此论坛帖子时,他们的web浏览器加载并执行恶意脚本.

As you can see, 反射XSS攻击和持久XSS攻击之间的一个关键区别是,持久XSS攻击会考虑 all users 将易受攻击的站点/应用程序作为攻击目标.

DOM-Based XSS

另一种类型的XSS攻击是基于dom的, 漏洞存在于网站/应用程序始终提供给访问者的客户端脚本中的哪里. 这种攻击不同于反射和持久的XSS攻击,因为站点/应用程序不会直接向目标浏览器提供恶意脚本. 在基于dom的XSS攻击中, 该网站/应用程序具有易受攻击的客户端脚本,可将恶意脚本传递到目标浏览器. 类似于反射攻击, 基于dom的攻击不会将恶意脚本存储在易受攻击的服务器上.

基于dom的XSS攻击的一个简单示例可能涉及与上面反映的XSS示例场景相同的设置. 攻击者使用恶意脚本创建一个URL作为“search_term”,并将其发送给潜在目标.

一旦目标单击URL, 他们的浏览器加载站点搜索页面和易受攻击的客户端处理脚本. 而“seach_term”仍然作为查询参数提供给站点后端进行处理, 网站本身不会生成带有注入恶意脚本的网页.

Instead, 该站点易受攻击的客户端脚本被设计为在本地(在目标浏览器中)动态替换搜索词值(i.e. 在目标呈现的搜索页面中的恶意脚本, 导致目标浏览器加载并执行攻击者的脚本.

基于dom的XSS攻击突出了这样一个事实,即XSS漏洞并不局限于服务器端软件.

如何防止跨站脚本攻击

使用多种变体的跨站点脚本攻击, 组织需要知道如何充分保护自己并防止未来的问题. 由于网站变得越来越复杂,严格监控变得比以往任何时候都更加困难. 随着时间的推移,攻击的频率可能会继续上升.

以下建议可以帮助保护用户免受XSS攻击:

Sanitize user input:

  • 验证以捕获潜在的恶意用户提供的输入.
  • 对输出进行编码,以防止潜在的恶意用户提供的数据触发浏览器的自动加载和执行行为.

限制使用用户提供的数据:

  • 只在必要的地方使用.

Utilize the Content Security Policy:

  • 针对XSS尝试提供额外级别的保护和缓解.

Regularly use a Web应用程序漏洞扫描 工具来识别软件中的XSS漏洞.

跨站点脚本(XSS)博客文章

如何防止跨站脚本(XSS)攻击

JSON中的XSS:现代应用程序的老派攻击