当前位置: 首页 > news >正文

利用Eval Villain挖掘CSPT漏洞的完整指南

CSPT the Eval Villain Way!

2024年12月3日 - 作者: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是一个GET请求,具有"redirect":"follow",第二个具有"method":"POST"。因此我们控制了一个客户端GET请求的路径,开放重定向可能将该请求发送到我们自己的服务器。我们自己服务器的响应随后将被用于经过身份验证的POST请求的路径中。这张图片展示了CSPT2CSRF利用的完整利用链。

所有这些检测都保留下来帮助我们进行利用。点击提供的解决方案,我们看到以下图像。这确切地展示了利用是如何工作的。

自己构建图片

步骤0:工具

你需要安装有Eval Villain的Firefox。

我们真的推荐在演练环境中尝试这个。CSPT是那种在博客中阅读时似乎很容易,但在测试中遇到时感觉令人生畏的漏洞之一。

步骤1:寻找CSPT

登录演练环境并访问"CSPT2CSRF:GET到POST接收器"页面。在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给了我们一个编码函数。你可以将其粘贴到控制台中,并使用它快速尝试新的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函数。到达那里后,通过点击代码窗格左下角的{}图标来美化代码。

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

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..payload命中了fetch。我们在那里打开的"XHR"条目没有显示目录遍历,因为它被标准化掉了。但Eval Villain使其易于找到。"XHR"的响应可以在下面的控制台调试中看到被注入。然后当然Eval Villain能够发现它命中了fetch接收器。

步骤6:额外的小事情

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

步骤7:利用

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

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

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 View中会很酷。

结论

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

确保为正确的工作使用正确的工具。例如,Eval Villain不能解码所有内容(查看fragment挑战)。Maxence为CSPT开发了一个很棒的Burp扩展,但它缺乏对DOM的洞察。其他一些工具是Geko、DOMLogger++和DOM Invader(在接收器中启用xhr.open和fetch)。混合搭配最适合你的工具。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.hskmm.com/?act=detail&tid=38402

相关文章:

  • Button按钮插入图片后仍有白色边框的解决办法
  • Hugo主题的修改和配置
  • 多元生成函数+多项式方程组——[AGC058D] Yet Another ABC String
  • ABP - JWT 鉴权(JWT Authentication)[AbpJwtBearerModule、JwtBearerOptions]
  • 最小生成树 kruskal算法
  • 【Java】Synchronized-你知道Java是如何上锁的吗?
  • Java中的字符串及相关类的介绍
  • ABP - 工作单元(Unit of Work)[UnitOfWorkAttribute、IUnitOfWorkManager、UnitOfWorkOptions]
  • LeetCode刷题笔记
  • [NOIP2023] 双序列拓展 题解
  • 洛谷 P9530 Fish 2
  • 洛谷 P7011 Escape
  • 你可以把它喂给AI让AI猜猜我在干什么
  • 【深入浅出Nodejs】异步非阻塞IO
  • 135. 分发糖果
  • 【Java-JMM】Happens-before原则
  • P6072 『MdOI R1』Path
  • P1601题解
  • 10-23 好题选讲总结
  • 关于驻马店市 2025 中小学信息学竞赛的记录(入门级)(未完)
  • 关于Markdown的使用
  • 自定义Spring Cloud LoadBalancer实践
  • 游记——驻马店市2025中小学信息学竞赛(未完)
  • 线段树上二分
  • ABP - SqlSugar [SqlSugarModule、ISqlSugarClient、SqlSugarRepository]
  • Odoo18.0 对接 京东快递
  • SAP折旧模拟超过1000条资产dump问题及解决
  • [python] 代码性能分析工具line_profiler使用指北
  • react的diff算法
  • LLM学习记录DAY11