0x00 rand()函數
rand()的隨機數默認最大32767,可以用於爆破這里不再舉例。
0x01 mt_rand()和mt_srand()函數
mt_srand()函數用於播種,PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函數給隨機數發生器播種,當PHP版本到了5.2.1后,通過修改算法修補了奇數和偶數的播種相等的問題,這樣也導致了php5.2.0前后導致同一個播種后的mt_rand()的值不一樣
5.2.6>php>4.2.0默認播種的算法也不是很強悍,當目標>5.20時候,我們exp運行的環境也要是>5.20的版本,mt_rand處理的數據都是不安全的。在web應用里很多都使用mt_rand來處理隨機的session,比如密碼找回功能等等。
如果你知道一個mt_rand()的值就可以,就可以推斷出mt_srand()的種子值,從而推斷出下一個mt_rand()值。
工具:http://download.openwall.net/pub/projects/php_mt_seed/php_mt_seed-3.2.tar.gz
root@kali:~# php5 -r ‘mt_srand(123123123); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
1474031914
root@kali:~/php_mt_seed-3.2# ./php_mt_seed 519979806
Found 0, trying 100663296 - 134217727, speed 34831590 seeds per second
seed = 123123123
Found 1, trying 1509949440 - 1543503871, speed 34497359 seeds per second
seed = 1525862101
Found 2, trying 3992977408 - 4026531839, speed 34601190 seeds per second
seed = 3994356879
Found 3, trying 4261412864 - 4294967295, speed 34578163 seeds per second
Found 3
可見程序給出了三個種子,逐個測試即可:
root@kali:~# php5 -r ‘mt_srand(1525862101); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
14803299
root@kali:~# php5 -r ‘mt_srand(3994356879); echo mt_rand(),”\n”; echo mt_rand(),”\n”;’
519979806
978260809
123123123為真正的種子,這樣就可以輕松拿到真正的種子,下一個要產生的隨機數也就知道了