Eval Villain实战CSPT漏洞挖掘与利用

本文详细介绍了如何使用Eval Villain工具发现和利用客户端路径遍历(CSPT)漏洞。通过逐步演示在CSPT游乐场中的实际操作,包括工具配置、漏洞检测、响应分析和漏洞利用链构建,为安全研究人员提供实用的CSPT漏洞挖掘方法论。

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解码。或者,如果你愿意,可以展开"Encoder function"组来检查。无论哪种方式,Eval Villain都发现了CSPT接收器。

第二个方框位于evSourcer的调试语句上方。这是第一个fetch的响应被添加到Eval Villain源库的地方。结果,Eval Villain警告我们CSPT响应中的_id参数击中了另一个fetch接收器。同样,你可以从"Encoder function"中获得更多细节。

从每个fetch的arg[2/2]中我们了解到更多信息。第一个fetch是一个GET请求,具有"redirect":"follow",第二个具有"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默认不使用路径作为源。所以在"Enable/Disable"弹出菜单中(点击Eval Villain徽标)打开"Path search"。

现在,页面刷新后,Eval Villain将告诉我们关于两个调用fetch的情况,每个都使用路径。我们不知道它们是否是CSPT,我们需要检查是否接受../,但这看起来很有希望。

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

步骤2:测试CSPT

要测试实际的CSPT,只需将字符串%2fasdf%2f..添加到路径的末尾。这是一个很好的技巧,因为这将规范化为原始路径,如果网站易受攻击,它的行为将相同。当你刷新页面时,你将在控制台中看到这个。

找到CSPT原语就是这么容易。如果源在window.name或URL参数中,Eval Villain可能早就找到了它。

由于URL路径被编码,Eval Villain给了我们一个编码器函数。你可以将其粘贴到控制台中,并使用它快速尝试新的payload。该函数将自动应用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的行号,然后单击"Add Conditional breakpoint"。添加evSinker调用,使用你可以识别为注入e变量的名称。evSinker函数总是返回false,所以我们永远不会真正命中这个断点。

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

步骤5:刷新页面,检查次要接收器

现在我们只需刷新页面。由于我们使用true作为evSinker的最后一个参数,我们将使用控制台调试来告诉我们注入了什么。在控制台中启用"Debug"。我们还可以在控制台中启用XHR以查看那里的请求和响应。我们感兴趣的请求将直接跟随Eval Villain输出到控制台,因此很容易找到。这是我们看到的。

为了节省空间,我们关闭了第一个fetch组。它确实显示了asdf%2f..payload击中fetch。我们打开的"XHR"条目没有显示目录遍历,因为它被规范化了。Eval Villain使其易于找到。来自"XHR"的响应可以在下面的控制台调试中看到被注入。然后当然Eval Villain能够发现它击中fetch接收器。

步骤6:额外的小事情

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

步骤7:利用

游乐场使查找小工具变得容易。只需转到页面中的"gadgets"下拉菜单。现实世界没有这个,所以Burp Suite的Bambda搜索似乎是最好的选择。有关更多信息,请参阅Maxence的CSPT研究。

额外功能!Eval Villain在Chrome、Electron和可能的Web Views中?

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

Eval Villain 1.11让你做到这一点。转到配置页面并滚动到最底部。你将看到一个"Copy Injection"按钮。如果单击它,整个Eval Villain注入以及当前配置将被放入你的剪贴板。

使用这个,我们已经将Eval Villain放入了一个检测过的Electron应用程序中。以下屏幕截图显示了Eval Villain在Burp内置Chrome浏览器中的条件断点处运行。

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

结论

检测目标代码并不需要那么长时间。这篇博客文章逐步解释了如何利用Eval Villain来查找和利用CSPT漏洞。即使是为了学习使用游乐场的新技巧,Eval Villain也帮助我们调试小错误。

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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计