点击蓝字 关注我们
如果您花费大量的时间去破解 API,您会注意到许多的端点使用全局唯一标识符 (GUID) 来命名系统中的数据。虽然 GUID 是确保数据唯一性的好方法,但它们也可以是可预测的。
在本文中,我将向您展示如何利用可预测的 GUID 来攻击这个 API。我使用这种方法访问到了未授权且受保护的数据,并曾经使用它完成过帐户的接管。
因此,让我们深入了解妖魔化开发人员的黑暗艺术......并展示错误生成GUID会怎样导致一些有趣攻击对于这个API。
一个黑客的GUID入门
我们明白了......
所以在我们开始之前,我需要澄清一些事情......
GUID 与 UUID
如果执行此操作的时间足够长,则会看到在 API 中引用 ID 时使用的术语 GUID 和 UUID。有人说它们代表不同的东西。还有人说,这同样是血腥的。
那么谁是对的呢?
GUID 名称是 Microsoft 定义的行业标准,用于提供在任何上下文中唯一的参考编号。UUID 是一个术语,代表通用唯一标识符。同样,GUID 代表全局唯一标识符。
所以基本上,同一件事有两个术语。在 API 世界中,它们可以互换使用。在Microsoft的世界里呆了几十年,我称它们为GUID。
你可以随心所欲地称呼它们。
那么什么是 GUID?
GUID 是以等于 128 位的数字序列构造的。ID 以十六进制字符表示,这意味着它使用数字 0 到 9 和字母 A 到 F。十六进制数字分为 32 个十六进制字符,带有四个连字符:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
.
GUID 应该是唯一的和随机的。如果使用得当,它们可以。然而,开发人员经常犯一个错误,它打破了这一点,并使它们变得可预测......导致我们可以在进攻中利用的各种问题。
如何预测 GUID
根据 RFC 4122,GUID 具有特定的结构,我们可能会滥用该结构来泄露有关目标的特定信息。这又回到了向后兼容性和版本控制的世界。
你看,当原始规范发布时,UUID 的第一个版本是基于时间的,并使用系统的工件来生成唯一的值。这些工件包括:
-
当前时间 -
启动时随机生成的“时钟序列”,但在 GUID 之间保持不变 -
“节点 ID”,根据系统的 MAC 地址生成
它看起来像这样:
您可以在https://datatracker.ietf.org/doc/html/rfc4122#section-4.2.2阅读完整的GUID V1的详细信息。
所以事情是这样的。版本信息存储在 GUID 的第 13 个字符中。这是第二个连字符/破折号后面的字符。因此,如果第 13 个字符是一个1,则您知道 该API 可能容易受到可预测 GUID 的攻击。
实际上,可以解码现有的 v1 GUID 并提取生成系统将自行生成的 GUID 列表所需的大多数必要工件。换句话说,我们可以利用这种可预测性来计算目标系统在任何给定时间将产生什么,从而为我们提供了利用它来竞标的机会。
想象一下,网上银行转账需要审批流程。请求资金转账时,系统会生成包含新 GUID 的唯一链接,并将其发送给审批者。只需单击一下,即可获得批准。
如果我们可以在侦察过程中捕获单个 GUID,并且可以确定 API 服务器的时间,那么我们就拥有了伪造自己的审批链接以破坏业务逻辑所需的一切,并允许我们批准自己的恶意传输。
认为这种情况不可行吗?那么现代无密码 Web 应用程序登录系统呢?还是密码重置功能,遵循使用唯一 URL 链接的安全编码建议?您可以通过这种方式攻击许多现实世界的场景。只需查找使用 v1 GUID 表示唯一事务的位置。
好了,现在你已经了解了如何攻击可预测的 GUID。让我们针对实际的 API 目标进行练习,看看它的实际效果。
攻击你的第一个可预测 GUID在这个API中
真可爱。。。想抚摸吗??
我们当然不是邪恶的。因此,当我说我们要攻击一个真正的 API 时,我有点自由。但请坚持在这里。在 Internet 上发布的 API 上练习此操作将帮助您了解这一切是如何协同工作的。
所以要友善。
有问题的 API 是 https://uuid.openkm.com/api/version1 的 UUID 生成器。对该端点的GET请求将始终返回 v1 GUID。
为了帮助你应对这种可预测性攻击,我在 GitHub 上发布了一个名为 guid_reaper.py 的gist。GUID Reaper 是一个基于我编写的 guidtool 的 python 脚本,可让您快速转储 v1 GUID 并生成自己的一组可预测的 GUID 以用于目标。
我们将使用 GUID Reaper 来解码从 API 返回的唯一标识符,然后使用它来查看我们是否可以预测 API 将生成的下一个 GUID 之一。
和我在一起?那好吧......我们走吧!
步骤 1:从 API 捕获第一个 GUID
我们不需要在这里花哨。让我们简单地使用 curl 并带回:
$ curl https://uuid.openkm.com/api/version1
步骤 2:使用 GUID Reaper 解码 GUID
现在,我们有了第一个 GUID,请通过 GUID Reaper 运行它,以解码我们需要的所有位:
$ ./guid_reaper -d 907886f0-50a4-11ed-8caf-00163e9b33ca
我们肯定有一个 v1 GUID,现在有来自目标的节点 ID、MAC 地址和时钟序列。
第 3 步:计算攻击者和受害者系统之间的时间漂移
因此,我们几乎拥有了能够构建自己的可预测 GUID 所需的一切。但是,我们仍然需要弄清楚一个小神器。这就是 API 服务器认为现在是什么时间,它与我们自己的系统相比如何?
大多数 API 端点都在包含 Date 标头的 Web 服务器上运行。因此,如果我们也传递 -i 参数来转储响应标头,我们通常可以在 curl 期间获取服务器的时间戳。我实际上通过了 -is,因为我喜欢在静音/安静模式下运行 curl。
它最终看起来像这样:
$ curl -is https://uuid.openkm.com/api/version1
如果我们要解码新的 GUID,我们应该看到时间戳与 GUID 所包含的内容映射:
$ ./guid_reaper.py -d d5b0f250-50a6-11ed-8caf-00163e9b33ca
如您所见,日期匹配。但这与我自己的系统相比如何?
我们可以简单地在请求完成时转储本地时间戳并进行比较。为了完成此操作,我还将插入一个 printf 调用,在 curl 命令后添加一个换行符,以确保我的日期显示在自己的行上。我还将在 date 中使用 -u 选项,以便它返回一个 UTC 日期,以便它们更容易比较。
它看起来像这样:
$ curl -is https://uuid.openkm.com/api/version1; printf 'n'; date -u
正如你所看到的,API 服务器的时间和我自己的时间之间大约有 5 秒的偏差。每当我们在系统上生成用于 API 服务器的 GUID 时,我们都需要考虑到这一点。
知道时间偏差在下一步中很重要。
步骤 4:使用 GUID Reaper 生成我们自己的 GUID
若要生成自己的 GUID 以用于 API,我们只需向 GUID Reaper 传递要预测其 GUID 的操作的日期,以及以前从目标捕获的 GUID。您可以使用 -t 参数来执行此操作。
GUID Reaper 已经有一个 2 秒的滑动窗口,这意味着在生成一组 GUID 时,它将在我们指定的时间之前 2 秒和之后 2 秒生成 ID。但是,由于我知道系统之间存在 5 秒的漂移,因此我想对此进行解释。
下面是它可能看起来像一个示例:
./guid_reaper.py -t '2022-10-20 21:04:03' d5b0f250-50a6-11ed-8caf-00163e9b33ca > guidlist.txt
GUID Reaper 获取传入的捕获的 GUID,并计算 id 生成的精度。许多系统都具有毫秒的亲和力,这意味着如果您查看转储 GUID 的时间戳,它的末尾有 4 个零。这很有帮助,因为它减少了我们需要生成的必要候选 ID。对于此 API,这意味着使用 2 秒的滑动窗口来考虑漂移,将有 4,000 个可能的 GUID 可供尝试。当然,所需的精度越高,候选名单就越大。
步骤 5:使用候选列表暴力破解 API 端点
因此,针对此 API 执行此步骤有点困难。通常,可以使用生成的文本文件作为 Burp Intruder 的输入,并触发依赖于 GUID 的请求。例如,如果这是对密码重置链接的攻击,我们可以触发 GET 请求并相应地构造 URL 和查询参数。
由于我们无法真正做到这一点,我想做的只是在我查询 API 之前简单地演示如何生成列表,然后 grep 查找我生成的列表中返回的 GUID 以证明它有效。
该命令如下所示:
$ ./guid_reaper.py -t '2022-10-20 21:04:03' d5b0f250-50a6-11ed-8caf-00163e9b33ca > guidlist.txt ; head -n 1 guidlist.txt; tail -n 1 guidlist.txt; printf 'n'; curl -is https://uuid.openkm.com/api/version1
注意到 3 个 GUID 了吗?前两个表示 GUID Reaper 生成的第一个和最后一个 GUID。最后一个 GUID 是 API 返回的 GUID。当我们浏览guidlist.txt文件时......是的。。。它就在那里。
得分!
现在,为了处理时间偏差,我使用了一个新概念。我知道 GUID Reaper 有一个 2 秒的偏差,并且我的系统与 API 服务器相差 5 秒。所以我在下午 2:04 在我的系统上运行了它,但将时间参数设置为下午 2:04:03(格林威治标准时间 21:04:03)。这确保了本地生成的候选和在 Web 服务器上生成的候选者处于同一时间范围内。
提示:如果您不想在脑海中对时间偏差进行这种数学运算,只需同步您的本地时钟以匹配攻击前服务器的时钟即可。
结论
所以你有它。如果发现在终结点中使用 v1 GUID 的目标 API,并且该终结点依赖于该 GUID 作为其业务逻辑的一部分,则有机会对其进行预测并对其进行 pwn。
你可以用它来发挥真正的创意。我会把它留给你的脑海去思考和看到所有的可能性。
喜欢您正在阅读的内容并想继续改进您的 API 黑客技术?查看我的 API 黑客资源终极指南中的一些内容。
这个文章"黑客攻击可预测的 GUID" 首先出现在Dana Epp的博客上发出。
这是来自 Dana Epp 博客的安全博客网络联合博客,由 Dana Epp 撰写。阅读原文:https://danaepp.com/attacking-predictable-guids-when-hacking-apis
文章来源
https://securityboulevard.com/2022/11/attacking-predictable-guids-when-hacking-apis/
原文始发于微信公众号(solar应急响应团队):【文章转载】黑客攻击 API 时攻击可预测的 GUID
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论