信息安全在我们日常开发中息息相关,稍有忽视则容易产生安全事故。对安全测试也提出更高要求。以下是笔者亲自实践过程:

一. 打开某个数钱游戏HTML5页面,在浏览器 F12 开发工具中,查看的js,如下,都压缩混淆:

如上分析是Vue.js开发的前端,Webpack打包

二. 玩游戏,通过fiddler抓包,分析分数相关请求

HTTP RAW详细报文如下:

POST https://testgame.xxxx.cn/api/services/app/Game/AddGameScore HTTP/1.1

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI2MCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJ7XCJVc2VyTmFtZVwiOlwiMTc4NDQ1NDk2MTdcIixcIkhlYWRJbWd1cmxcIjpudWxsLFwiTmlja05hbWVcIjpcIjE3ODQ0NTQ5NjE3XCIsXCJT2XhcIjowfSIsInN1YiI6IjI2MCIsImp0aSI6IjE4MzNiYTUzLWJiYjQtNGE4Yi1hNDFmLWEzNjQ2MjU1YThiMSIsImlhdCI6MTU4MTY0NzYzMywibmJmIjoxNTgxNjQ3NjMzLCJleHAiOjE1ODE3MzQwMzMsImlzcyI6IlZQSG9ybm9yIiwiYXVkIjoiVlBIb3Jub3IifQ.rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

Accept: */*

Accept-Language: zh-CN

Content-Type: application/json

Content-Length: 87

Expect: 100-continue

Connection: Keep-Alive

{"id":1626,"gamescore":60,"s":"c0cb28260b42bc14808689782151e112","invitationCode":""}

HTTP/1.1 200 OK

Server: openresty/1.13.6.2

Date: Fri, 14 Feb 2020 03:54:48 GMT

Content-Type: application/json; charset=utf-8

Connection: keep-alive

Access-Control-Allow-Origin: *

X-Content-Type-Options: nosniff

X-XSS-Protection: 1; mode=block

X-Frame-Options: SAMEORIGIN

Content-Length: 206

{"result":{"isWin":true,"score":5,"currentScore":43,"bestScore":43,"bestRank":3,"dayLotteryCount":98,"winningId":0},"targetUrl":null,"success":true,"error":null,"unAuthorizedRequest":false,"__abp":true}

三. 从抓包结果字面AddGameScore 意思,分析是增加游戏分数用关键字AddGameScore,在加载js文件中搜索, js可以先美化

http://xxxx.cn/js/chunk-2c4ee547.c5d8aab9.js

在文件chunk-2c4ee547.c5d8aab9.js中 搜索AddGameScore,第一处

第二处

Webpack可以混淆前端js代码,但不可能混淆后端接口地址。

从以上2处搜索,AddGameScore是后台接口, 我们看到 scoreUrl 标识,再次搜索scoreUrl,

对做过前端vue开发同学,看到代码如上这是一个发请求的地方,参数也看到分别是4个,第二个gamescore分数,第三个参数s不明白,但看Value是三元表达式, 看值n是 accessToken, 计算方式是Md5的哈希,算法是:

t分数+"|"+accessToken的按.拆分第2个元素+"|"+windows.pubParams.id

我们去控制台 执行下 windows.pubParams.id 得到 1626

从之前抓包请求中,分析access token 是访问token,accessToken的按.拆分第2个元素,如下加粗

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI2MCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJ7XCJVc2VyTmFtZVwiOlwiMTc4NDQ1NDk2MTdcIixcIkhlYWRJbWd1cmxcIjpudWxsLFwiTmlja05hbWVcIjpcIjE3ODQ0NTQ5NjE3XCIsXCJT2XhcIjowfSIsInN1YiI6IjI2MCIsImp0aSI6IjE4MzNiYTUzLWJiYjQtNGE4Yi1hNDFmLWEzNjQ2MjU1YThiMSIsImlhdCI6MTU4MTY0NzYzMywibmJmIjoxNTgxNjQ3NjMzLCJleHAiOjE1ODE3MzQwMzMsImlzcyI6IlZQSG9ybm9yIiwiYXVkIjoiVlBIb3Jub3IifQ.rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA


四. 伪造HTTP的加分请求

请求参数s的值是

2000|rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA|1626

在网站加密https://md5jiami.51240.com/

s的值是c0cd28260b42bc14808689782151e112, 最后我们成功 加分2000,如下 HTTP RAW

POST https://xxxx.cn/api/services/app/Game/AddGameScore HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI2MCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJ7XCJVc2VyTmFtZVwiOlwiMTc4NDQ1NDk2MTdcIixcIkhlYWRJbWd1cmxcIjpudWxsLFwiTmlja05hbWVcIjpcIjE3ODQ0NTQ5NjE3XCIsXCJTZXhcIjowfSIsInN1YiI6IjI2MCIsImp0aSI6IjE4MzNiYTUzLWJiYjQtNGE4Yi1hNDFmLWEzNjQ2MjU1YThiMSIsImlhd4I6MTU4MTY0NzYzMywibmJmIjoxNTgxNjQ3NjMzLCJleHAiOjE1ODE3MzQwMzMsImlzcyI6IlZQSG9ybm9yIiwiYXVkIjoiVlBIb3Jub3IifQ.rArdySnm5mCiYrm_QanbGZE50Aw6PQINOvCZl7FQ3KA
Accept: */*
Accept-Language: zh-CN
Accept-Encoding: GZIP
Content-Type: application/json
Expect: 100-continue
Connection: Keep-Alive

