导语:这是关于使用 Postman 进行渗透测试系列文章的第一部分。
这是关于使用 Postman 进行渗透测试系列文章的第一部分。我原本计划只发布一篇文章,但最后发现内容太多了,如果不把它分成几个部分的话,很可能会让读者不知所措。 所以我的计划是这样的: 在这篇文章中,我将向你介绍如何设置 Postman 并使用它来发出常规请求。 在第2部分,我会让你通过 Burp Suite 代理 Postman 的网络流量。 在第3部分中,我们将介绍 Postman 的更高级的用法,包括更优雅地处理无记名令牌(Bearer Token)和环境变量。 在第4部分中,我将介绍一两个能够真正增强 Postman 渗透测试效果的 Burp 插件。
在这个时代,Web 和移动应用程序通常是由 RESTful 网络服务提供支持的。 公共和私有 API 在互联网上非常普遍,测试这些 API 绝非易事,但有一些工具可以帮助你。 虽然(通常用与渗透测试)工具不能代替技能,但即使是最熟练的木匠也能用锤子比用鞋子更有效地钉钉子。
Postman 就是这样一个工具,它在开发者中已经流行了很多年。 在我们进入如何设置它的主题之前,我们先来快速介绍一下这个工具是什么以及可以做什么。 Postman 是一个商业桌面应用程序,可用于 Windows、 Mac OS 和 Linux。 它的大部分功能是免费的,也有付费的功能,比如提供协作和文档功能。 与渗透测试人员相比,这些特性对开发人员更有意义。 它用于管理测试各种 API 调用的 HTTP 请求集合,以及包含变量的环境。 它并不能替代你的代理(如:Burp,ZAP,Mitmproxy 等等) ,但是实际上弥补了浏览器和客户端应用程序层缺失的功能。 对于这款工具主要的替代方案是开源工具 Insomnia 和高级 REST 客户端,商业产品 SoapUI,或建立在 Swagger/Swagger UI 或 curl 的自定义工具。
设置 Postman
在其官方网站上(https://www.getpostman.com,)可以找到 Postman,提供 Windows 和 MacOS 的安装程序,以及 Linux 的 tar 包。 它也可以在 Ubuntu 的 Snap for Ubuntu ( HTTPs://snapcraft.io/postman )和其他社区维护的 repos 中找到,比如 Arch Linux 的 AUR。 设置它的第一步当然是程序安装。
在第一次启动 Postman 时,你会看到一个屏幕,提示你创建一个帐户,注册谷歌,或者用现有的凭证进行登录。 然而, Postman 并不需要一个帐户来执行后续的使用。
登录的帐户用于协作/同步/等; 这些是付费的功能。正如我前面提到的,这几个功能对于开发人员来说很棒,但对你来说,可能并不关心。 事实上,如果你通常需要对你的客户端机械能保密,就像我们在 Secure Ideas 所做的事情,那么你可能明确地不希望将你的项目同步到另一个第三方服务器。
如果你低头看窗口的底部,你会看到一些浅灰色的文字,上面写着跳过登录,直接把我带到了应用程序界面。 点击这个灰色的链接,你将移动到下一个屏幕——一个提示你创建东西的对话框。
有几个部分你不会在这里使用到,所以让我们看看你真正关心的三个功能:
· 集合(Collection)——一个你可以用请求填充的通用容器。 它还可以作为一些配置选择的顶级对象,比如身份验证规则(Authentication rules) ,我们稍后将对其进行详细说明。
· 请求(Request)——这个是最主要的功能。 这些是你将要构建的 HTTP 请求,使用你想要使用的任何方法、HTTP Body等。 这些必须始终在一个集合中。
· 环境(Environment) ——这里可以保存你希望在某个地方控制并发出跨请求甚至跨集合所使用的变量。
使用 Postman 的基本知识
是时候创建我们的第一个 Postman 集合并发出 HTTP 请求。
左上角的 New 按钮通常用于创建集合和请求。 让我们首先创建一个集合。 这有点像一个单独的应用程序。 你将用于对相关请求进行分组。
集合还可以作为具有身份验证指令的顶级项,这些身份验证指令将对单个请求进行继承。 现在,只要给它起个名字,然后点击创建按钮就行了。 这里,我起的名字是“测试集合”。
默认情况下,你已经打开了一个未命名的请求选项卡。 让我们来看看 UI 的这一部分。
-
活动选项卡
-
此请求的名称。 这只是一些描述性的名称,你可以写也可以不写。
-
HTTP 方法。 这个下拉控件允许你更改此请求的方法。
-
请求的 URL。 这是完整的路径,就像在你的浏览器的地址栏一样。
-
用于设置请求的各种属性的选项卡式界面,包括参数、HTTP 头、HTTP 主体等。
-
发送按钮。 这实际上是将请求提交到指定的 URL。
-
保存按钮。 第一次单击此选项时,你需要指定你的集合,因为请求必须属于某个集合。
我在 HTTP://localhost:4000 上设置了一个示例目标,所以我将从填写这个请求并保存到我的某个集合作为开始。我将发出一个 POST 请求,到 HTTP://localhost:4000/legacy/auth ,没有任何参数(这是一个测试 API。 任何人都可以通过身份验证)。 当我点击保存按钮时,我将命名请求并为它选择一个集合,如下图所示:
然后单击"保存到测试集合"(根据你的集合名称进行调整)按钮来保存我的请求。 现在,单击 Send 按钮将发出请求。 然后我将看到响应填充在窗口的下窗格中,如下图所示:
-
选项卡界面有 Body , Cookies , Headers 及测试结果。 我们还没有编写任何测试,但是请注意图中标出的响应返回的cookie ,headers。
-
实际响应的 HTTP Body 位于较大的文本窗格中。
-
我们有可读性较好的打印方法或原始的响应主体的选项,以及不同类型的下拉列表(我相信这是预填充的响应头 content-type)。这里还有一个自定义包装按钮,以防你有其他特殊的操作。
-
关于响应的衡量标准包括 HTTP状态码、响应时间和响应大小。
关于 Cookies 的一个旁注
现在,如果我们使用 Postman 重新发出请求,我们将注意到一个重要的事情: 之前在响应中设置的 cookie 会被自动包含。 它模仿了浏览器通常为你做的事情。 正如你对浏览器的期望一样,在这个 cookie 范围内发出的任何请求,Postman 都将自动包含该 cookie。
如果你想移除某个 cookie 该怎么做呢? 这很简单。 在 Postman 的发送按钮下面,有一个类似链接的按钮,上面写着 Cookies。 点击这个按钮,会打开一个对话框,在那里你可以删除或编辑任何你需要的 cookies。
这就是基于 cookie 的 API。 但是让我们面对现实: 现在我们常见的 API 都会使用无记名令牌(Bearer Token)这比使用 Cookies 更为普遍。 我们将在下一节讨论这个问题,以及其他一些更高级的概念。
在上面的几个章节中,我介绍了 API 开发人员最常用的工具——Postman ,它可以更容易地测试 API 的调用。之后,我们创建了一个集合,并向其添加了一个请求。 我们还讨论了 Postman 如何处理 cookies ——这基本上与浏览器的处理方式相同。 在下面的章节中,我们将通过 Burp 代理 Postman 的流量以便对渗透测试的工作做一些调整。
为什么要设置代理?
通过使用 Postman,我们可以将其作为一个优秀的工具,从零开始制作请求并管理这些请求。 通过 Burp 代理 Postman 的流量,我们可以得到这些好处: 我们可以与Burp 的 intruder 功能结合进行模糊测试,我们也可以利用 Burp 的被动扫描器检测突出的安全问题,我们也可以利用 Burp 的扩展插件,这一部分我们将在本系列文章的后续章节中看到。 而且我们可以使用Burp 的 Repeater 篡改请求。 或许你会说,我们也可以在 Postman 里面进行篡改啊。 但是我要说的是使用 Repeater 有两个重要的原因: 1) Postman 的设计是用于发出正确、有效的请求。 在某些情况下,它会尝试纠正格式不正确的语法。 而在测试安全问题时,我们可能不希望它纠正我们篡改的错误。 2)通过使用 Repeater,我们保持了在 Postman 中的请求的干净状态以及在 Repeater 中已篡改的请求这两者之间的分离。
设置 Burp Suite
对 Burp 的实际介绍超出了这篇文章的范围。 如果你正在阅读这篇文章,很可能你已经对它很熟悉了——我们并没有为 API 测试做什么特别的或不同的事情。如果你对 Burp 不熟悉,这里有一些资源可以参考:
· Burp 官方网站——https://portswigger.net/ 提供了一个可供下载的社区版本,专业版本的价格也是相当实惠的。
· Burp 实战课程——这是我们制作的两个小时的录音课程,费用为 25 美元(退伍军人免费,点击链接获得我们的折扣代码)
· Burp Suite: Continuing the Saga ——我的队友拉里最近发表了一篇关于” Burp Suite"的文章 https://blog.secureideas.com/2018/03/burp-suite-continuing-the-saga.html
· 凯文 · 约翰逊的 Burp Suite 教程视频 ——这个视频大概有六年的历史了,虽然是一些较为基础的介绍但还是很有意义。
现在,启动 Burp,检查 Proxy 下的 Options 选项卡。 最上面的部分是代理监听器(Proxy Listeners),你应该会在127.0.0.1和端口8080上看到一个监听器。 它必须一直运行(注意复选框)。 如果它在默认情况下没有运行,那通常意味着端口不可用,你需要将监听器(以及Postman)更改为不同的监听端口。 只要将 Burp 正在监听的端口以及你在 Postman 中设置的代理的地址和端口是同一个,那么你的设置应该没什么问题。
同时检查 Proxy 下的 Intercept 选项卡并验证 Intercept 是否关闭。
在 Postman 中配置 Burp 代理
Postman 是代理感知的,这意味着我们要将它指向我们的中间人代理,也就是 Burp Suite (我的首选工具)。 我们将通过点击右上角的扳手图标(1)打开设置对话框,然后点击下拉菜单上的设置选项(2)。 这会打开一个比较大的设置对话框,在顶部有不同类别设置的标签。 找到"代理"选项卡并单击进行设置。
打开 Postman 设置面板
在这个标签页上有三件事可以做:
打开全局代理配置开关(Global Proxy Configuration)
关闭"使用系统代理(Use System Proxy)"开关
将代理服务器 IP 地址和端口设置为和你在 Burp Suite 代理中设置的一样
默认的代理接口是127.0.0.1,端口是8080,这里假设你的 Postman 和你的 Burp Suite 是在同一台机器上运行的。 如果你想使用不同的端口,你需要在这里指定它,并确保它被设置为与 Burp 中的代理接口一样。
现在你可以代理流量了,还有一个问题需要考虑。 如今,大多数公共 API 都使用了 SSL/TLS 。 这是一件非常好的事情,但它也意味着当 Burp 作为代理中间人在处理 Postman 的 API 请求和响应时,你会遇到证书错误的问题,除非你的系统已经信任了 Burp 的证书颁发机构。 解决这个问题有两个方法:
-
你可以关闭 Postman 中的证书验证。 在 General 设置选项卡下面有一个 SSL 认证验证选项。 设置为 关掉(Off),将使 Postman 忽略任何证书问题,包括 Burp Suite 的 PortSwigger CA 。
-
你可以将你的Burp Suite CA 设置到系统信任存储。 具体的设置细节和平台有关系。
PortSwigger从官方的文档在这里:https://support.portswigger.net/customer/portal/articles/1783075-Installing_Installing%20CA%20Certificate.html
验证代理是否正常工作
用 Postman 发出一些请求。 在 Burp 的 Proxy 选项卡上检查你的 HTTP 历史记录。
在 Burp Suite 中的代理历史
故障排除
· 你发出的请求存在拖延和超时问题? 在 Burp 中的代理选项卡上检查"拦截"是否关闭。 检查 Postman 中的代理设置是否与 Burp 中的代理接口相匹配。
· Postman 收到了响应,但响应没有显示在 Burp 的代理历史中(等等)? 打开 Postman 的”设置"界面,检查"全局代理配置"是否打开。 确保你没有激活 Burp 历史记录的过滤器来过滤掉你所有的请求。 如果没有捕获过滤范围外的流量,模拟还要确保是否在 Burp 中设置了范围(scope)。
这部分内容说明了一些非常基本的设置操作。 现在我们已经做好了基本的工具链设置,我们准备好了一些更高级的东西。 下一篇文章我们将处理 Postman 中的变量,以及它们如何节省你的渗透测试的时间。 我们还将深入研究脚本接口,以及如何使用 Postman 来简化与常见的、现代的身份验证方法的交互操作,如无记名令牌(Bearer Token)。