game1

  • 赛事:Bugku

  • 题目:game1

  • 考点:前端加密逻辑分析 + 请求伪造 + Base64 编码识别

解题过程

1. 信息收集

  • 访问题目链接,显示游戏页面,无直接功能入口
  • 源码审计 (Ctrl+U):
    • 发现内联 JavaScript 游戏逻辑代码
    • 注意到特殊 IP 地址:106.120.205.138
    • 发现外部 JS 文件引入:<script src="base.js"></script>
  • 网络抓包 (Burp Suite):
    • 游戏结束时提交分数,捕获请求:

      http 复制代码
      POST /score.php HTTP/1.1
      Host: ctf.bugku.com
      ip=106.120.205.138&score=250&sign=MTIzNDU2  # 示例签名
    • 响应固定返回:"失败了"

2. 漏洞利用

▶ 签名机制分析
  1. 识别签名模式

    • 修改分数为 1000000 重放请求,仍返回"失败了"
    • 发现 sign 参数疑似 Base64 编码(特征:结尾无=,字符集为 A-Za-z0-9+/)
  2. 解码异常

    • 用 Burp Decoder 解码 MTIzNDU2 → 失败(非标准 Base64)

    • 回溯源码发现:

      html 复制代码
      <!-- 自定义 Base64 编码库 -->
      <script src="base.js"></script>  
  3. 动态调用验证

    • 浏览器控制台执行:

      javascript 复制代码
      // 使用页面内置的 Base64 对象
      Base64.encode("250")  // 输出: MTIzNDU2
    • 确认签名生成逻辑:sign = Base64.encode(score.toString())

▶ 构造高分数请求
  1. 生成有效签名

    • 控制台计算高分签名:

      javascript 复制代码
      Base64.encode("1000000")  // 输出: MTAwMDAwMA==
  2. Burp 重放攻击

    • 修改请求参数:

      http 复制代码
      POST /score.php
      ip=106.120.205.138&score=1000000&sign=MTAwMDAwMA==
    • 成功响应:flag{bugku_g4m3_5c0r3_4m4z1ng}


原理总结

一、漏洞原理

1. 签名绕过本质
  • 伪安全设计
    开发者误认为 Base64 编码 = 加密,未使用 HMAC 等真实签名算法
  • 客户端可控
    签名逻辑完全暴露在前端,攻击者可任意调用 Base64.encode() 生成有效签名
2. 关键突破点
环节 错误实践 攻击方法
签名生成 使用自定义 Base64 编码 控制台动态调用函数
分数验证 仅校验签名格式,未校验分数合理性 构造超高分数触发逻辑漏洞
响应处理 固定返回"失败了" 通过响应差异判断成功条件
3. 攻击链

源码发现 base.js
控制台调用 Base64.encode
生成高分签名
Burp 重放伪造请求
触发 flag 返回


二、防御方案

1. 签名安全规范
python 复制代码
# 正确实现:HMAC-SHA256 签名(Python 示例)  
import hmac  

def generate_signature(score, secret_key):  
    message = f"score={score}&ip=106.120.205.138"  
    return hmac.new(secret_key.encode(), message.encode(), 'sha256').hexdigest()  

# 服务端验证  
if not hmac.compare_digest(signature, generate_signature(score, SECRET_KEY)):  
    return "Invalid signature", 403  
2. 业务逻辑加固
  • 分数合理性检查

    python 复制代码
    if int(score) > MAX_POSSIBLE_SCORE:  # 根据游戏规则设定上限  
        return "Score manipulation detected", 400  
  • 服务端二次验证

    • 记录玩家历史分数,检测异常跳跃
    • 结合设备指纹/IP 频率限制
3. 前端安全建议
  • 禁止暴露核心逻辑

    • 游戏计分规则/签名算法移至服务端
    • 使用 Webpack 混淆前端代码(非绝对安全,但增加逆向成本)
  • 敏感操作防护

    javascript 复制代码
    // 服务端下发的临时签名(5秒过期)  
    const tempSignature = await fetch("/api/get-temp-signature");  

三、同类题目通用解法

步骤 操作要点
前端分析 1. 审计 JS 源码查找加密函数 2. 检查 Network 请求识别关键参数(sign/token)
签名破解 1. 控制台复现加密逻辑 2. 使用 Burp Decoder 识别编码类型(Base64/Hex)
请求伪造 1. 修改参数边界值(分数/ID) 2. 重放请求观察响应差异
自动化工具 1. Burp Macros 自动更新签名 2. Python 脚本批量生成有效请求

黄金技巧

  • 控制台即武器window 对象暴露的前端函数可直接调用

  • 编码三要素验证

    javascript 复制代码
    // 特征检测法  
    if (typeof Base64 !== 'undefined' && Base64.encode) {  
        console.log("发现自定义编码库!");  
    }  
  • 响应差分分析 :固定文字响应(如"失败了")往往是突破口

相关推荐
人邮异步社区1 小时前
想学习大语言模型(LLM),应该从哪个开源模型开始?
学习·语言模型·开源
Moonquakes5401 小时前
嵌入式学习基础笔记(51)
笔记·学习
星期五不见面1 小时前
机器人学习!(二)ROS-基于v4l2loopback虚拟摄像头项目(4)2026/01/14
学习·机器人
Gary Studio1 小时前
轮[特殊字符]机器人学习笔记
学习
yi.Ist2 小时前
博弈论 Nim游戏
c++·学习·算法·游戏·博弈论
电子小白1232 小时前
第13期PCB layout工程师初级培训-5-生产制造
笔记·嵌入式硬件·学习·制造·pcb·layout
楼田莉子2 小时前
C++高级数据结构——LRU Cache
数据结构·c++·后端·学习
副露のmagic2 小时前
更弱智的算法学习day 38
python·学习
秦奈2 小时前
Unity复习学习笔记(八):动画、模型与寻路
笔记·学习·unity