HolyTreasure 靶场破解教学文档


—— 软件激活系统的攻与防

适用对象:网络安全初学者 / CTF 新生训练
靶场地址:http://activation_system.holytreasure.cn
系统特点:64位随机激活码 + 数据库状态管理 + 无加密密钥逻辑


🔍 一、靶场目标

  • 核心任务:在未获得合法激活码的情况下,成功“激活”软件。
  • 学习目标
    • 理解授权验证的基本流程
    • 掌握常见 Web 漏洞利用方法
    • 学会从攻击中反推防御措施

🧩 二、系统正常流程回顾

  1. 管理员生成激活码

    GET /api/activation/generate.php?product=GAME&email=test@holytreasure.cn
    → 返回 64 位字符串(如 A1B2...z9)
  2. 用户提交激活码

    POST /api/activation/verify.php
    {"activation_key": "A1B2...z9"}
    → 成功返回产品信息,状态变为“已激活”
  3. 数据库记录状态

    • status = 'unused' → 可激活
    • status = 'activated' → 已使用,拒绝再次激活

💥 三、可尝试的破解路径(教学实验)


实验 1️⃣:暴力探测有效激活码(低效但原理重要)

📌 原理

虽然 64 位随机码空间极大(62⁶⁴ ≈ 10¹¹⁵),但若系统存在信息泄露,可缩小搜索范围。

🔍 观察点

  • /verify.php 提交:
    • 无效格式(如 63 字符)→ 返回什么?
    • 随机 64 字符 → 返回是否区分“不存在” vs “已使用”?

✅ 预期发现

  • 所有失败均返回 { "error": "Key not available" }
    无信息泄露,无法探测

🛡️ 防御启示

统一错误信息 是防止密钥枚举的关键!


实验 2️⃣:重放攻击(Replay Attack)

📌 原理

截获一个已激活但有效的请求,重复发送,看能否绕过“一次性使用”限制。

🛠️ 操作步骤

  1. 正常生成并激活一个密钥(记录请求)
  2. 使用 Burp Suite / curl 重复发送相同 POST /verify.php 请求

✅ 预期结果

  • 第二次请求返回 Key not available
    → 因数据库状态已更新为 activated

⚠️ 若成功?说明什么?

  • 数据库更新未加锁(并发漏洞)
  • 未使用事务或 WHERE status='unused' 条件

🛡️ 防御启示

原子性更新UPDATE ... WHERE status='unused')是防重放的核心!


实验 3️⃣:SQL 注入获取未使用密钥

📌 前提假设

如果 verify.php 未使用预处理语句(即拼接 SQL),可能存在注入。

🔍 测试 payload

{ "activation_key": "' OR '1'='1' -- " }

✅ 预期结果(理想情况)

  • 系统使用 PDO + 预处理 → 注入失败
  • 返回错误或 Key not available

💣 若成功?

  • 可能直接激活任意产品
  • 或通过 UNION SELECT 泄露未使用密钥

🛡️ 防御启示

永远使用参数化查询(Prepared Statements)!


实验 4️⃣:直接访问数据库(服务器入侵场景)

📌 场景

攻击者通过其他漏洞(如文件上传、弱口令)进入服务器,读取数据库。

🛠️ 操作

  1. 登录服务器(假设已 getshell)
  2. 查看 MySQL 数据:
    SELECT activation_key FROM activation_keys WHERE status='unused';
  3. 直接复制密钥用于激活

✅ 预期结果

  • 无需破解,直接盗用
  • 这是最现实的攻击方式之一

🛡️ 防御启示

系统安全 = 最弱环节的安全。即使激活逻辑完美,服务器被黑仍会沦陷!


实验 5️⃣:前端绕过(仅限有客户端逻辑时)

⚠️ 当前靶场无客户端验证,此实验为扩展思考。

📌 假设

如果软件在本地检查 status == 'success',但未联网验证。

🛠️ 操作

  • 修改本地响应包(Burp Suite)
  • {"error": ...} 改为 {"status":"success", ...}

🛡️ 防御启示

客户端不可信!所有关键逻辑必须在服务端闭环。


🧪 四、进阶挑战(CTF 风格)

挑战 目标
Challenge 1 在不生成新密钥的情况下,激活 VIP_PRODUCT
Challenge 2 找出系统是否存在“永不过期”的测试密钥
Challenge 3 利用时间竞争(Race Condition)激活同一密钥两次

💡 提示:检查 generate.php 是否有硬编码测试密钥?expires_at 是否可被操控?


🛡️ 五、防御总结(给开发者的 checklist)

安全实践 是否实现
✅ 激活码足够随机(≥64位) ✔️
✅ 一次性使用 + 原子更新 ✔️
✅ 统一错误信息,防探测 ✔️
✅ 使用参数化查询防 SQL 注入 ✔️
✅ 强制 HTTPS(防中间人窃听) ❌(教学环境可忽略)
✅ 服务端验证,无客户端逻辑 ✔️
✅ 服务器安全加固(防 DB 泄露) ❌(需运维配合)

📚 六、教学建议

  • 分组对抗:一组扮演攻击者,一组扮演开发者修补漏洞
  • 日志分析:开启访问日志,让学生分析异常请求
  • 扩展实验:故意在代码中埋一个漏洞(如 sleep(1) 时间差异),让学生做侧信道攻击

🎓 记住:没有绝对安全的系统,只有不断演进的攻防对抗。
本靶场旨在帮助你理解——安全不是功能,而是思维方式。


📘 HolyTreasure 靶场 · 网络安全教学专用
🔗 官网:http://activation_system.holytreasure.cn
📧 联系:admin@holytreasure.cn(仅限教学用途)


如需配套的 漏洞版本代码(如带 SQL 注入的 verify_bad.php)或 Docker 靶场镜像,可向管理员申请。


开源免费、私有部署、无用户限制:小猫考试,为企业打造安全高效的在线考试平台

HolyTreasure 靶场

评 论