AliCTF 2026 Web - next-challenge · React2Shell 机制梳理

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 日期: 2026-02-05 / 环境: http://223.6.249.127:28433 / 技术栈: Node.js v20.19.6 alpine x64, Next.js 16.0.6 dev, React 19.2.0 / 题目类型: Web, 500 pts / 结论 通过 React Flight 反序列化触发 server reference,加上 Hello() 的模板字符串 toString sink,实现了不依赖 constructor/__proto__/prototype 的 RCE,最终读取 flag:
Read more

AliCTF 2026 Crypto - Griffin

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX Griffin 这题的关键是 Phase1 恢复的 $x$ 存在仿射不确定性,导致 Phase2 求根得到的是 $x = a m + b$ 而不是 $m$,需要对 $(a,b)$ 做 affine 枚举。 / 结论 flag: alictf{**} 关键坑点: Phase1 恢复的 $x$ 存在仿射不确定性,导致 Phase2 求根得到的是 $x = a m + b$ 而非 $m$,必须做 affine 枚举,最终命中 $(a,b)=(-1,256)$ Full solve code (gist) 复现参数 以下数值来自一次成功复现的检查点和附件内容:
Read more
February 3, 2026

AliCTF 2026 线上赛 Web - staircase

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 这题最终落地利用点是 MapDB 的 linked record:把 payload 分散种在多段 icon 记录里,再通过极少量元数据 patch 把 “icon” 指向链表头,最后 GET /files/icon 触发 Serializer.JAVA 反序列化完成 RCE。 / 题目信息 题目:staircase 分值:500 目标:拿到 flag{...}(flag 文件位于容器根目录 /flag-<random>.txt) 远程:题面端口会变更,需要以最新为准(本文最终打通的是 tcp *.*.*.*:*,HTTP 服务) hint: 远程环境不出网 MapDB 支持“链表式”记录(linked record)存储/读取,用于巨型记录 最终结论 本地已打通 本题最终落地利用链不再依赖“用受限写原语合成任意字节串”,而是:
Read more

N1CTF Junior 2026 1/2

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 解了几道分数较高的题目,部署后继续修复公式渲染(theme/模板问题)。 / AstralCat 服务端每轮随机 99 字节 message,用 Luo Shu 做 CBC。关键点是同一个对象连续调用两次 Encrypt(),第二次加密的输入其实是第一次的密文。
Read more

XCTF Lilac 2026 Writeup

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 整理版汇总:按仓库内文档与脚本串主线,每题只保留关键思路和 exp 核心片段(截图已脱敏)。 / 整理说明 本文按仓库内文档与脚本整理,每题只保留解题主线与 exp 核心片段。 文中用 HOST:PORT 代替真实地址,flag 统一写为 LilacCTF{...},不包含外链 URL 与真实 IP。
Read more

XCTF Lilac - launchpad

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX XCTF Lilac 的 Solana/Anchor misc。核心是 ClaimRequest 与 Faucet 绑定关系校验缺失,并结合 no_pda=true 的绕过手法,最终一次性把 vault 清空。 / 题目附件:/_p/67efe178c3919b1ea379da0869983aa081d7769aaac76d1a073926a489beca49.tar.gz / 题目信息 类型:Solana / Anchor(misc) 远程:1.95.144.176:9990 交互:PoW → 上传 solve.so → 提交 Vec<Instruction>(服务端只用 user 一把私钥签名交易) 目标:让 ATA(global_pda, fee_mint)(同时也是 faucet vault)余额变成 0,服务端打印 flag 这题本质是一个 “ClaimRequest 与 Faucet 绑定关系校验缺失” 的逻辑漏洞:程序只验证 ClaimRequest 的 PDA 是正确的,但没有验证 ClaimRequest 属于当前正在处理的 faucet,导致可以用“别的 faucet 的 ClaimRequest”去领“当前 faucet 的钱”。
Read more