XSS漏洞综述

Posted dandh811

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS漏洞综述相关的知识,希望对你有一定的参考价值。

在本节中,我们将解释什么是XSS漏洞,描述不同类型的XSS漏洞,并详细说明如何发现和防御XSS漏洞。

1. XSS概述

XSS(也称为跨站脚本攻击)是一个web安全漏洞,它允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过隔离不同网站的同源策略。跨站点脚本漏洞通常允许攻击者伪装成受害用户,执行用户能够执行的任何操作,并访问用户的任何数据。如果受害用户在应用程序中拥有最高权限,那么攻击者就可能获得对所有应用程序功能和数据的完全控制。

2. XSS原理

XSS原理是操纵一个脆弱的网站,使其返回恶意的javascript给用户。当恶意代码在受害者的浏览器中执行时,攻击者可以完全破坏它们与应用程序的交互。

3. XSS攻击类型

XSS主要有三种攻击类型:

  • 反射型XSS,恶意脚本来自当前HTTP请求。
  • 存储型XSS,恶意脚本来自网站的数据库。
  • DOM型XSS,漏洞存在于客户端代码而不是服务器端代码中。

4. 反射型XSS

反射XSS是最简单的跨站点脚本。当应用程序在HTTP请求中接收数据并以不安全的方式在即时响应中包含该数据时,就会出现这种情况。

下面是一个反映XSS漏洞的简单示例:

https://insecure-website.com/status?message=All+is+well.

<p>Status: All is well.</p> 

应用程序不执行数据的任何其他处理,所以攻击者可以很容易地构造这样的攻击:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

<p>Status: <script>/* Bad stuff here... */</script></p> 

如果用户访问了攻击者构造的URL,那么攻击者的脚本就会在用户的浏览器中,以用户的会话权限执行。此时,脚本可以执行任何操作,并检索用户访问的任何数据。

5. 存储型XSS

当应用程序从不受信任的源接收数据并以不安全的方式将该数据包含在其稍后的HTTP响应中时,存储XSS(也称为持久型XSS或second-order XSS)就会出现。

有问题的数据可能通过HTTP请求提交给应用程序;例如,博客文章中的评论、聊天室中的用户昵称或客户订单的联系方式。在其他情况下,数据可能来自其他不可信的来源;例如,一个webmail应用程序显示通过SMTP接收的消息,一个营销应用程序显示社交媒体帖子,或者一个网络监控应用程序显示来自网络流量的数据包数据。

下面是一个存储型XSS漏洞的简单示例。留言板应用程序允许用户提交消息,这些消息将显示给其他用户:

 <p>Hello, this is my message!</p> 

应用程序对提交数据不做任何处理,所以攻击者可以很容易地发送攻击其他用户的消息:

 <p><script>/* Bad stuff here... */</script></p> 

6. DOM型XSS

DOM型XSS出现在应用程序包含一些客户端JavaScript时,这些JavaScript以不安全的方式处理来自不受信任的源的数据,通常是将数据写回DOM。

在下面的例子中,应用程序使用一些JavaScript从输入字段读取值,并将该值写入html中的元素:

