编码员征服安全。分享与学习 - 跨站脚本

发表于2018年12月06日
作者:Jaap Karan Singh
案例研究

编码员征服安全。分享与学习 - 跨站脚本

发表于2018年12月06日
作者:Jaap Karan Singh
查看资源
查看资源

网络浏览器可能是我们通往网上所有美好事物的门户,但可悲的是,这并不全是好消息。网络浏览器的固有行为可以成为安全漏洞的催化剂。浏览器开始时的特点是相信它所看到的标记,并毫不怀疑地执行它。这一切都很好,直到这种功能被用于不光彩的目的......自然,攻击者最终找到了利用这种趋势来进一步实现其邪恶目的的方法。

跨站脚本(XSS)利用浏览器的信任和用户的无知来窃取数据,接管账户,并玷污网站;这是一个可以变得非常丑陋的漏洞,非常快。

让我们看看XSS如何工作,可以造成什么损害,以及如何防止它。

XSS是如何工作的?

当未经信任的输入(通常是数据)在页面上被呈现为输出,但被误解为可执行代码时,XSS就会发生。攻击者可以在输入参数中放置恶意的可执行代码(HTML标签、JavaScript等),这些代码--当返回到浏览器时--被执行,而不是作为数据显示。

如上所述,该漏洞的出现是由于浏览器的核心运作行为,它很难区分数据和可执行代码。网络的运行模式如下。

  1. 用户访问一个网页
  2. 该页面告诉浏览器要加载哪些文件和执行哪些内容
  3. 浏览器执行页面上的内容,没有问题。

这种功能导致了我们在网络上享受的一些最棒的互动体验。硬币的另一面是,它也导致了代价高昂的利用和漏洞。

当攻击者将他们的恶意脚本添加到一个有漏洞的网站上时,它就会毫无疑问地被执行。没有更深入的调查,也没有到位的检测措施。

自定义JavaScript代码可以在你的用户的浏览器中执行

有三种类型的XSS。

  • 存储的XSS
  • 反映的XSS
  • DOM XSS

存储的XSS发生在攻击者可以持续地将恶意脚本存储在应用程序的一个数据字段中(例如,在存储用户手机号码的字段)。然后,每次在应用程序中显示该数据字段时,这个草率的脚本就会被发送到用户的浏览器。

这种类型的攻击经常出现在论坛网站或评论引擎上。攻击者在评论中输入恶意脚本,然后砰--每个浏览该评论的用户都在不知不觉中执行了该脚本。

反射式XSS发生在用户输入被原样反射到用户的浏览器上。一个例子是搜索框在获取搜索结果时向用户显示 "您搜索了......"。

现在,想象一下,搜索是通过将搜索词作为查询参数放在URL中进行的。恶意攻击者可以向受害者发送一个链接,并在这些参数中嵌入恶意脚本,说实话,大多数网络用户几乎不会注意到它。

,受害者点击该链接并被重定向到一个钓鱼网站,在那里他/她不知不觉地输入了网站的密码。他们没有意识到,攻击者刚刚窃取了他们账户的钥匙。

DOM XSS是这种漏洞的一个相对新的种类。它利用了许多UI框架(如Angular和React)中的复杂模板结构。

这些模板允许动态内容和丰富的UI应用。如果使用不当,它们可以被用来执行XSS攻击。

所以,你有了它。你已经掌握了XSS的范围,简而言之。让我们更深入地了解它是如何被破坏性地使用的。

为什么XSS如此危险?

XSS可以被用来将用户重定向到恶意网站,窃取cookies和猎取会话数据。基本上,无论JavaScript能做什么,XSS攻击也能做到。

以下是三个XSS攻击的例子。

  1. 雅虎电子邮件用户在2015年使用XSS窃取了他们的会话cookie
  2. Samy蠕虫病毒是通过MySpace的一个XSS漏洞传播的。它仍然是有史以来传播最快的恶意软件,在短短20小时内影响了100万用户。
  3. eBay允许在产品描述中包含恶意脚本。这导致了对eBay用户的XSS攻击

XSS攻击具有欺骗性,而且非常严重。它们可以导致会话、用户凭证或敏感数据被盗。声誉受损和收入减少是这些攻击的主要隐患。

