3dub 4 rememberme write up(3) - 暗号鍵を推測してkey.txtをもらおう
スクリプトを見ると,以下のようにkey.txtの時だけは,特別な処理を入れていることがわかる.
When reading key.txt, getfile.php adds process after reading key.txt as below:
要は「ファイル名がkey.txtだったらば,乱数を鍵にして暗号化する」というものだ.
if ($filename == "key.txt") {
$key = rand();
$cyphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC);
echo base64_encode($cyphertext);
ところがこの鍵,以下に示すようにとっても推測しやすいものであるw
rand()の前に関連する処理を見てみると,以下のとおりである.
srand()のパラメータに,time()の実行結果を指定している.
$value = time();
// (略)
srand($value);
Webサーバのレスポンスに,サーバの時刻情報が含まれるために,time()の値は推測が容易である*1.
ここまでやっていくことで,鍵と暗号文が入手出来た.
ということで,時刻データ±数秒程度のデータからsrand()+rand()で鍵をいくつか生成し,暗号鍵を作って解いてやると,それっぽい文字列が出てくるだろう.
*1:処理のタイミングによっては,time()の値が1秒程度ずれることもありうるため,「推測が容易」と書いている