{"id":1626,"gamescore":2000,"s":"c0cd28260b42bc14808689782151e112","invitationCode":""}

HTTP/1.1 200 OK

Server: openresty/1.13.6.2
Date: Fri, 14 Feb 2020 02:51:04 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

{"result":{"isWin":true,"score":5,"currentScore":2000,"bestScore":2000,"bestRank":1,"dayLotteryCount":99,"winningId":0},"targetUrl":null,"success":true,"error":null,"unAuthorizedRequest":false,"__abp":true}

我们看到HTTP Response 的JSON返回 currentScore:2000, 我们成功为这个游戏增加了2000分

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

并可以重复请求HTTP,replay的攻击,如下图来自fiddler工具

以约20个HTTPS请求是成功

最近在游戏排行版,上版第一名,被成功刷分2000分

解决方案:

1. 防止Replay攻击。前后端签名逻辑加入时间戳timestamp, 验签核对时间范围内timestamp,需要前端配合修改。

增加攻击难度。 如微信的https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

时间戳

“时戳”──代表当前时刻的数

基本思想──A接收一个消息当且仅当其包含一个对A而言足够接近当前时刻的时戳

原理──重放的时戳将相对远离当前时刻

时钟要求──通信各方的计算机时钟保持同步

处理方式──设置大小适当的时间窗(间隔),越大越能包容网络传输延时,越小越能防重放攻击

适用性──用于非连接性的对话(在连接情形下双方时钟若偶然出现不同步,则正确的信息可能会被误判为重放信息而丢弃,而错误的重放信息可能会当作最新信息而接收)

还有两种方法Replay攻击

序号

通信双方通过消息中的序列号来判断消息的新鲜性

要求通信双方必须事先协商一个初始序列号,并协商递增方法

提问与应答

“现时”──与当前事件有关的一次性随机数N(互不重复即可)

基本做法──期望从B获得消息的A 事先发给B一个现时N,并要求B应答的消息中包含N或f(N),f是A、B预先约定的简单函数

原理──A通过B回复的N或f(N)与自己发出是否一致来判定本次消息是不是重放的

时钟要求──无

适用性──用于连接性的对话

2. 服务端业务逻辑规则限制来防范,向上就是整个平台风控管理

3. HTTP接口限流,禁止单个用户/ip频繁请求同对接口

4. 单个用户频繁请求,使用行为验证码验证一起提交

5. 前端UglifyJS2提高混淆,使用属性混淆,详细参考

https://github.com/mishoo/UglifyJS2#cli-mangling-property-names---mangle-props

效果如下

总结

