php偽隨機數漏洞利用
php偽隨機數
相關函式
mt_rand()
mt_rand函式有兩個可選引數 min 和 max,如果沒有提供可選引數,mt_rand函式將返回返回 0 到 mt_getrandmax() 之間的偽隨機數。例如想要 5 到 15(包括 5 和 15)之間的隨機數,用 mt_rand(5, 15)。
mt_srand()
用於播下一個更好的隨機數發生器種子,用 seed
來給隨機數發生器播種。 沒有設定 seed
引數時,會被設為隨時數。自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 給隨機數發生器播種 ,因為現在是由系統自動完成的。
簡單來說mt_scrand()通過分發seed種子,然後種子有了後,靠mt_rand()生成隨機數
這張圖能幫助我們更好的瞭解php偽隨機數
程式碼測試
我們輸入種子12345 ,發現不管什麼時候,回顯的隨機數都是一樣的。其實,這就是偽隨機數的漏洞,存在可預測性。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KsnK8llB-1602323705066)(C:\Users\Asus\AppData\Roaming\Typora\typora-user-images\image-20201010174106195.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1vN9FIqr-1602323705068)(C:\Users\Asus\AppData\Roaming\Typora\typora-user-images\image-20201010174118319.png)]
總的來說,我們知道種子後,可以確定你輸出偽隨機數的序列。 知道你的隨機數序列,可以確定你的種子。
根據隨機數預測種子
以上面生成的隨機數為例,假設我們知道了第一個生成的隨機數,那我們怎麼預測種子呢?
那就要用到php_mt_seed這個工具了。
php_mt_seed使用方法
kali下,進入目錄,make
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-RPw1Z8ni-1602323705071)(C:\Users\Asus\AppData\Roaming\Typora\typora-user-images\image-20201010174632583.png)]
./php_mt_seed 第一個隨機數 ,(假設我們知道序列的第一個隨機數是 1507887240)
可以得到種子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-AvHXwAOa-1602323705072)(C:\Users\Asus\AppData\Roaming\Typora\typora-user-images\image-20201010174851252.png)]
驗證種子是否一樣就是看 輸出的序列是否一樣
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2LvT7msP-1602323705075)(C:\Users\Asus\AppData\Roaming\Typora\typora-user-images\image-20201010175003472.png)]
可以看到 1507887240 就是第一個隨機數,可以確定我們原先的種子就是 1142896771
相關習題
平臺:ctfshow web入門 web25
下面放出 此題的wp :
https://blog.i0bin.cn/index.php/archives/50/
參考部落格 :https://www.cnblogs.com/zaqzzz/p/9997855.html
https://blog.csdn.net/zss192/article/details/104327432