(zzfrom:http://hack.gameres.com/showthread.asp?threadid=3483)
声明:以下文章内容只限技术研究和讨论,不得用于任何非法目的和商业目的,否则由此带来的一切法律责任由您自己承担,谢谢。
看到论坛的技术文章慢慢多起来,我也来凑点热闹吧,把以前做的一些传奇数据分析心得拿来玩玩,这里响应阵雨兄的观点,只谈论原理,不涉及具体数据,免得便宜了拿来主义者。
注:传奇系列游戏(2、3)的网络协议以及登录验证过程大致相同(一个妈生的嘛!),所以这里以传奇3为例,传奇2的请各位自己试验。
BUG类型:
登录验证BUG
BUG描述及简单分析:
传奇3登录过程如下:
1 client ->username/password-> login server
2 client <-gametime/SID<- login server
3 client ->username/SID-> data server
4 client <-personal data<- data server
5 client->username/personal ID/SID/gamedate->game server
OK,现在分析完登录过程,大家可以清楚的看到在login server、data server以及game server之间互相保持联系的一个关键地方-SID,我们这里的主题是体现一个BUG,说白了也就是突破他的限制。下面我们简单的分析一下SID,很显然这是个随机无序列的数(至少对于我们CLIENT来说,当然在SERVER端肯定有一个函数来计算,SID的猜测计算与伪造也许是另一个突破点哦,在这里我们就不讨论了),但是这个SID肯定在服务器里注册过的,所以暂时劝你别自己乱填。从正常的逻辑分析来看,整个登录过程好像很完整,也符合我们平时做程序的习惯。但是我们换一个角度来看呢,不要局限在他给你定的框框里,自己试着突破一下呢?上帝给我们制造出手就是用来动的。我喜欢有空就思考下面几个问题,为什么他要让我这么做呢?如果我不这么做的话会有什么结果?这里不推荐危险行业人员这么去想,譬如研制***、核武器之类的行业。呵呵。不说废话了,切入正题。在登陆过程的第3步,你将username改成一个别的username试试呢,SID用你自己的SID。看看结果。:)原理如下:
我们的重点是SID,要得到服务器的许可,首先要有一个合法的SID,何谓合法,就是正版,也就是由他服务器做出来的才叫正版,当然如果盗版技术不错的话也可以。:) 呵呵。我盗版技术不行,所以就用他的服务器帮我造一个了。先用一个合法账号登陆,从服务器获取一个合法SID,然后在登陆DATA SERVER的时候将用户名换掉,SID还是用那个合法的SID。为什么这么做呢?因为DATA SERVER和LOGIN SERVER之间是靠SID联系的,每次你登录的时候LOGIN SERVER会给你一个SID,然后把这个SID注册一下,表示这个SID是合法的,然后你连接到DATA SERVER,DATA SERVER接到你的登陆请求和SID,会把SID提取出来发给LOGIN SERVER问问这个SID是否合法,合法?OK,不合法?BYEBYE。大家可能也看出了这种验证方式的漏洞了,这里只验证SID的合法性而忽视了USERNAME,这是一个巨大的BUG。我用正常的账号登录LOGIN SERVER,然后在登录DATA SERVER的时候把提交的用户名换掉,DATA SERVER也会通过验证,因为DATA SERVER只验证SID而不知道这个SID是否是由本来的USERNAME产生的。My god!
总结:
我们利用了传奇服务器之间通信的不完整,在跨服务器登录的时候采用了伪造合法数据包的方式来欺骗了除LOGIN SERVER以外的其他的服务器,从而实现了绕过密码验证,读取任意用户资料的目的。:)韩国人也不过如此嘛,这么简单的逻辑错误也犯,还犯得这么可爱。YE!
BUG解决方法:
在login server维护起一张登陆表,里面关联进去username\sid\date\time等变量,data server和game server在接受用户请求的时候去检查这张表的唯一性和数据完整性,从而实现合法性的检查,好像还可以防止复制之类的重复登录和重复保存数据资料的BUG哦。
发这篇文章的目的是提出一种思路,而不是去破坏和入侵哦,希望能起到抛砖引玉的作用。:)
收工!文章写得有点乱,所以请大家多多包涵!