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
函数。到达那里后,通过单击代码窗格左下角的{}图标来美化代码。
你将看到类似这样的代码:
|
|
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)。混合搭配最适合你的工具。