ホームページ >バックエンド開発 >PHPチュートリアル >PHPの脆弱性徹底解説(7) - セッションハイジャック

PHPの脆弱性徹底解説(7) - セッションハイジャック

黄舟
黄舟オリジナル
2016-12-22 09:41:031915ブラウズ

サーバーとクライアントはセッションを通じて通信します。クライアントのブラウザがサーバーに接続すると、サーバーはユーザーのセッションを確立します。各ユーザーのセッションは独立しており、サーバーによって維持されます。各ユーザーのセッションは、セッション ID と呼ばれる一意の文字列によって識別されます。ユーザーがリクエストを行うと、送信される http ヘッダーにはセッション ID の値が含まれます。サーバーは http ヘッダーのセッション ID を使用して、どのユーザーがリクエストを送信したかを識別します。

セッションは各ユーザーの個人データを保存します。一般的な Web アプリケーションは、認証されたユーザー アカウントとパスワードを保存するためにセッションを使用します。異なる Web ページを変換するときにユーザーの身元を確認する必要がある場合は、セッションに保存されたアカウント番号とパスワードを使用して比較します。セッションのライフサイクルは、ユーザーがサーバーに接続したときに開始され、ユーザーがブラウザを閉じるかログアウトして session_destroy 関数がセッション データを削除したときに終了します。ユーザーが 20 分以内にコンピューターを使用しない場合、セッションは自動的に終了します。

セッションを処理するための PHP アプリケーション アーキテクチャ

PHPの脆弱性徹底解説(7) - セッションハイジャック

セッション ハイジャック

セッション ハイジャックとは、攻撃者がさまざまな手段を使用してターゲット ユーザーのセッション ID を取得することを指します。セッション ID を取得すると、攻撃者はターゲット ユーザーの ID を使用して Web サイトにログインし、ターゲット ユーザーの操作権限を取得することができます。

攻撃者がターゲットユーザーのセッションIDを取得する方法:

1) ブルートフォースクラッキング: クラックされるまでさまざまなセッションIDを試します。

2) 計算: セッション ID が非ランダムな方法で生成された場合、それを計算することが可能です

3) 盗用: ネットワーク傍受、XSS 攻撃、その他の方法を使用して

セッション ハイジャック攻撃手順

PHPの脆弱性徹底解説(7) - セッションハイジャック

インスタンス

//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(); ?> 																																						
																							
																					
																	
															
																					
															

PHPの脆弱性徹底解説(7) - セッションハイジャック

ログイン後、

PHPの脆弱性徹底解説(7) - セッションハイジャック

攻撃開始




// Attack.php
php
//セッションを開く
();
エコー「セッション」ターゲット ユーザーの ID は次のとおりです。 "
";
echo "ターゲット ユーザーのユーザー名は次のとおりです。"
";
echo "対象ユーザーのパスワードは次のとおりです: " . $_SESSION["password"] . "
";
// 冊数を 2000 に設定します
$_SESSION["book "] = 2000;
?>


Submit http://localhost/攻撃.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 このIDは取得した顧客セッションIDです。顧客ページ更新後

PHPの脆弱性徹底解説(7) - セッションハイジャック

セッション固定攻撃

ハッカーは、攻撃を完了するためにセッション ID をユーザーに送信する方法を使用できます

http://localhost/index.php?user=dodo&PHPSESSID=1234 このリンクを表示するためにユーザー dodo に送信します

PHPの脆弱性徹底解説(7) - セッションハイジャック


その後、攻撃者は http://localhost/ Attack.php ?PHPSESSID=1234 にアクセスし、顧客ページが更新されて


が見つかりました。

PHPの脆弱性徹底解説(7) - セッションハイジャック

予防方法

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();

session_name( "mysessionid");

...

3) 透過的なセッション ID をオフにする

透過的なセッション ID とは、ブラウザーの http リクエストで Cookie を使用しないことを意味します。セッション ID を作成し、セッション ID はリンクを使用して渡されます。php .ini を開き、コード内で

session.use_trans_sid = 0

を編集します

int_set("session.use_trans_sid", 0);

session_start();

...

4) Cookie ID からのみセッションを確認します

session.use_cookies = 1 はセッション ID を保存するために Cookie を使用することを意味します

session.use_only_cookies = 1 はセッション ID を保存するためにのみ Cookie を使用することを意味しますセッション固定攻撃を回避できます

コード内

int_set("session.use_cookies", 1 );

int_set("session.use_only_cookies", 1); URL を使用して隠しパラメータを渡します

session_start();

$seid = md5(uniqid(rand()), TRUE ));

$_SESSION["seid"] = $seid;

攻撃者はセッションデータを取得できますが$seid の値を確認することはできませんが、現在のページが自分で呼び出された Web プログラムであるかどうかを確認できます。

上記は、PHP の脆弱性 (7) - セッション ハイジャックに対する完全な解決策です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。