PHP で rand() 関数を使用してトークンを生成するのは安全ですか?
Web アプリケーションでは、セッション トークン、CSRF トークン、パスワードを忘れた場合の電子メール パスワードのリセットに使用されるトークンなど、推測が困難なトークンを作成する必要があることがよくあります。これらのトークンは暗号化して保護する必要がありますが、実際には rand 関数を複数回呼び出し、出力を文字列に変換することで表現されることがよくあります。この記事では、rand を使用して生成されるトークンを予測するのはそれほど難しくないことを示します。
rand の仕組み
PHP では、関数 rand を使用して疑似乱数を生成し、乱数を初期化するためのシードは srand によって生成されます。ユーザーが srand を呼び出すことを選択しなかった場合、PHP は非常に推測しにくい数値を乱数ジェネレーターにシードします。 srand によって生成されたシードは、rand 関数によって生成された乱数を完全に決定します。
乱数生成器は、srand によって初期化された状態を維持し、rand を呼び出すたびに変更されます。この状態はプロセスの状態に関連しているため、通常、2 つのプロセスが同じ rand 乱数を返すことはありません。
サンプル プログラム
使用するサンプル プログラムは EZChatter です。これは CSRF トークンを生成するための小さなプログラムですが、作成時にセキュリティが十分に考慮されていませんでした。
public static function gen($len = 5){ $token = ''; while($len--){ $choose = rand(0, 2); if ($choose === 0) $token .= chr(rand(ord('A'), ord('Z'))); else if($choose === 1) $token .= chr(rand(ord('a'), ord('z'))); else $token .= chr(rand(ord('0'), ord('9'))); } return $token;}
Asご覧のとおり、上記のコードは最初に rand を呼び出して、大文字、小文字、数字のいずれを使用するかを決定し、次に特定の文字または数字を選択します。新しい CSRF トークンは、index.php をリクエストするたびに生成されるため、必要なトークンを生成するためにランダムなリクエストを行うことができます。私たちの目標は、CSRF 攻撃を実行できるように、ユーザーに割り当てられたトークンを予測することです。
シードを推測します
前に述べたように、乱数シーケンスはシードによって完全に決定されるため、正しいものを推測するために、srand のパラメーターとして考えられるすべての数値を単純に試すことができます。発電機の状態。ただし、これはサーバー プロセスが新しく作成された場合にのみ Linux で機能することに注意してください。サーバーがすでに多くの rand 呼び出しを生成している場合、同じ状態を取得するにはクラッカーで同じ回数の呼び出しを繰り返す必要があります。 Windows では、乱数生成器の状態は srand のパラメータにのみ関係するため、繰り返し処理を実行する必要はありません。
新しく作成したプロセスからトークンを取得したい場合は、次の PHP スクリプトを使用してクラックできます:
for ($i = 0; $i < PHP_INT_MAX; $i++) { srand($i); if (Token::gen(10) == "2118Jx9w3e") { die("Found: $i \n"); }}
srand を検索するには、合計 4294967295 個の可能なパラメータがありますそれだけの価値はありますが、所要時間は約 12 時間です。ただし、PHP は glibc の rand 関数のみを呼び出すため、PHP コードを C に再変換して実行を高速化できます。ここでは 2 つのバージョンのコードを示します。1 つは glibc rand を呼び出し、もう 1 つは Windows rand を模倣します。これは token.php の PHP コードに基づいており、PHP のマクロ ext/standard/rand.c を使用して、考えられるシードの検索をループします。 Windows では約 10 分、Linux では数時間しかかかりません。
攻撃が完了すると、乱数生成器がサーバーと同じ状態になるため、サーバーと同じトークンを生成できます。自分で生成したトークンとサーバーから返されたトークンを比較することで、どのトークンがユーザーに割り当てられているかを知ることができ、攻撃を開始できます。
Linux での状態攻撃
Windows では、srand パラメーターと乱数ジェネレーターの状態を推測することは別のことですが、Linux では異なります。 glibc の rand() は一連の数値を保持し、次のように次の状態を決定します。
state[i] = state[i-3] + state[i-31]return state[i] >> 1
したがって、各出力は前の 3 件と 31 件の結果のほぼ合計になります。次のトークンを考えてみましょう:
- 6ZF5kNgonV
- 9h3byovpGR
- gGt0A94U92
ここで、次の乱数が大文字、小文字、または数字を使用してください。これは、以前の実行 3 と 31、gGt0A94U92 の 9 および y の 9h3byovpGR の結果によって決定されます。したがって、次の rand(0, 2) の出力はおよそ ⌊10/10 + 25/26 × 3⌋ = 2 mod 3 になると予想されます。これは、数値が得られることを意味します。以下では、この数値が予測できると仮定すると、次回の rand の呼び出しで取得される数値は、前回の 3 回目の rand の呼び出しで取得された数値と、前回の 31 回目の rand の呼び出しで取得された小文字によって決まります。この数値は、 ⌊2/3 + 1/3 × 10⌋ = 0 mod 10 と ⌊3/3 + 2/3 × 10⌋ = 6 mod 10 の間になります。したがって、値は 0 から 6 の間であると予想され、最終的には 4 になります。
- 43J2d2ew31
ご覧のとおり、これでは正確に予測できません。メソッド次の乱数ですが、おおよその範囲を予測できることも明らかであり、もはや乱数とは言えません。同じ方法を使用して glibc の乱数発生器の状態を推測することもできますが、ここでは試みません。
概要
暗号的に安全な乱数生成器を使用する必要があります。 rand を使用して乱数を生成すると、多くの場合、乱数発生器を推測できるため、トークンが予測可能になります。 Linux ではトークンの予測が少し難しくなりますが、それでも安全ではありません。 Windows 上の乱数ジェネレーターは、乱数ジェネレーターの状態が数分以内に推測できるため、悪用が比較的簡単です。
*原文: sjoerdlangkemper.nl、FB 編集者 xiaix が編集、FreeBuf Hackers and Geeks (FreeBuf.COM) から転載

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
