编码员征服安全。分享与学习系列 - 跨站请求伪造

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

编码员征服安全。分享与学习系列 - 跨站请求伪造

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

与直接针对网站或应用程序运营商的攻击不同,许多跨站请求伪造(CSRF)攻击的目的是直接从用户那里窃取金钱、货物或凭证。这并不意味着网站运营商应该忽视CSRF代码的漏洞,因为在纯金钱攻击的情况下,最终被盗资金的替换可能是拥有不安全代码的托管网站的责任。而如果目标用户反而丢失了他们的凭证或在不知情的情况下更改了他们的密码,犯罪分子可能会利用这个被盗的身份进行破坏,特别是如果受害者有特权访问。

CSRF攻击是相当复杂的,依靠多个层次才能成功。换句话说,很多东西都必须对攻击者有利,才能发挥作用。尽管如此,它们是一个非常受欢迎的攻击媒介,因为一个成功的攻击可以将钱直接转给黑客,或者让他们能够在网站上肆无忌惮地移动。如果一切按照黑客的方式进行,目标用户甚至可能永远不知道他们是攻击的受害者。

好消息是,由于CSRF攻击的成功需要很多条件,所以有一些很好的防御技术可以阻止它们的发展。

为此,我们将讨论CSRF攻击的三个关键方面。

  • 它们是如何工作的
  • 为什么它们如此危险
  • 你如何能把防御措施放在适当的位置,以阻止他们的冷淡。

CSRF攻击是如何工作的?

由于成功的CSRF攻击有能力直接窃取目标用户的金钱、货物或凭证,尽管创建它们必须付出大量的工作,但它们还是很受欢迎。由于它们经常在不同的平台上进行尝试,多年来它们已经有了各种各样的名字和称呼。你可能听到CSRF攻击被称为XSRF、Sea Surf、Session Riding、Cross-Site Reference Forgery或Hostile Linking。微软在其大部分文档中喜欢把它们称为一键式攻击。但它们都是CSRF攻击,而且打败它们的技术是相同的。

如果用户登录到一个网站开展业务或做他们的工作,就会发生CSRF攻击。关键是,用户必须登录并积极认证一个网站或应用程序。该攻击通常是从一个二级网站或电子邮件发起的。通常情况下,攻击者使用社会工程技术,诱使用户点击电子邮件中的链接,将他们带到一个带有攻击脚本的被攻击网站。

被攻击的网站包含一个脚本,指示活动的浏览器执行命令,通常是一些恶意的命令,如改变用户的密码或将钱转移到攻击者控制的账户。只要用户经过认证,网站就会认为这些命令是由授权用户发出的。为什么不呢?用户已经验证了自己,并提供了访问网站所需的任何密码。他们甚至可能位于一个地理围栏内,正确地坐在他们的办公室终端上。如果他们想改变他们的密码或转移资金,没有理由不相信是他们提出的要求。

分解一下攻击的要素,就会明白为什么这对攻击者来说是如此难以完成的。首先,用户必须积极地在发生攻击的网站上进行认证。如果带有攻击脚本的电子邮件是在用户结束了他们的浏览器会话或注销后发出的,则攻击失败。

攻击者也被迫对目标网站进行大量的侦察,以了解该网站会接受哪些脚本。攻击者不能看到受害者的屏幕,任何来自网站的反馈都会传给受害者,而不是攻击者。除非攻击者能够看到他们的攻击成功的证据,例如钱突然出现在他们的账户中,否则他们甚至不会马上知道是否已经成功。

在攻击时用户已经登录,并且知道目标网站接受哪些脚本的情况下,执行CSRF攻击的代码可能非常简单,尽管它因网站本身而异。

比方说,一个银行或金融应用程序使用GET请求来转移资金,像这样。

GET http://bank.com/transferdo?acct=NancySmith12&amount=100 HTTP/1.1

该代码将发送一个向名为NancySmith12的用户转账100美元的请求。

但如果目标用户收到一封邮件,也许是伪装成来自同事的邮件,CSRF攻击脚本就可能被嵌入到点击动作中。

