XSS攻击
典型的 Web 应用程序的工作原理是从后端服务器接收 HTML 代码并将其呈现在客户端互联网浏览器上。当易受攻击的 Web 应用程序未正确清理用户输入时,恶意用户可以在输入字段(例如评论/回复)中注入额外的 JavaScript 代码,因此一旦其他用户查看同一页面,他们就会在不知不觉中执行恶意 JavaScript 代码。
XSS漏洞仅在客户端执行,因此不会直接影响后端服务器。它们只能影响执行漏洞的用户。 XSS 漏洞对后端服务器的直接影响可能相对较低,但它们在 Web 应用程序中非常常见,因此这相当于中等风险 ( low impact + high probability = medium risk),因此,我们应始终努力通过检测、补救和主动预防这类漏洞来降低风险。
XSS 的类型
类型
描述
Stored (Persistent) XSS
最关键的 XSS 类型,当用户输入存储在后端数据库中,然后在检索时显示(例如,帖子或评论)时,就会发生这种情况
Reflected (Non-Persistent) XSS
当用户输入经后端服务器处理后显示在页面上但未存储(例如搜索结果或错误消息)时发生
DOM-based XSS
另一种非持久性 XSS 类型,当用户输入直接显示在浏览器中并完全在客户端处理,而不到达后端服务器(例如,通过客户端 HTTP 参数或锚标记)时发生
存储型(Stored) XSS
Stored) XSS如果我们注入的 XSS 有效负载被存储在后端数据库中,并在访问页面时被检索,这就意味着我们的 XSS 攻击是持久性的,可能会影响访问页面的任何用户。
因此,这种类型的 XSS 最为关键,因为它影响的受众面更广,任何访问页面的用户都会成为这种攻击的受害者。此外,存储型 XSS 可能不容易删除,有效载荷可能需要从后端数据库中删除。
XSS 测试负载
我们可以使用以下基本 XSS 负载来测试页面是否容易受到 XSS 攻击:
<script>alert(window.origin)</script>我们使用这种有效载荷,因为它是一种非常容易发现的方法,可以知道我们的 XSS 有效载荷何时被成功执行。假设页面允许任何输入,并且不执行任何消毒处理。在这种情况下,当我们输入有效负载后或刷新页面时,就会直接弹出警报,并显示正在执行的页面的 URL
应该在页面源中看到我们的Payload:
由于某些现代浏览器可能会在特定位置阻止 alert() JavaScript 函数,因此了解其他一些基本的 XSS 有效载荷对验证 XSS 的存在可能很有帮助。其中一个 XSS 有效载荷是<plaintext>,它会停止渲染后面的 HTML 代码,并将其显示为纯文本。另一个容易被发现的有效载荷是 print(),它会弹出浏览器打印对话框,任何浏览器都不太可能阻止它。尝试使用这些有效载荷,看看它们各自是如何工作的。
要查看有效负载是否持续存在并存储在后端,我们可以刷新页面,看看是否再次收到警报。如果是这样,我们就会发现即使在整个页面刷新过程中也会不断收到警报,从而确认这确实是一个Stored/Persistent XSS 漏洞。这并不是我们独有的情况,任何访问该页面的用户都会触发 XSS 有效载荷并收到相同的警报。
反射型(Reflected) XSS
非持久性 XSS 漏洞有两种类型:反射式 XSS(由后端服务器处理)和基于 DOM 的 XSS(完全在客户端处理,永远不会到达后端服务器)。与持久性 XSS 不同,非持久性 XSS 漏洞是临时性的,不会因页面刷新而持久存在。因此,我们的攻击只会影响目标用户,而不会影响访问页面的其他用户。
当我们的输入到达后端服务器后,未经过滤或消毒就返回给我们时,就会出现反射 XSS 漏洞。在许多情况下,我们的整个输入都可能被返回给我们,如错误信息或确认信息。在这种情况下,我们可以尝试使用 XSS 有效载荷,看看它们是否会执行。不过,由于这些通常是临时信息,一旦我们离开页面,它们就不会再执行,因此它们是非持久性的。
在存在Reflected XSS漏洞的网页上进行练习
尝试添加任何test字符串来查看它是如何处理的:

我们得到Task 'test' could not be added.,其中包括我们的输入test作为错误消息的一部分。如果我们的输入没有经过过滤或净化,该页面可能容易受到 XSS 攻击。
一旦我们点击Add,我们就会弹出警报:

在本例中,我们看到错误信息''Task ' ' could not be added.由于我们的有效负载使用<script>标记进行了封装,浏览器无法渲染它,因此我们得到的是空的单引号' '。我们可以再次查看页面源代码,确认错误信息中包含我们的 XSS 有效负载:
但是,如果 XSS 漏洞是非持久性的,我们该如何利用它来锁定受害者呢?
这取决于使用哪个 HTTP 请求将我们的输入发送到服务器。我们可以点击[CTRL+I]并选择 "网络 "选项卡,通过火狐浏览器开发工具检查这一点。然后,我们可以再次输入测试有效载荷,并点击 "添加 "进行发送:

可以看到,第一行显示我们的请求是一个 GET 请求。GET 请求将参数和数据作为 URL 的一部分发送。因此,为了锁定目标用户,我们可以向其发送包含有效负载的 URL。要获取 URL,我们可以在发送 XSS 有效负载后从 Firefox 的 URL 栏中复制 URL,也可以右键单击网络选项卡中的 GET 请求,然后选择复制 > 复制 URL。一旦受害者访问该 URL,XSS 有效载荷就会执行:

DOM XSS
第三种也是最后一种 XSS 是另一种非持久类型,称为基于 DOM 的 XSS。反射型 XSS 通过 HTTP 请求将输入数据发送到后端服务器,而 DOM 型 XSS 则完全在客户端通过 JavaScript 进行处理。当使用 JavaScript 通过文档对象模型(DOM)更改页面源时,就会发生 DOM XSS。
最后更新于
这有帮助吗?