然而,XSS可以被像你一样精明的安全战士打败。修复方法并不复杂,自从XSS成为一个常用的攻击手段以来,这个行业已经走过了很长很长的路。

你可以打败XSS。

击败XSS的关键是理解上下文。具体来说,就是你的用户输入将被送回客户端的上下文,以及它将被送回的地方。

如果用户输入不必被送回浏览器,那就更好了。但如果是这样的话,往往应该进行HTML编码。对输出进行HTML编码将告诉浏览器按原样呈现内容,而不是执行它。

输入验证也很重要。然而,验证和白名单并不是 万无一失的解决方案。编码更进一步,阻止浏览器执行恶意脚本。

许多框架现在对HTML输出进行自动编码。
AngularASP.NET MVCReact.js是使用默认HTML编码的框架。你必须通过调用一个特殊的方法来告诉这些框架不要进行编码。

其他大多数框架(如DjangoSpring)都有用于预防XSS的标准库,你可以很容易地将其纳入你的代码中。

最大的挑战是教会自己分析用户输入进入系统的所有方式,这样你就可以随时注意它了。查询参数可以携带攻击,职位参数也是如此。遵循整个应用程序的数据流,不要相信任何来自外部的数据。

像边境巡逻一样思考。停止每一个数据,检查它,如果它看起来是恶意的,就不允许它进入。然后在渲染时进行编码,以确保任何被遗漏的坏东西仍然不会造成问题。

执行这些策略,你的用户将不会受到XSS的攻击。看一下OWASP的Cheat Sheet,了解更多的提示,使你的数据得到控制。

挫败XSS并提高你的安全技能。

XSS在OWASP的2017年十大网络安全风险列表中位列第七。它已经存在了一段时间,但如果你不小心,它仍然可以出现并导致你的应用程序出现问题。

培训对于开发人员在编写代码时建立安全第一的心态非常重要。而且,当它模拟真实的应用程序,用开发人员积极使用的语言,培训总是最有效的。考虑到这一点,为什么不看看我们的学习资源,以了解更多关于XSS的信息?之后,你就可以开始培训和练习,从而达到掌握的目的。

你认为你现在已经准备好发现和修复XSS漏洞了吗? 挑战自己 Secure Code Warrior 平台上。

查看资源
查看资源

作者

Jaap Karan Singh

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

编码员征服安全。分享与学习 - 跨站脚本

发表于2018年12月06日
作者:Jaap Karan Singh

网络浏览器可能是我们通往网上所有美好事物的门户,但可悲的是,这并不全是好消息。网络浏览器的固有行为可以成为安全漏洞的催化剂。浏览器开始时的特点是相信它所看到的标记,并毫不怀疑地执行它。这一切都很好,直到这种功能被用于不光彩的目的......自然,攻击者最终找到了利用这种趋势来进一步实现其邪恶目的的方法。

跨站脚本(XSS)利用浏览器的信任和用户的无知来窃取数据,接管账户,并玷污网站;这是一个可以变得非常丑陋的漏洞,非常快。

让我们看看XSS如何工作,可以造成什么损害,以及如何防止它。

XSS是如何工作的?

当未经信任的输入(通常是数据)在页面上被呈现为输出,但被误解为可执行代码时,XSS就会发生。攻击者可以在输入参数中放置恶意的可执行代码(HTML标签、JavaScript等),这些代码--当返回到浏览器时--被执行,而不是作为数据显示。

如上所述,该漏洞的出现是由于浏览器的核心运作行为,它很难区分数据和可执行代码。网络的运行模式如下。

  1. 用户访问一个网页
  2. 该页面告诉浏览器要加载哪些文件和执行哪些内容
  3. 浏览器执行页面上的内容,没有问题。

这种功能导致了我们在网络上享受的一些最棒的互动体验。硬币的另一面是,它也导致了代价高昂的利用和漏洞。

当攻击者将他们的恶意脚本添加到一个有漏洞的网站上时,它就会毫无疑问地被执行。没有更深入的调查,也没有到位的检测措施。

自定义JavaScript代码可以在你的用户的浏览器中执行

有三种类型的XSS。

  • 存储的XSS
  • 反映的XSS
  • DOM XSS

存储的XSS发生在攻击者可以持续地将恶意脚本存储在应用程序的一个数据字段中(例如,在存储用户手机号码的字段)。然后,每次在应用程序中显示该数据字段时,这个草率的脚本就会被发送到用户的浏览器。

