セッションハイジャック@PHP技術

注意
※この記事は、主の勘違いしている情報も含まれています。


セッションハイジャック攻撃とは、不正なセッションキーを自分ではない利用者に使わせたり、逆に他の利用者のセッションキーを盗み出す攻撃のことです。

セッションハイジャックを行うと、対象者になりすまして操作をすることができるようになります。

まず、メールなどでサイトを踏ませます。PHPSESSIDはなりすまし対象サイトのセッション名に置き換えます。

<a href="/PHPS/sess.php?PHPSESSID=sess">年収300万が3年で1億稼げる方法</a>


ログなどでアクセスを確認したら、攻撃対象が対象のサイトにアクセスしていなければ、なりすまして操作が可能となります。

…というわけで、なりすましてみようと思います。
PHPには対象サイトの役割として、軽くログイン機能を実装しておきました。
Cookieを直接ログイン情報とするサイトがあるのかという疑問は置いといて。。。

session_start();
if(!empty($_SESSION['PHPSESSID'])){
    //PHPSESSIDからログイン
    if(login($_COOKIE['USER']) === true){
        echo 'ログインできた!';
    }else{
        echo 'ログインできません';
    }
}

こいつにブラウザ1で先程のリンクを踏ませます。
リンク先では以下のコードを実行させます。

setcookie('PHPSESSID',$_GET['PHPSESSID'],time()+3600));

そうすると、上のリンクを踏んだブラウザはログインできてしまうはず〜と思ったのですが、できません。

PHPのセッション機能ではCookieを保存してCookieのキーを元に値が取れるとのことだったのですが、セッション機能を使ってもそれらしいCookieが見当たらず、セッションキーが取得できないので実験は失敗でした。
→調査

これはセッション固定によるセッションハイジャックの一例です。
調べてみるとセッションフィクセーション?攻撃というのだそうです。

その他、XSSでセッションキーを盗み出してセッションハイジャックする方法もあるなーと思いました。

防御側としては〜と答えを見る前に対策を考えてみました。

  • セッションキーにIPアドレスを混ぜ込む
  • サイトの方でexpireをかける

…ぐらいでしょうか?


答えとしては、

  • php.iniの設定
  • IPアドレスチェック
  • 定期的にセッションキーを変更する

でした。予想とは大まかには合ってる感じです


具体的な対策は、
session.use_trans_sid = 0 //相対パスに自動付加されたセッションIDからは取得 しない
session.use_cookies = 1//セッションはCookieを使う
session.use_only_cookies = 1
session.auto_start = 0
でセッションをCookieのみに絞ると同時に勝手にSessionが立ち上がらない設定にしておいてます。

IPアドレスはセッションにIPアドレスも保存しておく。そのままです。

定期的なセッションキーの変更は、session_regenerate_id(true)をすると古いセッション情報が削除されるそうです。