wakatonoの戯れメモ

はてなダイアリーから引っ越してきました。

3dub 4 rememberme write up(3) - 暗号鍵を推測してkey.txtをもらおう

スクリプトを見ると,以下のようにkey.txtの時だけは,特別な処理を入れていることがわかる.
When reading key.txt, getfile.php adds process after reading key.txt as below:


if ($filename == "key.txt") {
$key = rand();
$cyphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC);
echo base64_encode($cyphertext);
要は「ファイル名がkey.txtだったらば,乱数を鍵にして暗号化する」というものだ.
ところがこの鍵,以下に示すようにとっても推測しやすいものであるw
rand()の前に関連する処理を見てみると,以下のとおりである.

$value = time();
// (略)
srand($value);
srand()のパラメータに,time()の実行結果を指定している.
Webサーバのレスポンスに,サーバの時刻情報が含まれるために,time()の値は推測が容易である*1

ここまでやっていくことで,鍵と暗号文が入手出来た.
ということで,時刻データ±数秒程度のデータからsrand()+rand()で鍵をいくつか生成し,暗号鍵を作って解いてやると,それっぽい文字列が出てくるだろう.

*1:処理のタイミングによっては,time()の値が1秒程度ずれることもありうるため,「推測が容易」と書いている