(漏洞已经提交给腾讯TSRC)我是如何利用微信弱签名算法将小程序刷到100000分的

#此漏洞已经提交给腾讯安全应急响应中心,且漏洞已经修复

前几天微信更新了新版本,小程序就可以玩游戏了,对我我这种手残,跳一跳这种游戏对我来说真的难受,突破100都难如登天啊

那如何在跳一跳小程序分数排行榜上装逼了?

首先,微信爆出小程序源码可任意下载漏洞

有大牛在拿到小程序源码后,逆向某用于签名的js得到,签名算法,然后我在朋友圈看到了这张图

但是注意填充的地方,上图是默认填充,但是楼主直接尝试后并不能有效签名。CBC加密,初始向量,key都是已定的,其他地方也没有可操作的地方了,就剩填充的内容了(CBC是分组密码,不满16字节,需要填充,默认是缺几个子节填充几,历史上有著名的padding oracle attack)。楼主开始日常爆破,对填充部分遍历可见字符,最后发现chr(1)可以签名成功。得到下面的自动化脚本:

from Crypto.Cipher import AES
import json,base64,os

command = "curl -i -s -k  -X

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

POST' \
    -H

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

Content-Type: application/json' -H

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153 MicroMessenger/6.6.1 NetType/4G Language/zh_CN' -H

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

Referer: https://servicewechat.com/wx7c8d593b2c3a7703/3/page-frame.html' \
    --data-binary

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

{\"base_req\":{\"session_id\":\"%s\",\"fast\":1},\"action_data\":\"%s\"}' \

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)

https://mp.weixin.qq.com/wxagame/wxagame_settlement'"
action_data = {
	"score": 100000,
	"times": 520,
	"game_data": "{}"
}
session_id = "your_session_id"
aes_key = session_id[0:16]
print aes_key
aes_iv = aes_key

cryptor = AES.new(aes_key, AES.MODE_CBC,aes_iv)
str_action_data = json.dumps(action_data).encode("utf-8")
print "len:",len(str_action_data)
length = 16 - (len(str_action_data) % 16)
print length
str_action_data += chr(1)*length
print str_action_data
print len(str_action_data)
cipher_action_data = base64.b64encode(cryptor.encrypt(str_action_data)).decode("utf-8")
print("action_data",cipher_action_data)
print os.system(command % (session_id,cipher_action_data))

截断流量,获取自己的session_id,填入脚本,然后python jump.py,分数1000000目标达成。哈哈哈哈哈哈,100000应该是游戏设置的最大值,大于100000的值改了分数也不会变。。。。

思考,保护程序源码真的很重要啊,然后就是js被逆出来的难度真的不是特别大(有时甚至不需要逆,js扒下来直接给输入,拿输出也行)