关于 WindGods-CTF
AboutWindGods-CTF 是一个自托管的网络安全竞赛平台:赛事组织、题目托管、动态靶机、 Writeup 强制提交与实时排行榜都在同一个进程里完成。 不依赖任何外部 CDN、前端框架或第三方统计 —— 所有资源同源加载,整套系统由 Python 标准库 + Flask 撑起,部署只需要一台能跑 Python 的机器。
Flask
SQLite (WAL)
Server-Sent Events
零外部依赖前端
$ pip install -r requirements.txt
$ python app.py --port 8000
[*] WindGods-CTF 已启动 → http://127.0.0.1:8000
[*] 初始管理员密码写入 data/INITIAL_ADMIN.txt
$
平台能力
赛事组织
按时间窗口编排赛事,支持公开/内部、开启/关闭状态切换,题目可归属到赛事。
题目管理
静态 flag 与正则匹配两种判定方式,动态分值、附件上传、提示分级、尝试次数限制。
动态靶机
固定靶机直接暴露 host:port;动态靶机通过带签名的 HTTP 接口按需下发与回收实例。
Writeup 强制
可为每道题单独开启「强制 WP」,未交者暂不计分,退交后自动回退状态。
实时排行
SSE 长连接推送全量快照,版本号驱动,十人在线也只有一次查询。
队伍协作
邀请码组队、队长审核成员、队伍锁定,个人榜与队伍榜自由切换。
后台管理
用户/角色/封禁/改密、队伍、提交流水、文件库、公告、站点设置、审计日志。
题目审计
flag 明文查看、附件上传、WP 下载等敏感动作全部落审计日志。
安全设计
- flag 双写存储 —— 数据库里只留 SHA256 哈希用于比对, 另存一份用主密钥加密的副本供管理员查看;即使数据库被拖走,明文 flag 也无法直接还原。
- 全站 CSRF 防护 —— 每个会话独立令牌,所有非 GET 请求都要在 表单字段、请求头或 JSON body 里带上它,比对使用常量时间函数。
- 严格的 Cookie 策略 —— HttpOnly + SameSite=Lax, 会话 12 小时滑动过期,退出登录时整块清空。
- 上传即隔离 —— 扩展名白名单、随机落盘名、上传目录之外一律不可达; 取文件时用 realpath 二次校验,杜绝路径穿越。
- 越权防护 —— 题目可见性、Writeup 下载、附件读取、 靶机启停都会先校验归属与角色,隐藏题目与未开始赛事的题目对选手完全不可见。
- 爆破限流 —— 登录按 IP 滑窗计数,flag 提交按账号限频, 错误答案带冷却时间,且提交记录全部留痕。
- 输出编码 —— 模板默认转义,题目描述与公告走「先整体转义、 再解析 Markdown 子集」的渲染管线,链接协议白名单挡掉伪协议。
- 收紧的 CSP ——
script-src 'self', 连主题初始化脚本都单独成文件,页面里没有一处内联脚本。 - 密钥与数据分离 —— 会话密钥与 flag 密钥首次启动随机生成到
data/下,权限 600,不进版本库。
公平竞赛
本站仅用于授权范围内的技能训练与内部演练。请勿对未授权的目标使用从本站学到的技术, 也不要尝试攻击本站自身。发现漏洞欢迎通过管理员联系方式报告。