CSPT the Eval Villain Way!
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"弹出菜单中打开"Path search"(点击Eval Villain徽标)。
现在,在页面刷新后,Eval Villain将告诉我们关于两个调用fetch的情况,每个都使用路径。我们不知道它们是否是CSPT,我们需要检查是否接受../,但这看起来很有希望。
![路径搜索结果显示]
注意:你可能在这里只看到一个fetch,这没问题。
步骤2:测试CSPT
要测试实际的CSPT,只需将字符串%2fasdf%2f..添加到路径的末尾。这是一个好技巧,因为这将标准化为原始路径,如果易受攻击,网站将表现相同。当你刷新页面时,你将在控制台中看到这个。
![CSPT测试结果]
找到CSPT原语就是这么容易。如果源在window.name或URL参数中,Eval Villain可能早就找到了它。
由于URL路径被编码,Eval Villain给了我们一个编码器函数。你可以将其粘贴到控制台中并快速尝试新的payload。该函数将自动应用URL编码。
有了CSPT原语,下一步是利用是了解此请求的响应如何使用。为此,我们希望将响应作为新源摄入Eval Villain。
步骤3:启用evSourcer
首先你需要在Eval Villain中启用evSourcer全局变量。从弹出菜单转到配置页面并滚动到全局变量表。启用显示"evSourcer"的行。别忘了点击保存。
![启用evSourcer]
现在你可以刷新页面并在控制台中运行evSourcer.toString()来验证配置更改生效。
![验证evSourcer]
你可以运行快速测试来尝试这个功能。进入此函数第二个参数的任何内容都将被放入Eval Villain源库。在使用evSinker之前,字符串foobar不会从eval接收器生成警告,之后它会。
![evSourcer测试]
步骤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浏览器中从条件断点运行。
![Electron中的Eval Villain]
或者你可以使用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)。混合搭配最适合你的工具。