ホームページ >バックエンド開発 >PHPチュートリアル >PHPの脆弱性徹底解説(7) - セッションハイジャック
サーバーとクライアントはセッションを通じて通信します。クライアントのブラウザがサーバーに接続すると、サーバーはユーザーのセッションを確立します。各ユーザーのセッションは独立しており、サーバーによって維持されます。各ユーザーのセッションは、セッション ID と呼ばれる一意の文字列によって識別されます。ユーザーがリクエストを行うと、送信される http ヘッダーにはセッション ID の値が含まれます。サーバーは http ヘッダーのセッション ID を使用して、どのユーザーがリクエストを送信したかを識別します。
セッションは各ユーザーの個人データを保存します。一般的な Web アプリケーションは、認証されたユーザー アカウントとパスワードを保存するためにセッションを使用します。異なる Web ページを変換するときにユーザーの身元を確認する必要がある場合は、セッションに保存されたアカウント番号とパスワードを使用して比較します。セッションのライフサイクルは、ユーザーがサーバーに接続したときに開始され、ユーザーがブラウザを閉じるかログアウトして session_destroy 関数がセッション データを削除したときに終了します。ユーザーが 20 分以内にコンピューターを使用しない場合、セッションは自動的に終了します。
セッションを処理するための PHP アプリケーション アーキテクチャ
セッション ハイジャック
セッション ハイジャックとは、攻撃者がさまざまな手段を使用してターゲット ユーザーのセッション ID を取得することを指します。セッション ID を取得すると、攻撃者はターゲット ユーザーの ID を使用して Web サイトにログインし、ターゲット ユーザーの操作権限を取得することができます。
攻撃者がターゲットユーザーのセッションIDを取得する方法:
1) ブルートフォースクラッキング: クラックされるまでさまざまなセッションIDを試します。
2) 計算: セッション ID が非ランダムな方法で生成された場合、それを計算することが可能です
3) 盗用: ネットワーク傍受、XSS 攻撃、その他の方法を使用して
セッション ハイジャック攻撃手順
インスタンス
//login.php session_start(); if (isset($_POST["login"])) { $link = mysql_connect("localhost", "root", "root") or die("无法建立MySQL数据库连接:" . mysql_error()); mysql_select_db("cms") or die("无法选择MySQL数据库"); if (!get_magic_quotes_gpc()) { $query = "select * from member where username=’" . addslashes($_POST["username"]) . "’ and password=’" . addslashes($_POST["password"]) . "’"; } else { $query = "select * from member where username=’" . $_POST["username"] . "’ and password=’" . $_POST["password"] . "’"; } $result = mysql_query($query) or die("执行MySQL查询语句失败:" . mysql_error()); $match_count = mysql_num_rows($result); if ($match_count) { $_SESSION["book"] = 1; mysql_close($link); header("Location: http://localhost/index.php?user=" . $_POST["username"]); } ….. // 打开Session 访客的 Session ID 是:echo session_id(); ?>
ログイン後、
攻撃開始
// Attack.php
php
//セッションを開く
();
エコー「セッション」ターゲット ユーザーの ID は次のとおりです。 "
";
echo "ターゲット ユーザーのユーザー名は次のとおりです。"
";
echo "対象ユーザーのパスワードは次のとおりです: " . $_SESSION["password"] . "
";
// 冊数を 2000 に設定します
$_SESSION["book "] = 2000;
?>
Submit http://localhost/攻撃.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 このIDは取得した顧客セッションIDです。顧客ページ更新後
セッション固定攻撃
ハッカーは、攻撃を完了するためにセッション ID をユーザーに送信する方法を使用できます
http://localhost/index.php?user=dodo&PHPSESSID=1234 このリンクを表示するためにユーザー dodo に送信します
その後、攻撃者は http://localhost/ Attack.php ?PHPSESSID=1234 にアクセスし、顧客ページが更新されて
予防方法
1) セッションIDを定期的に変更する
関数 bool session_regenerate_id([bool delete_old_session])
delete_old_session trueの場合、古いセッションファイルが削除されます。 falseの場合、古いセッションが削除されます。デフォルトは false です。
Add
session_start();
session_regenerate_id(TRUE);
...
これにより、リロードされるたびに新しいセッション ID が生成されます。 2) セッションの名前の変更
セッションのデフォルト名は PHPSESSID です。ハッカーがパケットをキャプチャして分析しない場合、名前を推測して一部の攻撃をブロックすることはできません。
session_start();
int_set("session.use_trans_sid", 0);
session_start();
$seid = md5(uniqid(rand()), TRUE ));