<a href="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000">Can you quickly read over this quarterly report?<a></a></a>

如果目标用户上了社会工程链接的当,并在财务应用程序的浏览器会话仍然打开时点击了该链接,他们的浏览器将要求该应用程序向ShadyLady15的账户发送10万美元。

脚本甚至可以隐藏在一个不可见的图像中,用户不会看到,但它仍然可以触发浏览器发出请求,就像这样。

<img src="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000" width="0" height="0" border="0">

其结果是一样的。ShadyLady15在没有人发现攻击的情况下获得10万美元。

为什么CSRF如此危险?

CSRF攻击今天很流行,原因与勒索软件攻击继续流行的原因一样。它使攻击者和受害者的钱之间的跳跃性很小。在勒索软件攻击中,系统被加密,用户被勒索金钱以解密数据。在CSRF攻击中,步骤更少。当它们起作用时,受害者只是在不知不觉中向攻击者送钱。

除了直接攻击受害者的钱或公司的财务外,成功的CSRF攻击还可以利用有效用户来破坏网络。想象一下,如果一个攻击者可以使用CSRF漏洞来改变管理员的密码。他们可以立即使用该密码开始窃取数据,通过网络防御系统打开漏洞或安装后门。

虽然这需要大量的工作,而且在某种程度上需要运气,但对于黑客来说,无论他们的最终目标是什么,一次成功的CSRF攻击都可能像中彩票一样。当攻击一个网络时,几乎任何其他类型的攻击都需要几个月的低速和缓慢的侦察,试图保持在SIEM和网络安全人员的雷达之下。相比之下,单一的CSRF攻击可以跳过网络杀伤链上的相当多的步骤,让他们开始非常接近他们的最终目标。

如何阻止CSRF攻击?

与大多数漏洞不同的是,CSRF攻击的错误不在于代码,而在于攻击者创建了一个漏洞,迫使浏览器发出用户不想要的请求,甚至可能不知道。但它们是可以被打败的。

最好的方法之一是让开发人员在生成新的会话时为用户的身份添加一个CSRF令牌。它应该由一串独特和随机的字符组成,并且对用户来说是不可见的。接下来,将CSRF令牌请求作为一个隐藏字段添加到表单中,每当有新的请求提交时,服务器都会检查。攻击者通过用户的浏览器提交请求,甚至不知道隐藏的令牌字段,更不可能发现它是什么,所以他们的请求都会失败。

一个更简单的方法,也不需要太多的编程,就是给任何敏感的东西,如密码修改请求或汇款单,添加一个验证码挑战。它可以很简单,要求用户点击一个按钮,确认请求者不是一个机器人,或者在这种情况下,是一个CSRF脚本。攻击者将无法编写对挑战的回应,而用户如果突然收到CAPTCHA的挑战,而没有先做诸如汇款请求的事情,就会知道有问题。另外,也可以使用第三方令牌(如智能手机)来生成一次性密码,这取决于一个组织在多大程度上希望以安全的名义放慢工作。

最后,虽然不是铁板一块,但许多浏览器如微软Edge或谷歌Chrome现在都有同源策略限制,以阻止来自本地用户以外的任何人的请求。迫使用户使用这些浏览器的最新版本与你的网站互动,可以帮助建立另一层CSRF安全,而不需要给开发团队带来任何负担。

关闭CSRF的大门

在如此高的潜在回报下,CSRF攻击可能永远不会完全消亡,但我们希望你了解到它们为何如此顽固,以及如何从你的网络中永远阻止它们。

要进一步阅读,你可以看一下OWASP跨站请求伪造预防骗局表,它是一个记录这个漏洞演变过程的活文件。如果你真的想加强你的安全知识,你可以通过访问博客来学习如何战胜这种威胁以及更多的威胁。 Secure Code Warrior博客。

你认为你已经准备好测试你的新防卫知识了吗?今天就来玩玩Secure Code Warrior 平台的免费演示吧。

查看资源
查看资源

作者

