解读前端js中签名算法伪造H5游戏加分逻辑攻击
字数 1420 2025-08-20 18:18:23

前端JS签名算法伪造与H5游戏加分逻辑攻击分析

1. 攻击背景与概述

本文详细分析了一种针对H5游戏的分数篡改攻击方法,攻击者通过逆向前端JavaScript代码,伪造签名算法,成功实现了游戏分数的非法增加。这种攻击方式属于典型的客户端安全漏洞,暴露了仅依赖前端验证的安全风险。

2. 攻击步骤详解

2.1 初步分析

  1. 目标识别:选择一个数钱类H5游戏作为目标
  2. 开发工具使用:通过浏览器F12开发者工具查看前端JS代码
  3. 技术栈识别:确认前端使用Vue.js开发,Webpack打包,代码经过混淆压缩

2.2 网络请求分析

  1. 抓包工具:使用Fiddler捕获游戏过程中的网络请求
  2. 关键接口:发现分数提交接口:
    POST https://testgame.xxxx.cn/api/services/app/Game/AddGameScore
    
  3. 请求头分析
    • 使用Bearer Token认证
    • Content-Type: application/json

2.3 代码逆向

  1. JS美化:对混淆的JS代码进行格式化处理
  2. 接口搜索:在JS文件中搜索"AddGameScore"关键词,发现两处引用
  3. 参数分析
    • 发现scoreUrl标识
    • 请求参数包含4个字段,其中第二个为游戏分数
    • 第三个参数s是一个签名值,由MD5哈希生成

2.4 签名算法破解

签名算法公式:

s = MD5(分数 + "|" + accessToken的第二部分 + "|" + windows.pubParams.id)

具体步骤:

  1. 从Authorization头中提取accessToken:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54...rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA
    
  2. 取accessToken以"."分割的第二部分
  3. 通过控制台获取windows.pubParams.id值为1626
  4. 示例签名计算:
    输入:2000|rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA|1626
    MD5结果:c0cd28260b42bc14808689782151e112
    

2.5 攻击实施

构造恶意请求:

POST https://xxxx.cn/api/services/app/Game/AddGameScore HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8v...
Content-Type: application/json

{
  "score": 2000,
  "s": "c0cd28260b42bc14808689782151e112",
  // 其他必要参数
}

2.6 重放攻击

攻击者可重复发送相同请求实现分数多次增加,通过Fiddler工具批量发送约20次请求,成功刷分至排行榜第一。

3. 漏洞原理分析

  1. 签名算法暴露:签名逻辑完全暴露在前端,可被逆向
  2. 缺乏时效性验证:签名没有时间戳,允许重放攻击
  3. 关键参数可预测:windows.pubParams.id等参数容易获取
  4. 无服务端二次验证:仅依赖前端提交的签名验证

4. 防御方案

4.1 防止重放攻击

  1. 时间戳机制

    • 签名加入timestamp参数
    • 服务端验证时间窗口(如±5分钟)
    • 示例:微信支付的时间戳验证机制
  2. 序号机制

    • 通信双方维护序列号
    • 每次请求序列号递增
  3. 挑战-应答机制

    • 服务端下发随机nonce
    • 客户端应答需包含nonce或f(nonce)

4.2 服务端增强

  1. 业务规则限制

    • 分数增加频率限制
    • 单次分数增幅上限
    • 总分合理范围校验
  2. 风控系统

    • 异常行为检测
    • 用户行为分析
  3. 接口限流

    • IP/用户频率限制
    • 滑动窗口算法实现
  4. 验证码

    • 高频操作引入行为验证码
    • 关键操作二次确认

4.3 前端加固

  1. 代码混淆加强

    • 使用UglifyJS2进行属性名混淆
    • 控制流扁平化
    • 字符串加密
  2. 环境检测

    • 浏览器指纹验证
    • 调试工具检测
  3. 关键逻辑隐藏

    • 将敏感计算移至Web Worker
    • 使用WebAssembly实现核心算法

