[{"content":"1. ezpollute\n分析源码，是一个Node.js + Express 网站，\n1启动一个 Web 服务\n2提供一个接口 /api/config，让用户提交 JSON 配置\n3提供一个接口 /api/status，去启动一个新的 node 子进程，检查“Node.js 是否正常运行”\n开发者显然知道 __proto__ 常常和原型污染有关，所以他写了个“黑名单”：\n如果发现传进来的键名是 __proto__，就拒绝。\n不过 in 不只检查对象自己有没有这个属性，还会检查它原型链上的属性。\nBUT 没拦 constructor.prototype。\n由于 key in target 会沿原型链找，config 上虽然没有自有属性 constructor，但它能从 Object.prototype 继承到，所以可以一路递归到 Object.prototype，形成原型污染。\n构造payload拿下\nXMCTF{9fa42f10-38fa-4963-b4ca-a21beabee11e}\n2. ez_python\n分析app.py, Flask框架\n考点是 Python 对象属性递归合并导致的任意属性覆盖\n`POST /` 会在 `request.data` 非空时执行 `merge(json.loads(request.data), instance)`\n- `merge()` 可递归修改 `instance.config.filename`\n- `GET /read` 会执行 `open(instance.config.filename).read()`，形成任意文件读取\n3、Broken Trust\n/api/profile 存在未鉴权 SQL 注入，可直接泄露管理员资料。用该 UID 登录后可访问 /api/admin?action=backup\u0026amp;file=\u0026hellip;，直接拿到flag\n先随便注册一个\n知道了 只有管理员可以拿到权限\nDirsearch扫描发现/api/profile\nBP改个抓包方式\n打出管理员UID，基本搞定了\n用管理员UID登录，路径不对，想到路径穿越，慢慢试，试出来，\n直接flag\n4.only-real\n1\u0026gt;\nF12提示了账号密码\n登入进去之后f12把disabled全部删除\n2\u0026gt;\n看看能不能进行JWT伪造（JSON Web Token）\nJWT（JSON Web Token）伪造是 Web 安全中非常经典且重要的一个考点。在 CTF 的 Web 方向中，它通常是你从“普通访客”跨越到“管理员”并最终拿到 Flag 的关键钥匙。\n我们可以把 JWT 想象成一张“电子通行证”，服务器一旦签发给你，之后就不再查询数据库，而是直接通过查验这张通行证上的印章（签名）来确认你的身份。JWT 伪造的核心原理，就是利用服务端验证机制的漏洞，自己伪造出一枚能够以假乱真的“印章”，从而随意篡改通行证上的身份信息。\n为了理解它是怎么被伪造的，我们需要先拆解这张通行证的结构。\nJWT 的基础结构\n一个标准的 JWT 看起来是一串由两个点 . 分隔的长字符串（例如 xxxxx.yyyyy.zzzzz），它由三部分组成，每部分都经过了 Base64Url 编码：\nHeader（头部）： 声明了这块 Token 的类型（JWT）和所使用的签名算法（比如 HS256 或 RS256）。 JSON\n{ \u0026ldquo;alg\u0026rdquo;: \u0026ldquo;HS256\u0026rdquo;, \u0026ldquo;typ\u0026rdquo;: \u0026ldquo;JWT\u0026rdquo; }\nPayload（负载）： 存放实际的有效信息，比如你的用户名、角色、过期时间等。 JSON\n{ \u0026ldquo;user\u0026rdquo;: \u0026ldquo;guest\u0026rdquo;, \u0026ldquo;role\u0026rdquo;: \u0026ldquo;user\u0026rdquo; }\nSignature（签名）： 这是防伪的关键。服务器用一个只有它自己知道的密钥（Secret），按照 Header 里指定的算法，对 Header 和 Payload 进行加密计算得出的结果。 BP改jwt发包\n发现改user=admin回显未登录，alg=none，sub: \u0026ldquo;0\u0026quot;全部回显”无效cookie”\n遂,JWT伪造失败\nWait，学习大佬的wp发现可能是一个弱密钥(正好学到利用jwtcracker工具，可以去csdn上看看，很简单，一学就会，不过爆破的时间有点长，最好问问GPT格式是啥，能省好多时间)\n芜湖，爆出来了cdef,\n这题其实直接dirsearch直接能扫出来，可能考点在only_real_revenge吧，我们那题再见\n5.only_real_revenge\n同上一题思路一样，用图片马尝尝咸淡，抓包再改回php，同时把伪造JWT传上\n访问直接出flag啦\n6.DXT\n本体环境是一个“MCP 工具包管理后台”，它平时做的事是：\n你上传一个 .dxt 包\n它解开这个包\n读取里面的 manifest.json（相当于说明书）\n按说明书里的内容，把这个 MCP server 启动起来\n然后问它：\n“你有什么工具可以给我展示？”\n在 MCP (Model Context Protocol) 的语境下，.dxt 文件代表的是 Desktop Extension（桌面扩展）。\n简单来说，它就像是给 AI 助手（如 Claude Desktop）准备的“一键安装包”。\n1. .dxt 文件到底是什么？\n本质上，一个 .dxt 文件就是一个压缩包（ZIP 格式），它把一个 MCP 服务器运行所需的所有东西都打包在了一起。它的结构通常包含：\nmanifest.json：这是整个扩展的“大脑”，告诉 AI 这个工具有什么功能、叫什么名字、需要怎么启动。\n服务器代码：比如 Node.js 或 Python 编写的工具逻辑。\n依赖项：运行这些代码需要的库文件。\n2. 它在 MCP 里面是用来做什么的？\n在没有 .dxt 之前，如果你想给你的 Claude 增加一个“搜索本地文件”或者“操作数据库”的功能（即安装一个 MCP Server），你通常需要：\n安装 Node.js 或 Python 环境。\n手动修改复杂的 config.json 配置文件。\n处理各种环境变量和路径问题。\n有了 .dxt 文件后：\n一键安装：你只需要把这个 .dxt 文件拖进支持 MCP 的客户端（比如 Claude Desktop），它就自动装好了。\n封装环境：它解决了“在我电脑上能跑，在你那里报错”的问题，把环境依赖都打包好了。\n自动配置：它会自动在后台帮你写好配置，不需要你手动去翻文件夹改 JSON。\n3. 注意：它正在变身\n虽然你现在看到的是 .dxt，但根据最新的标准，这个格式正在演变为 .mcpb (MCP Bundle)。它们的作用是一样的，都是为了让非技术用户也能像安装 Chrome 插件一样，轻松地给 AI 增加新技能。\n总结一下：\n如果你正在折腾 MCP 相关的开发，.dxt 就是你的发布工具；如果你只是使用者，它就是你的安装包。\n这道题真的学到好多\n用dirsearch扫描1\u0026gt;发现网站的后端很可能是 Go 语言写的，因为pprof是GO程序常见的性能分析/调试工具简单说，开发者本来是拿它来：\n看程序占了多少内存\n看程序开了多少并发线程\n看程序运行时在干什么\n2\u0026gt;/debug/pprof/heap\n这个是看内存使用情况的。\n/debug/pprof/trace\n这个是更细的运行轨迹。\n/health、/ping\n这两个一般是健康检查接口。\n/metrics\n这个一般是监控指标接口。\n很多程序会把：\n请求数量\n响应时间\n内存占用\nCPU 使用情况\n这种数据放在这里，给 Prometheus 之类的监控系统抓取。\n/static/\n这一般表示静态资源目录，比如：\n图片\nCSS\nJS\n前端文件\n2\u0026gt;状态码:\n200-访问成功\n301-跳转\n403-禁止访问\n404-资源不存在\n405-方法不允许\n3\u0026gt;按照GPT给的优先级，先访问/debug/pprof\nallocs\n历史内存分配情况\n可以理解成：过去内存都分给谁用了。\nheap\n当前还活着的内存对象\n就是现在内存主要被谁占着。\ngoroutine\n当前所有 goroutine 的堆栈信息\n也就是程序当前“并发任务”的运行现场。\nthreadcreate\n程序创建系统线程的情况\n可以理解成程序开过哪些更底层的线程。\nblock\n看哪些地方发生了阻塞\n比如某些操作卡住了。\nmutex\n看锁竞争情况\n就是多个地方抢同一把锁。\ntrace\n程序运行轨迹\n像更细的运行录像。\ncmdline\n程序启动命令\n也就是这个程序启动时是怎么运行起来的。\nsymbol\n把地址映射成函数名\n偏底层，一般是给分析工具用的。\n参考佬的WP：\n分析前端源码，这页前端本质上就是一个“上传包 → 查看服务列表 → 启停/删除服务 → 查看服务详情”的管理面板；真正有价值的攻击面几乎都集中在它调用的那几个 /api/* 接口上，而不是页面样式本身。\n前端唯一的“文件合法性检查”，就是看文件名后缀是不是 .dxt\n然后就是codex帮着写的exp和伪造的.dxt文件了\n就做出来这么多题，这几天也参加了几个出色的CTF战队的面试，在AGENT时代，想要担任一名合格的WEB手 还是要有比较坚实的基础，让自己变得更强和让AGENT更强并不冲突，加油\n","date":"2026-04-08T14:30:00+08:00","image":"/post/polaris-ctf-web/cover.jpg","permalink":"/post/polaris-ctf-web/","title":"Polaris CTF 招新赛 Web 方向复盘"},{"content":"你好 这是我用 Hugo + Stack 搭建的第一篇文章。\n","date":"2026-03-31T19:00:00+08:00","permalink":"/post/first/","title":"我的第一篇博客"}]