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