5. 总结与建议

  1. 安全原则

    • 永远不要信任客户端提交的数据
    • 关键逻辑必须在服务端验证
    • 最小化暴露给客户端的信息
  2. 开发建议

    • 安全设计应贯穿整个开发周期
    • 定期进行安全审计和渗透测试
    • 关注OWASP等安全组织的建议
  3. 应急响应

    • 建立漏洞响应机制
    • 关键系统准备热修复方案
    • 日志记录和审计追踪

通过本案例可以看出,仅依赖前端的安全措施是极其脆弱的。开发者必须建立纵深防御体系,结合前后端多种防护手段,才能有效防范此类攻击。

前端JS签名算法伪造与H5游戏加分逻辑攻击分析 1. 攻击背景与概述 本文详细分析了一种针对H5游戏的分数篡改攻击方法,攻击者通过逆向前端JavaScript代码,伪造签名算法,成功实现了游戏分数的非法增加。这种攻击方式属于典型的客户端安全漏洞,暴露了仅依赖前端验证的安全风险。 2. 攻击步骤详解 2.1 初步分析 目标识别 :选择一个数钱类H5游戏作为目标 开发工具使用 :通过浏览器F12开发者工具查看前端JS代码 技术栈识别 :确认前端使用Vue.js开发,Webpack打包,代码经过混淆压缩 2.2 网络请求分析 抓包工具 :使用Fiddler捕获游戏过程中的网络请求 关键接口 :发现分数提交接口: 请求头分析 : 使用Bearer Token认证 Content-Type: application/json 2.3 代码逆向 JS美化 :对混淆的JS代码进行格式化处理 接口搜索 :在JS文件中搜索"AddGameScore"关键词,发现两处引用 参数分析 : 发现scoreUrl标识 请求参数包含4个字段,其中第二个为游戏分数 第三个参数s是一个签名值,由MD5哈希生成 2.4 签名算法破解 签名算法公式: 具体步骤: 从Authorization头中提取accessToken: 取accessToken以"."分割的第二部分 通过控制台获取 windows.pubParams.id 值为1626 示例签名计算: 2.5 攻击实施 构造恶意请求: 2.6 重放攻击 攻击者可重复发送相同请求实现分数多次增加,通过Fiddler工具批量发送约20次请求,成功刷分至排行榜第一。 3. 漏洞原理分析 签名算法暴露 :签名逻辑完全暴露在前端,可被逆向 缺乏时效性验证 :签名没有时间戳,允许重放攻击 关键参数可预测 :windows.pubParams.id等参数容易获取 无服务端二次验证 :仅依赖前端提交的签名验证 4. 防御方案 4.1 防止重放攻击 时间戳机制 : 签名加入timestamp参数 服务端验证时间窗口(如±5分钟) 示例:微信支付的时间戳验证机制 序号机制 : 通信双方维护序列号 每次请求序列号递增 挑战-应答机制 : 服务端下发随机nonce 客户端应答需包含nonce或f(nonce) 4.2 服务端增强 业务规则限制 : 分数增加频率限制 单次分数增幅上限 总分合理范围校验 风控系统 : 异常行为检测 用户行为分析 接口限流 : IP/用户频率限制 滑动窗口算法实现 验证码 : 高频操作引入行为验证码 关键操作二次确认 4.3 前端加固 代码混淆加强 : 使用UglifyJS2进行属性名混淆 控制流扁平化 字符串加密 环境检测 : 浏览器指纹验证 调试工具检测 关键逻辑隐藏 : 将敏感计算移至Web Worker 使用WebAssembly实现核心算法 5. 总结与建议 安全原则 : 永远不要信任客户端提交的数据 关键逻辑必须在服务端验证 最小化暴露给客户端的信息 开发建议 : 安全设计应贯穿整个开发周期 定期进行安全审计和渗透测试 关注OWASP等安全组织的建议 应急响应 : 建立漏洞响应机制 关键系统准备热修复方案 日志记录和审计追踪 通过本案例可以看出,仅依赖前端的安全措施是极其脆弱的。开发者必须建立纵深防御体系,结合前后端多种防护手段,才能有效防范此类攻击。