最新论坛BUG:可合法注册长度为3个字节以下ID!!
一直以来,uker论坛都限制用户只可注册不低于3个字节长度以下的用户名,如违反则不可成功注册。但是自从升级系统以后,却陆陆续续出现了很多个ID长度少于3的用户。而且均不是uker周年庆批准的合法用户。经细查,才发现原来是uker的系统bug所造成的。
bug漏洞:
注册用户名时,如注册ID长度小于3个英文字节,直接申请注册,系统会提醒因长度小于3而注册不成功。但是,如果在注册的时候于原ID后面添加n个空格,使其整体长度(包括空格)不小于3后,则可成功注册!!
bug分析:
其实这只是一个很简单的编程漏洞,其原理就是在于当系统注册程序verify注册名string的时候,采取的是直接检查注册的string是否小于3个字节.这样一来,注册时提交的空格也被算作这个string的长度了~所以也就通过了用户名不小于3这一条件的限制,而能够成功注册了。。
可能有人会不太明白~~为什么注册的ID后面有空格,但是注册好以后登陆的时候,却不需要加空格就能登陆,而且发表帖子那里的ID也都是不待空格的呢?对于这一点,虽然我不是很清楚论坛的内部架构,但是从以前论坛出错时有时候会显示mysql数据库相关问题。所以能够肯定的是论坛采用的是mysql数据库存储所有档案。这样的话,当带有空格的string被写入数据库的时候~~mysql会自动将所有string内容的两端空格除去后在写入table的column,所以最后存储在论坛数据库里的用户名长度其实是小于3个字节的.加上论坛采用的asp系统是不会去检查数据库某个column的数据长度是多少,所以小于三个字节数据完全可以被合法写入。
至于登陆的时候,当提交username和password以后,asp只会将这两个string拿去匹配数据库中相关的数据,然后决定是否给与合法登陆。很不幸的是,之前写入数据库的数据已经是小于3个字节的了。。。——这就是小于3个字节ID能够注册,也能够合法登陆的原因。
bug解决办法:
其实要解决这个bug是很简单的。甚至只是需要添加一行代码就能完成。但是,既然我们之前作了一些内在的分析,我们也可以通过不同的手段完成。
1.最简单的:在注册ID的时候,在asp验证用户名是否小于3个字节之前,将用getString拿到的原注册ID(也就是可能带有空格的),采用trim()方法去掉两端空格后,在予做相关验证。
2.通过数据库入手:假设用户名在数据库里的column名称是username,我们可以通过mySQL的相关设定,将这个column data的length限制在不得小于3。因为mySQL会先除去空格在保存档案,所以在这里验证的话,不会出现之前通过asp验证的bug.
3,如果还不放心的话,我们在登陆的asp页面也可以加入一段代码来完成double-checking.我们可将登陆提交的用户名ID的string先用trim()去掉空格,再用length.string()来判断它的长度。只有不小于3的才给予通过,进行数据可数据匹配。。。
遗留问题解决办法:
首先,我发了这个帖子之后,我想肯定会有很多用户会抱着试一试或者是别的目的,尝试利用现有bug注册长度小于3的用户名。这点我已经料到了~嗬嗬~~所以为了这张帖子不给论坛添乱子,以及删除之前非法注册的小于3字节ID,解决办法如下:
1.通过可视性数据库管理工具(eg.mySQL),打开用户名ID所在的table,然后点击用户名所在的那个column,这样ID就会顺着内容长度排列。所以1个字节的肯定在最前面,然后是2个字节,如此类推...这样的话,管理员就能很轻松的删除不合法的ID明了。
2.如果论坛的管理系统不是采用的是windows平台,二是不具备这些可视型管理工具的平台的话,我们也可以通过程序代码来做到。
eg.假设ID所在column名称是"username",所在table叫“proffile”的话,我们可以使用select username from profile where |