前幾天在羣裏看到了一個題目,發現本身沒有接觸過這個僞隨機數這個漏洞,在此記錄下。php
搜索這兩個函數函數
mt_scrand() mt_rand()
mt_scrand(seed)這個函數的意思,是經過分發seed種子,而後種子有了後,靠mt_rand()生成隨機數。code
咱們來寫段代碼。class
<?php mt_srand(12345); echo mt_rand()."<br/>"; ?>
咱們訪問,輸出162946439。隨機數
如今代碼改成搜索
<?php mt_srand(12345); echo mt_rand()."<br/>"; echo mt_rand()."<br/>"; echo mt_rand()."<br/>"; echo mt_rand()."<br/>"; echo mt_rand()."<br/>"; ?>
咱們再次訪問:im
162946439腳本
247161732img
1463094264di
1878061366
394962642
如今細心的人可能已經發現,第一個數162946439存在貓膩了。
爲何生成隨機數會同樣呢?咱們屢次訪問。震驚:
仍是
162946439
247161732
1463094264
1878061366
394962642
其實,這就是僞隨機數的漏洞,存在可預測性。
生成僞隨機數是線性的,你能夠理解爲y=ax,x就是種子,知道種子和一組僞隨機數不是就能夠推y(僞隨機數了嗎),固然實際上更復雜確定。
我知道種子後,能夠肯定你輸出僞隨機數的序列。 知道你的隨機數序列,能夠肯定你的種子。
用到的是爆破,已經有寫好的C腳本了。
這裏簡單的介紹下這個腳本咋用
kali下,進入目錄,make time ./php_mt_seed 第一個隨機數
爆破出來兩個種子,一個是12345679,另外一個是1039460795。
本身本地試下
驗證種子是否同樣,就看看輸出序列是否同樣