PHPセキュリティプログラミング:セッションハイジャックよりも強力なセッションデータ注入

6167 ワード

セッション露出と同様の問題はセッションインジェクションである.このような攻撃は、あなたのWEBサーバがセッションストレージディレクトリに読み取り権限を持つほか、書き込み権限を持っていることに基づいています.したがって、他のユーザーがセッションを追加、編集、削除できるスクリプトを作成する可能性があります.次の例では、既存のセッションデータを簡単に編集できるHTMLフォームを示します.01 <?php 02
  03 session_start(); 04
  05 ?> 06
  07 <form action= "inject.php"   method= "POST" > 08
  09 <?php 10
  11 $path   ini_get ( 'session.save_path' ); 12 $handle   = dir( $path ); 13
  14 while   ( $filename   $handle ->read()) 15 { 16    if   ( substr ( $filename , 0, 5) ==  'sess_' ) 17    { 18      $sess_data   file_get_contents ( "$path/$filename" ); 19
  20      if   (! empty ( $sess_data )) 21      { 22        session_decode( $sess_data ); 23        $sess_data   $_SESSION ; 24        $_SESSION   array (); 25
  26        $sess_name   substr ( $filename , 5); 27        $sess_name   = htmlentities( $sess_name , ENT_QUOTES,  'UTF-8' ); 28        echo   "<h1>Session [$sess_name]</h1>" ; 29
  30        foreach   ( $sess_data   as   $name   =>  $value ) 31        { 32          $name   = htmlentities( $name , ENT_QUOTES,  'UTF-8' ); 33          $value   = htmlentities( $value , ENT_QUOTES,  'UTF-8' ); 34          echo   "<p> 35                $name : 36                <input type=\"text\" 37                name=\"{ $sess_name }[{ $name }]\" 38                value=\" $value \" /> 39                </p>"; 40        } 41
  42        echo   '<br />' ; 43      } 44    } 45 } 46
  47 $handle ->close(); 48
  49 ?> 50
  51 <input type= "submit"   /> 52 </form>
スクリプトphpは、フォームによって指定された変更を実行します.01 <?php 02
  03 session_start(); 04
  05 $path   ini_get ( 'session.save_path' ); 06
  07 foreach   ( $_POST   as   $sess_name   =>  $sess_data ) 08 { 09    $_SESSION   $sess_data ; 10    $sess_data   = session_encode; 11
  12    file_put_contents ( "$path/$sess_name" $sess_data ); 13 } 14
  15 $_SESSION   array (); 16
  17 ?>
このような攻撃は非常に危険だ.攻撃者はあなたのユーザーのデータを編集するだけでなく、自分のセッションデータを編集することもできます.攻撃者はすべてのセッションデータを選択して変更することができ、アクセス制限や他のセキュリティ手段を迂回することが可能になるため、セッションハイジャックよりも強力です.
この問題に対する最善の解決策は、セッションデータをデータベースに保存することです.