WebVulnerabilities

セッションハイジャック攻撃について

概要

セッションハイジャック攻撃とは、攻撃者がユーザーのセッションIDを不正に取得し、そのセッションIDを使用してユーザーとしてアプリケーションにアクセスする攻撃です。セッションIDが不適切に管理されている場合、この攻撃は非常に危険です。攻撃者は、ユーザーのアカウントにログインしたり、機密情報にアクセスすることが可能になります。


攻撃手法のパターン

  1. セッションIDの固定化(Session Fixation):
    • 攻撃者がユーザーに特定のセッションIDを強制的に使用させ、そのセッションIDを乗っ取る手法です。
  2. セッションIDの盗聴(Session Sniffing):
    • 攻撃者がネットワーク上を流れる通信を傍受し、セッションIDを取得する手法です。
  3. クロスサイトスクリプティング(XSS):
    • 攻撃者がXSS脆弱性を利用して、セッションIDを盗む手法です。
  4. セッションIDの予測(Session Prediction):
    • セッションIDが予測可能な場合、攻撃者がランダムにセッションIDを試行することで正しいIDを見つけ出す手法です。
  5. セッションリプレイ(Session Replay):
    • 攻撃者が一度取得したセッションIDを再利用して、セッションを再現する手法です。

脆弱性を持つコードの例と攻撃手法

1. セッションIDの固定化(Session Fixation)

PHPの脆弱なコード例:

<?php
session_start();
if (!isset($_SESSION['user'])) {
    $_SESSION['user'] = $_GET['user'];  // 攻撃者が指定したセッションIDを使用
}
?>

攻撃手法:

防止策:

2. セッションIDの盗聴(Session Sniffing)

Node.js(Express)の脆弱なコード例:

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
    secret: 'secret-key',
    resave: false,
    saveUninitialized: true
}));

app.get('/', (req, res) => {
    if (!req.session.user) {
        req.session.user = 'guest';
    }
    res.send(`Hello, ${req.session.user}`);
});

app.listen(3000);

攻撃手法:

防止策:

3. クロスサイトスクリプティング(XSS)

Python(Flask)の脆弱なコード例:

from flask import Flask, session, request, make_response

app = Flask(__name__)
app.secret_key = 'secret-key'

@app.route('/')
def index():
    if 'user' not in session:
        session['user'] = 'guest'
    return f"<h1>Hello, {session['user']}</h1>"

@app.route('/set_cookie')
def set_cookie():
    user = request.args.get('user')
    resp = make_response(f"Cookie set for {user}")
    resp.set_cookie('session_id', session.sid)
    return resp

if __name__ == '__main__':
    app.run()

攻撃手法:

防止策:

4. セッションIDの予測(Session Prediction)

Java(Spring Boot)の脆弱なコード例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/session")
public class SessionController {

    @GetMapping("/login")
    public String login(HttpSession session) {
        session.setAttribute("user", "guest");
        return session.getId();
    }
}

攻撃手法:

防止策:

5. セッションリプレイ(Session Replay)

PHPの脆弱なコード例:

<?php
session_start();
if (!isset($_SESSION['user'])) {
    $_SESSION['user'] = 'guest';
}
echo "Hello, " . $_SESSION['user'];
?>

攻撃手法:

防止策:


防止策

  1. セッションIDの再生成:
    • ユーザーが認証された後、セッションIDを再生成することで、セッション固定攻撃を防ぎます。
  2. セッションIDのセキュアな保存:
    • セッションIDはクッキーに保存し、HttpOnlyおよびSecure属性を設定します。これにより、クッキーがJavaScriptからアクセスされず、HTTPS通信のみで送信されます。
  3. HTTPSの使用:
    • セッションIDを含むすべての通信は、HTTPSを使用して暗号化し、セッションIDの盗聴を防ぎます。
  4. セッションIDの有効期限:
    • セッションIDには有効期限を設け、定期的に再生成することで、セッションリプレイ攻撃を防ぎます。
  5. ユーザーエージェントとIPアドレスのバインディング:
    • セッションIDを特定のユーザーエージェントとIPアドレスにバインドし、異なるエージェントやIPからのアクセスを拒否することで、セッションハイジャックのリスクを減少させます。
  6. CSRFトークンの使用:
    • CSRFトークンを使用して、セッションIDの不正使用を防ぐためにリクエストの整合性を確保します。

まとめ: セッションハイジャック攻撃は、セッションIDが不適切に管理されている場合に発生する非常に危険な攻撃です。セッションIDの再生成、HTTPSの使用、セッションIDの有効期限の設定などの防止策を講じることで、この攻撃からアプリケーションを守ることができます。また、セッションIDの予測や盗聴を防ぐために、セキュアなセッション管理

を実施することが重要です。