var search = document.getElementById(\'search\').value;
var results = document.getElementById(\'results\');
results.innerHTML = \'You searched for: \' + search; 

如果攻击者可以控制输入字段的值,他们可以很容易地构造一个恶意的值,导致他们自己的脚本执行:

 You searched for: <img src=1 onerror=\'/* Bad stuff here... */\'> 

在通常的情况下,输入字段是HTTP请求的一部分,如URL查询字符串参数,攻击者使用恶意URL进行攻击,其方式与反射型XSS相同。

7. XSS可以干什么

利用XSS漏洞的攻击者通常能够:

  • 冒充或伪装成受害用户。

  • 执行用户能够执行的任何操作。

  • 读取用户能够访问的任何数据。

  • 捕获用户的登录凭据。

  • Perform virtual defacement of the web site.

  • 向网站注入木马功能。

8. XSS漏洞的影响

XSS攻击的实际影响通常取决于应用程序的性质、它的功能和数据,以及被攻击用户的状态。例如:

  • 在宣传类的网站中,所有用户都是匿名的,所有信息都是公开的,因此影响通常很小。

  • 在持有敏感数据(如银行事务、电子邮件或医疗记录)的网站中,影响通常会很严重。

  • 如果被攻击的是网站的特权用户,那么影响通常是致命的,允许攻击者完全控制受攻击的网站,并危害所有用户和他们的数据。

9. 如何发现和测试XSS漏洞

使用Burp Suite的web漏洞扫描器可以快速可靠地发现绝大多数XSS漏洞。

手动测试反射型和存储型的XSS通常包括向应用程序中的每个输入点提交特殊的字符串(比如一个简短的字母数字字符串),标识提交的输入在HTTP响应中返回的每个位置,并分别测试每个位置,以确定是否可以使用适当精心设计的输入来执行任意JavaScript。通过这种方式,您可以确定XSS出现的上下文,并选择合适的payload来利用它。

根据URL参数手动测试DOM型XSS也是一个类似的过程:在参数中放置一些简单的唯一输入,使用浏览器的开发人员工具在DOM中搜索这个输入,并测试每个位置以确定它是否可利用。然而,其他类型的DOM型XSS更难检测。要在非基于url的输入(如document.cookie)或非基于html的接收(如setTimeout)中找到基于dom的漏洞,没有什么可以替代检查JavaScript代码,这可能非常耗时。Burp Suite的web漏洞扫描器结合了JavaScript的静态和动态分析,可靠地自动检测基于dom的漏洞。

10. CSP策略

内容安全策略(CSP)是一种浏览器机制,旨在减轻XSS和其他一些漏洞的影响。如果使用CSP的应用程序包含类似XSS的行为,那么CSP可能会阻止漏洞被利用。通常,可以绕过CSP来利用潜在漏洞。

11. Dangling markup注入

Dangling markup注入是当XSS攻击被拦截而无法利用时跨域捕获用户数据的一种技术。它经常被用来捕获其他用户可见的敏感信息,包括用户的CSRF令牌。

12. 如何防止XSS攻击

在某些情况下,防止XSS非常简单,但有些情况下,取决于应用程序的复杂性和它处理用户可控数据的方式,可能会困难得多。

一般来说,有效防止XSS漏洞可能涉及以下措施的组合:

  • 输入过滤。在接收用户输入时,尽可能严格地根据预期的或有效的输入进行过滤。

  • 对输出数据进行编码。在HTTP响应中输出用户可控制的数据时,对输出进行编码,以防止将其解释为活动内容。根据输出环境,这可能需要HTML、URL、JavaScript和CSS编码的组合。

  • 使用适当的响应头。为了阻止HTTP响应中包含恶意的HTML或JavaScript的XSS,您可以使用Content-Type和X-Content-Type-Options头来确保浏览器以您想要的方式解释响应。

  • CSP策略。作为最后一道防线,您可以使用内容安全策略(Content Security Policy, CSP)来降低仍然发生的任何XSS漏洞的严重性。

13. XSS常见问题

XSS漏洞有多普遍?XSS漏洞非常常见,XSS可能是最常见的web安全漏洞。

XSS攻击有多常见?很难获得关于XSS真实攻击的可靠数据,但它可能比其他漏洞更不容易被利用。

XSS和CSRF有什么区别?XSS涉及导致网站返回恶意JavaScript,而CSRF涉及诱导受害者用户执行他们不打算做的操作。

XSS和SQL注入之间的区别是什么? XSS是针对其他用户的客户端漏洞,而SQL注入是针对应用程序数据库的服务器端漏洞。

如何防止php中的XSS ? 使用允许字符的白名单筛选输入,并使用类型提示或类型转换。HTML环境使用htmlentities和ENT_QUOTES转义输出,JavaScript环境使用JavaScript Unicode转义。

如何防止Java中的XSS ? 使用允许的字符白名单过滤输入,并使用诸如谷歌Guava之类的库对HTML环境的输出进行HTML编码,或者对JavaScript环境使用JavaScript Unicode转义。

以上是关于XSS漏洞综述的主要内容,如果未能解决你的问题,请参考以下文章

XSS漏洞基础入门

XSS漏洞详解

通过代码审计找出网站中的XSS漏洞实战

XSS漏洞

XSS 漏洞介绍

XSS漏洞学习