这种类型的攻击经常出现在论坛网站或评论引擎上。攻击者在评论中输入恶意脚本,然后砰--每个浏览该评论的用户都在不知不觉中执行了该脚本。

反射式XSS发生在用户输入被原样反射到用户的浏览器上。一个例子是搜索框在获取搜索结果时向用户显示 "您搜索了......"。

现在,想象一下,搜索是通过将搜索词作为查询参数放在URL中进行的。恶意攻击者可以向受害者发送一个链接,并在这些参数中嵌入恶意脚本,说实话,大多数网络用户几乎不会注意到它。

,受害者点击该链接并被重定向到一个钓鱼网站,在那里他/她不知不觉地输入了网站的密码。他们没有意识到,攻击者刚刚窃取了他们账户的钥匙。

DOM XSS是这种漏洞的一个相对新的种类。它利用了许多UI框架(如Angular和React)中的复杂模板结构。

这些模板允许动态内容和丰富的UI应用。如果使用不当,它们可以被用来执行XSS攻击。

所以,你有了它。你已经掌握了XSS的范围,简而言之。让我们更深入地了解它是如何被破坏性地使用的。

为什么XSS如此危险?

XSS可以被用来将用户重定向到恶意网站,窃取cookies和猎取会话数据。基本上,无论JavaScript能做什么,XSS攻击也能做到。

以下是三个XSS攻击的例子。

  1. 雅虎电子邮件用户在2015年使用XSS窃取了他们的会话cookie
  2. Samy蠕虫病毒是通过MySpace的一个XSS漏洞传播的。它仍然是有史以来传播最快的恶意软件,在短短20小时内影响了100万用户。
  3. eBay允许在产品描述中包含恶意脚本。这导致了对eBay用户的XSS攻击

XSS攻击具有欺骗性,而且非常严重。它们可以导致会话、用户凭证或敏感数据被盗。声誉受损和收入减少是这些攻击的主要隐患。

然而,XSS可以被像你一样精明的安全战士打败。修复方法并不复杂,自从XSS成为一个常用的攻击手段以来,这个行业已经走过了很长很长的路。

你可以打败XSS。

击败XSS的关键是理解上下文。具体来说,就是你的用户输入将被送回客户端的上下文,以及它将被送回的地方。

如果用户输入不必被送回浏览器,那就更好了。但如果是这样的话,往往应该进行HTML编码。对输出进行HTML编码将告诉浏览器按原样呈现内容,而不是执行它。

输入验证也很重要。然而,验证和白名单并不是 万无一失的解决方案。编码更进一步,阻止浏览器执行恶意脚本。

许多框架现在对HTML输出进行自动编码。
AngularASP.NET MVCReact.js是使用默认HTML编码的框架。你必须通过调用一个特殊的方法来告诉这些框架不要进行编码。

其他大多数框架(如DjangoSpring)都有用于预防XSS的标准库,你可以很容易地将其纳入你的代码中。

最大的挑战是教会自己分析用户输入进入系统的所有方式,这样你就可以随时注意它了。查询参数可以携带攻击,职位参数也是如此。遵循整个应用程序的数据流,不要相信任何来自外部的数据。

像边境巡逻一样思考。停止每一个数据,检查它,如果它看起来是恶意的,就不允许它进入。然后在渲染时进行编码,以确保任何被遗漏的坏东西仍然不会造成问题。

执行这些策略,你的用户将不会受到XSS的攻击。看一下OWASP的Cheat Sheet,了解更多的提示,使你的数据得到控制。

挫败XSS并提高你的安全技能。

XSS在OWASP的2017年十大网络安全风险列表中位列第七。它已经存在了一段时间,但如果你不小心,它仍然可以出现并导致你的应用程序出现问题。

培训对于开发人员在编写代码时建立安全第一的心态非常重要。而且,当它模拟真实的应用程序,用开发人员积极使用的语言,培训总是最有效的。考虑到这一点,为什么不看看我们的学习资源,以了解更多关于XSS的信息?之后,你就可以开始培训和练习,从而达到掌握的目的。

你认为你现在已经准备好发现和修复XSS漏洞了吗? 挑战自己 Secure Code Warrior 平台上。

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

提交
要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。