php偽隨機數安全

2021-10-10 12:19:12 字數 3421 閱讀 3178

獲得種子

ctf題目

利用場景

在php中,常用的隨機數生成演算法有rand(),mt_rand().

這兩個函式各有最大範圍不超過2147483647,rand()的範圍是很小的,非常不安全的,所以一般用mt_rand().

<?php 

//on windows

print

getrandmax()

;//2147483647

print

mt_getrandmax()

;//2147483647

?>

然鵝mt_rand()在實現上也有缺陷.

偽隨機數是由數學演算法來實現的,真正隨機的地方在於種子.種子一旦確定,再通過同一隨機數演算法計算出來的隨機數,值是固定的.多次計算所得值得順序也是固定的

在php4.2.0之前的版本,必須要通過srand()或mt_srand()給rand()或mt_rand()播種,

在php4.2.0之後的版本,事先可以不再通過srand()或mt_srand()播種. 如直接呼叫mt_rand(),系統會自動播種.

但是,可能為了和之前版本相容,php**裡面還會這樣寫:

mt_srand

(time()

);mt_srand

((double)

microtime()

*100000);

mt_srand

((double)

microtime()

*1000000);

mt_srand

((double)

microtime()

*10000000

);

但是,時間也不是隨機的. 攻擊者通過某種方式獲取系統時間,就可以短時間內列舉出種子

上面提到的如果不播種,系統會自動播種,系統播種種子範圍為0-2^32(32位系統),這樣似乎也能列舉emm

下面談談種子固定會發生什麼?

**在同一程序中,同乙個seed,每次通過mt_rand()生成的值都是固定的: **

無論訪問這個頁面多少次,都是上面的結果,上面的序列.正好驗證了上面的結論;

這裡有個trick是,可以通過keep-alive http頭,迫使服務端使用同一php程序相應請求,所以也就能使種子保持一直.

別的就依賴php程式設計師出錯了.

既然知道了,同乙個種子生成的序列是固定的,那麼也能根據序列猜測seed

工具:php_mt_seed:

linux下安裝使用方法

git clone  

cd php_mt_seed/

gcc php_mt_seed.c -o php_mt_seed

make

使用: ./php_mt_seed 隨機數

就會根據隨機數,找seed,可能會找到多個,就需要自己驗證哪個seed符和條件了

題目來自@

由?r=1

可以算出序列中第乙個數,再跑指令碼

找到兩個種子,乙個乙個試

可以利用外掛程式改cookie

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...

PHP生成偽隨機數

版本要求最低php7,如果對生成隨機數要求比較多,可以選擇使用zend math random lib或random compat庫。幾乎所有php庫都可以在 搜尋到 獲取隨機數字 author 劍心 0x00gc gmail.com param int size 以32位系統最大int支援為準,範...

PHP生成偽隨機數

版本要求最低php7,如果對生成隨機數要求比較多,可以選擇使用zend math random lib或random compat庫。幾乎所有php庫都可以在 搜尋到 獲取隨機數字 author 劍心 0x00gc gmail.com param int size 以32位系統最大int支援為準,範...