利用Eval Villain发现与利用客户端路径遍历漏洞(CSPT)

本文详细介绍了如何使用Eval Villain工具分步识别并利用客户端路径遍历漏洞。通过一个CSPT2CSRF的实际案例,展示了从发现漏洞到构建完整攻击链的过程,包括工具配置、代码检测与响应内容注入等核心环节。

CSPT the Eval Villain Way!

03 Dec 2024 - Posted by Dennis Goodlett

Doyensec的Maxence Schmitt最近为其CSPT研究构建了一个练习场。在这篇博文中,我们将演示如何利用Eval Villain来发现和利用CSPT漏洞。为此,我们将利用Maxence练习场中的第二个挑战。

利用Eval Villain进行CSPT的分步介绍

下图展示了这种方法的效果。

我们在图片中添加了一些橙色的框和箭头以更好地说明当前情况。首先,Eval Villain 发现页面路径的一部分被用于一个fetch请求中。 在那里,你可以清楚地看到 asdf%2f.. 被进行了URL解码。或者,如果你愿意,可以展开“编码器功能”组来检查。无论如何,Eval Villain已经发现了这个CSPT漏洞点。

第二个方框位于一个来自 evSourcer 的调试语句上方。这是第一个fetch的响应被添加到Eval Villain源库的地方。结果,Eval Villain警告我们,来自CSPT响应的 _id 参数又击中了一个fetch漏洞点。同样,你可以从“编码器功能”中获得更多细节。

从每个fetch的 arg[2/2] 中我们了解到更多信息。第一个fetch是一个带有 "redirect":"follow" 的GET请求,第二个则带有 "method":"POST"。因此,我们控制了一个客户端GET请求的路径,并且一个开放重定向可能将该请求发送到我们自己的服务器。我们自己服务器的响应随后被用于一个经过认证的POST请求的路径中。这张图展示了CSPT2CSRF漏洞利用链的完整过程。

所有这些检测机制会持续存在,以帮助我们进行漏洞利用。点击提供的解决方案,我们会看到下图。这展示了漏洞利用的具体工作原理。

亲手构建场景

步骤 0: 工具准备 你需要安装带有 Eval Villain 的Firefox。

我们确实推荐在练习场中尝试一下。CSPT是那种在博客文章中读起来似乎很简单,但在实际测试中遇到时会让人感到无从下手的漏洞之一。

步骤 1: 寻找CSPT漏洞 登录练习场并访问“CSPT2CSRF : GET to POST Sink”页面。在Linux上按 Ctrl+Shift+I 或在Mac上按 Cmd+Option+I 打开控制台。确保Eval Villain已开启。使用Eval Villain的默认配置,你应该只会在控制台中看到 [EV] Functions hooked for http://127.0.0.1:3000

然而,在实际测试中,我们会看到URL路径中明显有一个参数。由于误报,Eval Villain默认不会将路径用作源。所以让我们在“启用/禁用”弹出菜单(点击Eval Villain徽标)中打开“路径搜索”。 现在,页面刷新后,Eval Villain将告诉我们关于两个使用路径的fetch调用。我们不知道它们是否是CSPT,我们需要检查是否接受 ../,但这看起来很有希望。

注意:你可能只看到一个fetch,这没关系。

步骤 2: 测试CSPT 要测试实际的CSPT,只需在路径末尾添加字符串 %2fasdf%2f..。这是一个很好的技巧,因为这将规范化为原始路径,如果网站存在漏洞,其行为将保持不变。当你刷新页面时,你将在控制台中看到以下内容。

就这么简单就找到了一个CSPT原语。如果源是在 window.name 或URL参数中,Eval Villain很可能早就发现了它。

由于URL路径被编码了,Eval Villain给了我们一个编码器函数。你可以将其粘贴到控制台中,以便快速尝试新的载荷。该函数将自动应用URL编码。

有了CSPT原语,下一步的利用就是了解这个请求的响应是如何被使用的。为此,我们希望将响应作为Eval Villain的新源引入。

步骤 3: 启用evSourcer 首先你需要在Eval Villain中启用 evSourcer 全局变量。进入弹出菜单中的配置页面,滚动到全局变量表。启用显示“evSourcer”的那一行。别忘了点击保存。

现在你可以刷新页面,并在控制台中运行 evSourcer.toString() 来验证配置更改是否生效。

你可以运行一个快速测试来尝试这个功能。任何放入此函数第二个参数的东西都将被放入Eval Villain的源库中。在使用 evSinker 之前,字符串 foobar 不会从eval漏洞点产生警告,之后则会。

步骤 4: 将CSPT请求的响应放入evSourcer 因此,如果我们将CSPT请求的响应放入 evSourcer,Eval Villain可以告诉我们它是否击中了eval、.innerHTML、fetch或我们已挂钩的任何其他漏洞点。

要找到CSPT请求的响应,我们只需查看Eval Villain给出的堆栈跟踪。