Jaap Karan Singh

想要更多吗?

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

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

查看博客
想要更多吗?

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

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

资源中心

编码员征服安全。分享与学习系列 - 跨站请求伪造

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

与直接针对网站或应用程序运营商的攻击不同,许多跨站请求伪造(CSRF)攻击的目的是直接从用户那里窃取金钱、货物或凭证。这并不意味着网站运营商应该忽视CSRF代码的漏洞,因为在纯金钱攻击的情况下,最终被盗资金的替换可能是拥有不安全代码的托管网站的责任。而如果目标用户反而丢失了他们的凭证或在不知情的情况下更改了他们的密码,犯罪分子可能会利用这个被盗的身份进行破坏,特别是如果受害者有特权访问。

CSRF攻击是相当复杂的,依靠多个层次才能成功。换句话说,很多东西都必须对攻击者有利,才能发挥作用。尽管如此,它们是一个非常受欢迎的攻击媒介,因为一个成功的攻击可以将钱直接转给黑客,或者让他们能够在网站上肆无忌惮地移动。如果一切按照黑客的方式进行,目标用户甚至可能永远不知道他们是攻击的受害者。

好消息是,由于CSRF攻击的成功需要很多条件,所以有一些很好的防御技术可以阻止它们的发展。

为此,我们将讨论CSRF攻击的三个关键方面。

  • 它们是如何工作的
  • 为什么它们如此危险
  • 你如何能把防御措施放在适当的位置,以阻止他们的冷淡。

CSRF攻击是如何工作的?

由于成功的CSRF攻击有能力直接窃取目标用户的金钱、货物或凭证,尽管创建它们必须付出大量的工作,但它们还是很受欢迎。由于它们经常在不同的平台上进行尝试,多年来它们已经有了各种各样的名字和称呼。你可能听到CSRF攻击被称为XSRF、Sea Surf、Session Riding、Cross-Site Reference Forgery或Hostile Linking。微软在其大部分文档中喜欢把它们称为一键式攻击。但它们都是CSRF攻击,而且打败它们的技术是相同的。

如果用户登录到一个网站开展业务或做他们的工作,就会发生CSRF攻击。关键是,用户必须登录并积极认证一个网站或应用程序。该攻击通常是从一个二级网站或电子邮件发起的。通常情况下,攻击者使用社会工程技术,诱使用户点击电子邮件中的链接,将他们带到一个带有攻击脚本的被攻击网站。

被攻击的网站包含一个脚本,指示活动的浏览器执行命令,通常是一些恶意的命令,如改变用户的密码或将钱转移到攻击者控制的账户。只要用户经过认证,网站就会认为这些命令是由授权用户发出的。为什么不呢?用户已经验证了自己,并提供了访问网站所需的任何密码。他们甚至可能位于一个地理围栏内,正确地坐在他们的办公室终端上。如果他们想改变他们的密码或转移资金,没有理由不相信是他们提出的要求。

分解一下攻击的要素,就会明白为什么这对攻击者来说是如此难以完成的。首先,用户必须积极地在发生攻击的网站上进行认证。如果带有攻击脚本的电子邮件是在用户结束了他们的浏览器会话或注销后发出的,则攻击失败。

攻击者也被迫对目标网站进行大量的侦察,以了解该网站会接受哪些脚本。攻击者不能看到受害者的屏幕,任何来自网站的反馈都会传给受害者,而不是攻击者。除非攻击者能够看到他们的攻击成功的证据,例如钱突然出现在他们的账户中,否则他们甚至不会马上知道是否已经成功。

在攻击时用户已经登录,并且知道目标网站接受哪些脚本的情况下,执行CSRF攻击的代码可能非常简单,尽管它因网站本身而异。

比方说,一个银行或金融应用程序使用GET请求来转移资金,像这样。

GET http://bank.com/transferdo?acct=NancySmith12&amount=100 HTTP/1.1

该代码将发送一个向名为NancySmith12的用户转账100美元的请求。

