BUGTRAQ ID: 39404 MyBB是一款流行的Web论坛程序。 MyBB的口令重置实现在生成口令重置令牌和随机口令时使用了弱随机数,如果Web服务器重新使用了PHP进程的话攻击者就可以破解口令入侵任意账号。 MyBB在多处使用了mt_srand()函数对随机数生成器提供种子: // Setup a unique posthash for attachment management if(!$mybb->input['posthash'] && $mybb->input['action'] != "editdraft") { mt_srand((double) microtime() * 1000000); $posthash = md5($mybb->user['uid'].mt_rand()); } 这种方式所提供的随机数种子只有100万个不同的种子值;此外第一个生成的随机数还会以posthash的形式泄露给用户。由于用户知道了自己的uid,就可以通过暴力猜测100万种可能性找到种子。普通的桌面PC可在一秒钟内完成这种攻击。 由于随机数生成器的状态被同一PHP进程所处理的请求所共享,因此之后的口令重置就会使用攻击者已知的状态。 口令重置首先会创建发送给用户的随机口令重置令牌。如果使用了这个令牌,口令重置的第二步就会生成新的随机口令,这两个随机字符串都是由以下函数生成的: function random_str($length="8") { $set =array("a","A","b","B","c","C","d","D","e","E","f","F",...
BUGTRAQ ID: 39404 MyBB是一款流行的Web论坛程序。 MyBB的口令重置实现在生成口令重置令牌和随机口令时使用了弱随机数,如果Web服务器重新使用了PHP进程的话攻击者就可以破解口令入侵任意账号。 MyBB在多处使用了mt_srand()函数对随机数生成器提供种子: // Setup a unique posthash for attachment management if(!$mybb->input['posthash'] && $mybb->input['action'] != "editdraft") { mt_srand((double) microtime() * 1000000); $posthash = md5($mybb->user['uid'].mt_rand()); } 这种方式所提供的随机数种子只有100万个不同的种子值;此外第一个生成的随机数还会以posthash的形式泄露给用户。由于用户知道了自己的uid,就可以通过暴力猜测100万种可能性找到种子。普通的桌面PC可在一秒钟内完成这种攻击。 由于随机数生成器的状态被同一PHP进程所处理的请求所共享,因此之后的口令重置就会使用攻击者已知的状态。 口令重置首先会创建发送给用户的随机口令重置令牌。如果使用了这个令牌,口令重置的第二步就会生成新的随机口令,这两个随机字符串都是由以下函数生成的: function random_str($length="8") { $set =array("a","A","b","B","c","C","d","D","e","E","f","F", "g","G","h","H","i","I","j","J","k","K","l","L", "m","M","n","N","o","O","p","P","q","Q","r","R", "s","S","t","T","u","U","v","V","w","W","x","X", "y","Y","z","Z","1","2","3","4","5","6","7","8","9"); $str = ''; for($i = 1; $i <= $length; ++$i) { $ch = mt_rand(0, count($set)-1); $str .= $set[$ch]; } return $str; } 这段代码的问题是使用了mt_rand()生成随机字符串且mt_rand()随机数生成器的状态是攻击者已知的,因此可以预测出所生成的口令重置令牌和新的口令。 MyBB <= 1.4.11 厂商补丁: MyBB ---- 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: http://blog.mybboard.net/2010/04/13/mybb-1-4-12-released-security-maintenance-update/