这里我们高亮了我们认为是“魔法区域”的部分。当你看到函数名从最小化的乱码变成可读的大字符串时,那通常就是你想要开始的地方。这通常意味着从库代码到开发人员编写代码的过渡,无论是向前还是向后。这两个函数中很可能有一个是我们想要的。根据上下文,fetchNoteById 很可能正在将信息返回给 Ko。所以,通过点击它旁边的链接,在调试器中转到 Ko 函数。到达那里后,通过点击代码窗格左下角的 {} 图标来美化代码。

你会看到类似这样的代码:

1
2
3
4
5
6
7
8
9
      return (0, t.useEffect) (
        (
          () => {
            r &&
            ot.fetchNoteById(r).then((e => { // <-- fetchNoteById调用在这里
              ot.seenNote(e._id),         // <-- 所以 `e` 可能是我们的JSON响应
              n(e)
            })).catch((e => {
              //...

fetchNoteById 显然返回一个Promise。这说得通,所以我们通常会设置一个断点来检查 e 并与fetch的响应进行比较。一旦你验证了它,就是时候进行检测了。

右键单击包含 ot.seenNote 的行号,然后单击“添加条件断点”。添加 evSinker 调用,使用一个你能识别为注入 e 变量的名称。evSinker 函数总是返回 false,所以我们实际上永远不会命中这个断点。

注意我们已经禁用了源映射。源映射可能会优化掉变量,使调试更困难。另外,Firefox有时需要一点时间来美化代码并将断点放在正确的位置,所以请耐心等待。

步骤 5: 刷新页面,检查二级漏洞点 现在我们只需刷新页面。由于我们使用 true 作为 evSinker 的最后一个参数,我们将使用控制台调试来告诉我们注入了什么。在控制台中启用“调试”。我们也可以在控制台中启用XHR来查看那里的请求和响应。我们感兴趣的请求会直接跟在Eval Villain输出到控制台之后,所以很容易找到。这是我们看到的情况。

为了节省空间,我们关闭了第一个fetch组。它确实显示了 asdf%2f.. 载荷击中了fetch。我们在那里打开的“XHR”条目没有显示目录遍历,因为它被规范化掉了。但Eval Villain让它很容易被发现。来自“XHR”的响应可以在下面的控制台调试中看到被注入。当然,Eval Villain能够发现它击中了fetch漏洞点。

步骤 6: 额外的小细节 你可能注意到最后一张图片中没有 arg[2/2] 输出。该参数是一个JavaScript对象。Eval Villain默认配置为只查看字符串。打开弹出菜单,点击类型并启用对象。然后当你刷新页面时,你可以从Eval Villain的输出中看到传递给fetch的选项是什么。

步骤 7: 漏洞利用 练习场使得查找利用工具(gadgets)变得容易。只需进入页面中的“gadgets”下拉菜单。真实世界没有这个功能,所以Burp Suite的Bambda搜索似乎是最佳选择。更多相关内容请参阅Maxence的CSPT研究

额外功能!Eval Villain在Chrome、Electron甚至Web视图中的使用?

Eval Villain实际上只是一个带有配置的JavaScript函数,Firefox会在每个页面加载前将其复制/粘贴进去。一旦注入,它只是使用控制台来记录输出。所以理论上,你可以手动将这段相同的代码复制粘贴到任何接受JavaScript的地方。

Eval Villain 1.11让你可以做到这一点。进入配置页面并滚动到最底部。你会看到一个“复制注入”按钮。如果你点击它,整个Eval Villain注入代码以及当前配置将被复制到你的剪贴板。

使用这个功能,我们已经成功将Eval Villain注入到一个经过检测的Electron应用中。以下截图显示了Eval Villain在Burp内置的Chrome浏览器中从一个条件断点运行。

或者,你可以使用Burp中的HTTP Mock扩展将Eval Villain粘贴到一个Web响应中。我们还没有尝试过,但使用Frida将其注入到Android的Web视图中将会很酷。

结论

检测目标代码其实并不需要很长时间。这篇博文逐步解释了如何利用Eval Villain来发现和利用CSPT漏洞。即使是为了学习新技巧而使用练习场,Eval Villain也能帮助我们调试小错误。

确保为正确的工作使用正确的工具。例如,Eval Villain不能解码所有内容(请查看片段挑战)。Maxence开发了一个很棒的Burp扩展用于CSPT,但它缺乏对DOM的洞察。其他一些工具还有GekoDOMLogger++DOM Invader(在sinks中启用xhr.open和fetch)。混合使用最适合你的工具。


其他相关博文:

  • CSPT资源 - 2025年3月27日
  • 绕过文件上传限制以利用客户端路径遍历 - 2025年1月9日
  • 利用客户端路径遍历执行跨站请求伪造 - 介绍CSPT2CSRF - 2024年7月2日
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计