但如果目标用户收到一封邮件,也许是伪装成来自同事的邮件,CSRF攻击脚本就可能被嵌入到点击动作中。

<a href="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000">Can you quickly read over this quarterly report?<a></a></a>

如果目标用户上了社会工程链接的当,并在财务应用程序的浏览器会话仍然打开时点击了该链接,他们的浏览器将要求该应用程序向ShadyLady15的账户发送10万美元。

脚本甚至可以隐藏在一个不可见的图像中,用户不会看到,但它仍然可以触发浏览器发出请求,就像这样。

<img src="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000" width="0" height="0" border="0">

其结果是一样的。ShadyLady15在没有人发现攻击的情况下获得10万美元。

为什么CSRF如此危险?

CSRF攻击今天很流行,原因与勒索软件攻击继续流行的原因一样。它使攻击者和受害者的钱之间的跳跃性很小。在勒索软件攻击中,系统被加密,用户被勒索金钱以解密数据。在CSRF攻击中,步骤更少。当它们起作用时,受害者只是在不知不觉中向攻击者送钱。

除了直接攻击受害者的钱或公司的财务外,成功的CSRF攻击还可以利用有效用户来破坏网络。想象一下,如果一个攻击者可以使用CSRF漏洞来改变管理员的密码。他们可以立即使用该密码开始窃取数据,通过网络防御系统打开漏洞或安装后门。

虽然这需要大量的工作,而且在某种程度上需要运气,但对于黑客来说,无论他们的最终目标是什么,一次成功的CSRF攻击都可能像中彩票一样。当攻击一个网络时,几乎任何其他类型的攻击都需要几个月的低速和缓慢的侦察,试图保持在SIEM和网络安全人员的雷达之下。相比之下,单一的CSRF攻击可以跳过网络杀伤链上的相当多的步骤,让他们开始非常接近他们的最终目标。

如何阻止CSRF攻击?

与大多数漏洞不同的是,CSRF攻击的错误不在于代码,而在于攻击者创建了一个漏洞,迫使浏览器发出用户不想要的请求,甚至可能不知道。但它们是可以被打败的。

最好的方法之一是让开发人员在生成新的会话时为用户的身份添加一个CSRF令牌。它应该由一串独特和随机的字符组成,并且对用户来说是不可见的。接下来,将CSRF令牌请求作为一个隐藏字段添加到表单中,每当有新的请求提交时,服务器都会检查。攻击者通过用户的浏览器提交请求,甚至不知道隐藏的令牌字段,更不可能发现它是什么,所以他们的请求都会失败。

一个更简单的方法,也不需要太多的编程,就是给任何敏感的东西,如密码修改请求或汇款单,添加一个验证码挑战。它可以很简单,要求用户点击一个按钮,确认请求者不是一个机器人,或者在这种情况下,是一个CSRF脚本。攻击者将无法编写对挑战的回应,而用户如果突然收到CAPTCHA的挑战,而没有先做诸如汇款请求的事情,就会知道有问题。另外,也可以使用第三方令牌(如智能手机)来生成一次性密码,这取决于一个组织在多大程度上希望以安全的名义放慢工作。

最后,虽然不是铁板一块,但许多浏览器如微软Edge或谷歌Chrome现在都有同源策略限制,以阻止来自本地用户以外的任何人的请求。迫使用户使用这些浏览器的最新版本与你的网站互动,可以帮助建立另一层CSRF安全,而不需要给开发团队带来任何负担。

关闭CSRF的大门

在如此高的潜在回报下,CSRF攻击可能永远不会完全消亡,但我们希望你了解到它们为何如此顽固,以及如何从你的网络中永远阻止它们。

要进一步阅读,你可以看一下OWASP跨站请求伪造预防骗局表,它是一个记录这个漏洞演变过程的活文件。如果你真的想加强你的安全知识,你可以通过访问博客来学习如何战胜这种威胁以及更多的威胁。 Secure Code Warrior博客。

你认为你已经准备好测试你的新防卫知识了吗?今天就来玩玩Secure Code Warrior 平台的免费演示吧。

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

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