msn的一些在线flash游戏,通常有个重要的值,就是用户的积分,那么这种游戏用户是否能够通过其中的漏洞自行提交积分呢。首先分析一下游戏,发现msn是采用的Activex+flash的形式做为游戏的客户端,Flash用于提供友好的游戏界面,Activex负责和服务器通讯。抓取Activex和服务器的通讯包之后,发现包是加密的,而且也没有采用http协议,看不懂。考虑一般在程序开发中都会注重网络安全传输的安全性,所以这也是意料之中的事情。但是是否这样就足够安全了呢,还不是,问题出在什么地方,就出在flash上。flash和外界通讯的途径很少,所以就截取了flash和activex通讯的部分。这部分明显存在很大的问题,在这个过程中,Flash将积分值传递给Activex,只要在这个通讯的过程中将积分值改掉,你就可以自行提交积分了。
我的一个朋友已经按照这种思路自行提交了高积分,导致自己仅玩了几局游戏而积分是别人的数百倍。当然那位朋友的意图不在于自己的积分,而是他们自己做了类似的游戏,所以也就考虑这种游戏的安全性。
这让我想到了我们做网络应用程序的安全性,对于B/S应用程序,有可能会产生自动提交的问题,比如博客园的一些帖子后面的评论都是自动提交的,验证码可以解决一些问题,但是类似博客园的验证码的图形比较简单,通常也是可以识别的。听说csdn最近限制了所有页面必须来自csdn,也即判断了refer值,不过这点应该也不够,因为refer值也是可以伪造的。
除了通常令人厌烦的自动提交之外,还有就是用户特意的修改某个值,这个值可能包含在post的数据中。这样用户就可以获得某些特权。当然,对于纯B/S的应用程序,重要的值应该统统保存在Session中,而不应该输出到html,然后通过post来回传。但是对于c/s的应用程序,或者SmartClient类型的应用程序,麻烦就多了,通常这类程序,重要的值都保存在客户端中,然后通过客户端提交到服务器的web service上。在这个提交的过程中,就大有手脚可做。
在我们的应用程序中的任意一个环节,都有可能会导致安全漏洞,这些漏洞还很难在测试过程中发现。而通常这些安全漏洞都是程序员在写程序中没有注意到的,而这些安全问题在系统设计阶段可能也没有都考虑周全,没有特别强调某些部分的安全性。另外有些问题是在写程序过程中的直感,实际上就是经验的一种快速反应。
我想还有一种方式,就是在测试过程中邀请一些善于攻击的高手,对系统进行模拟攻击,通常攻击者面对的是一个黑盒。其通过经验判断系统可能存在的问题并且进行尝试,通过网络抓包来分析数据以找出漏洞。我想这种测试也是很重要的环节。
随便说说,呵呵。