对于做过软件开发的工程师,浏览器分析前端代码与抓取HTTP请求分析服务端请求,来伪造请求 加分已不是难事。前端,服务端安全防范,Web安全测试 任重道远。


今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:
领导人怎样带领好团队
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变

如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。

解读前端js中签名算法伪造H5游戏加分的更多相关文章

  1. 关于javaBean中boolean类型变量的set和get注入后传到前端JS中的问题

    set和get方法如下: public boolean isLine() {        return isLine;    } public void setLine(boolean isLine ...

  2. 前端 ---JS中的面向对象

    JS中的面向对象   创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 ...

  3. [前端] js中call方法的理解和思考

    最近接手前端的工作,对当前项目中自制的js框架下,js的使用产生了非常多的困惑.尤其是js的类,对象,函数,this等等相互之间的关系和转换,以前学过也忘得差不多了,现在基本相当于重新看. js中的函 ...

  4. 前端js中this指向及改变this指向的方法

    js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...

  5. 如何在Webstorm中添加js库 (青瓷H5游戏引擎)

    js等动态语言编码最大的缺点就是没有智能补全代码,webstorm做到了. qici_engine作为开发使用的库,如果能智能解析成提示再好不过了,经测试80%左右都有提示,已经很好了. 其他js库同 ...

  6. Vue 浅谈前端js框架vue

    Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...

  7. 后台返回数据为map集合,前端js处理方法

    当后台返回的数据不是json而是map集合的时候,前端js中处理就将其看作是一个数组,例如后台返回的代码入下: Map<String, String> result = new HashM ...

  8. 前端开发中的JS调试技巧

    前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

  9. 前端js面试中的常见的算法问题

    虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...

随机推荐

  1. 2、pycharm安装及相关配置

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试. 语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 ...

  2. 18年第一弹射 和网络有关; 艾曲塞嗯诶系列篇 san

    62: 管理员想要更新 AR2200路由器的VRP, 正确的方法: 1)管理员把 AR2200 配置为FTP客户端,通过FTP来传输VRP软件 2)管理员把AR2200 配置为FTP服务器,通过FTP ...

  3. CTRL-IKun团队选题报告

    1. 团队简介 1.1团队名称:CTRL-IKun 1.2队员学号列表 姓名 学号列表 廖志丹 201731032125 王川 201731021132 江天宇 201731024132 张微玖 20 ...

  4. Eclipse CDT 插件修改自动补全

    eclipse CDT 2019-06代码补全插件 本自动补全文件已在2019-06至2019-09平台上做过测试,均已完美通过功能检测 在原来Eclipse工具补全的基础上新增26个英文字符和&qu ...

  5. 文艺平衡树(区间splay)

    文艺平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列. 其中需要提供以下操作:翻转一个区间,例如原有序序列是 5\ 4\ 3\ 2\ ...

  6. 使用xpath总是找不到

    今天使用使用xpath,直接从网页上复制的 /html/body/div[3]/div[2]/div[2]/div[3]/table/tbody/tr[2]/td[3]/a 但是在代码中总是找不到文件 ...

  7. springBoot 整合 dubbo 遇到的坑

    一.注意springBoot 和 dubbo 之间版本的问题 <?xml version="1.0" encoding="UTF-8"?> < ...

  8. learn more ,study less(二):整体性学习技术(下)

    随意信息的处理 随意信息,或者内容太多.太复杂的信息,都不容易理解,它们需要不同的技术.假 如你发现联想法不能帮助你理解材料,或者需要花费的时间太长,这时候处理随意信息的方 法就很适合了. 这些处理随 ...

  9. .net 项目更改默认命名空间

    这个项目是我去年毕业设计做的项目,项目创建的时候由于手抖把Landlordtenant写成了 LandloRdtenant(R大写了),当时不知道如何改回来又担心改完之后报错也就没管了. 今天尝试使用 ...

  10. 【学习笔记】Linux基础(零):预备知识

    学习笔记(连载)之Linux系列 Note:本学习笔记源自<鸟哥的Linux私房菜(基础学习篇)>一书,为此书重要内容的摘要和总结,对于一些常识性的知识不再归纳 新型冠状病毒引发的肺炎战& ...