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

news/2025/10/24 21:40:32/文章来源:https://www.cnblogs.com/qife122/p/19164281

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.mzph.cn/news/945689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Button按钮插入图片后仍有白色边框的解决办法

别人的大道再好,那也是别人的道路,不妨埋头做事,但问耕耘莫问收获,偶尔抬头,左右看两眼其它路上的人物风光,就够了。起因:我设置完背景图片后 ,边框仍有白色边框 ,看起来很别扭 如图所示:解决方法: 将FlatA…

Unity静态资源优化

Unity静态资源优化 目录1.音效资源Force To MonoNormalizeLoad In BackgroundAmbisonicLoad In Background / Preload Audio DataCompression FormatLoad TypeSample Rate Setting音频配置2.Model导入设置检查与优化定…

【Java】Spring @Transactional 事务失效:9大经典『陷阱』及终极解决方案

@Transactional 注解是 Spring 框架中声明式事务管理的核心,它极大地简化了开发人员的事务管理工作。然而,在日常开发中,我们常常会遇到一个令人困惑的问题:“明明加了 @Transactional 注解,为什么事务没有生效?…

【模板】动态 dp 学习笔记(树剖版)

动态 dp 学习笔记(树剖版) 本文同步发表于 cnblogs。 本文同步发表于 luogu。 前置知识:简单 dp 树链剖分 矩阵乘法和广义矩阵乘法P4719 【模板】动态 DP 本文着重讲下修改的具体过程以及代码实现,蒟蒻花了好长时间…

ABP - JWT 鉴权(JWT Authentication)[AbpJwtBearerModule、JwtBearerOptions]

JWT 鉴权(JWT Authentication) 核心辅助类:AbpJwtBearerModule:JWT集成模块。 JwtBearerOptions:JWT配置选项。JWT(JSON Web Token)是ABP框架中常用的无状态鉴权方案,核心作用是“让客户端携带Token访问接口,…

软考四

软考四Posted on 2025-10-24 21:33 心默默言 阅读(0) 评论(0) 收藏 举报1. 操作系统的概念2. 进程管理3. 存储管理4. 文件管理

CSP-S2022

T1 首先可以花 \(O(n(n + m))\) 的时间求出任意两个点是否可以通过至多转车 \(k\) 次到达。若 \(f_{u, v} = 1\) 表示可以,否则不可以。 先暂时忽略景点不能相同的限制。因为有 \(4\) 个景点,不能 \(O(n^4)\) 全部枚…

Hugo主题定制速查手册

以下是为你整理的《Hugo主题定制速查手册》,涵盖核心配置、模板修改、样式调整、功能扩展等关键场景,方便快速查阅: 一、核心配置速查表(config.toml)配置类别 关键参数示例(TOML格式) 说明网站基础信息 baseUR…

10/24

今天没课

Hugo主题的修改和配置

Hugo主题的修改和配置核心围绕配置文件(控制全局参数)和主题目录结构(修改页面布局、样式与功能)展开,本质是通过调整参数和自定义模板来实现个性化需求。 一、主题配置:通过配置文件控制全局参数 Hugo的配置文件…

多元生成函数+多项式方程组——[AGC058D] Yet Another ABC String

多元生成函数+多项式方程组——[AGC058D] Yet Another ABC String 计算小练习 7(AGC085D) - 洛谷专栏

最小生成树 kruskal算法

一个贪心算法,先排序,然后从小到大开始选边; 同时用并查集来维护两个点是否连通,如果当前边连接的两个点已经连通,那么说明选这条边没有任何意义,一定是劣的(因为前面已经排了序) #include<bits/stdc++.h&g…

Tarjan练习

见pdf https://wwak.lanzouo.com/ipQq6398irbc

Python开发之设置Hugging Face的模型缓存目录(HF_HOME )及模型下载超时问题(HF_ENDPOINT)

当我们本地Python开发下载Hugging Face模型的时候 下载的模型默认缓存是在用户盘底下的 一般是C盘,但是模型一般都比较大,这就导致C盘系统盘爆满,所以要修改默认缓存路径点击WIN+R 输入control 如下图所示 打开 控…

Java中的字符串及相关类的介绍

🔺jdk1.8 String底层是char[],字符数组。 1.String不是Java基本数据类型,不可以被继承,因为final关键字修饰. 2.String和StringBuilder、StringBuffer的区别 2.1 String的值创建后不能修改,修改String操作会创建新的…

10.24上课笔记

CF1276B 给你一张n个点m条边的无向图,给定两个点a和b,问有多少点对(x,y)之间的路径必须经过a和b两个点 x,y \(\neq\) a,b \[1 \le n \le 2 *10^5, 1 \le m \le 5*10^5 \]hint1 判断a,b都是割点 CF999E 给你一个n个点…

洛谷 P7011 Escape

房间情况记为 \(a_u\)。 首先,判定能否逃走,可以在 \(t\) 点下面挂一个编号为 \(n+1\) 的点,权值为 \(+\infty\)。判定就转化为,能否在题设限制中,最终的体力达到 \(+\infty\)。 然后考虑这个英雄会怎么走。 他可…

你可以把它喂给AI让AI猜猜我在干什么

// code by 樓影沫瞬_Hz17 #include <bits/stdc++.h> using namespace std;#define getc() getchar_unlocked() #define putc(a) putchar_unlocked(a) #define en_ putc(\n) #define e_ putc( )// #define int l…

nginx反向代理和负载均衡 - 实践

nginx反向代理和负载均衡 - 实践2025-10-24 21:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…