セッションハイジャック攻撃について
セッションハイジャック攻撃とは、攻撃者がユーザーのセッションIDを不正に取得し、そのセッションIDを使用してユーザーとしてアプリケーションにアクセスする攻撃です。セッションIDが不適切に管理されている場合、この攻撃は非常に危険です。攻撃者は、ユーザーのアカウントにログインしたり、機密情報にアクセスすることが可能になります。
PHPの脆弱なコード例:
<?php
session_start();
if (!isset($_SESSION['user'])) {
$_SESSION['user'] = $_GET['user']; // 攻撃者が指定したセッションIDを使用
}
?>
攻撃手法:
防止策:
認証後にセッションIDを再生成する。
session_regenerate_id(true);
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);
攻撃手法:
防止策:
セッションIDをHTTPSを使用して送信し、HttpOnly
およびSecure
属性を付与する。
app.use(session({
secret: 'secret-key',
resave: false,
saveUninitialized: true,
cookie: { secure: true, httpOnly: true }
}));
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()
攻撃手法:
防止策:
ユーザー入力をサニタイズし、XSS脆弱性を防ぐ。
from markupsafe import escape
@app.route('/')
def index():
user = escape(session.get('user', 'guest'))
return f"<h1>Hello, {user}</h1>"
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();
}
}
攻撃手法:
防止策:
セッションIDをランダムかつ予測不可能に生成する。
@GetMapping("/login")
public String login(HttpSession session) {
session.invalidate(); // 以前のセッションを無効化
session = request.getSession(true); // 新しいセッションを生成
session.setAttribute("user", "guest");
return session.getId();
}
PHPの脆弱なコード例:
<?php
session_start();
if (!isset($_SESSION['user'])) {
$_SESSION['user'] = 'guest';
}
echo "Hello, " . $_SESSION['user'];
?>
攻撃手法:
防止策:
セッションIDを短時間で再生成し、有効期限を設ける。
session_start();
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// セッションが30分以上経過している場合、新しいセッションIDを生成する
session_regenerate_id(true);
$_SESSION['CREATED'] = time();
}
HttpOnly
およびSecure
属性を設定します。これにより、クッキーがJavaScriptからアクセスされず、HTTPS通信のみで送信されます。まとめ: セッションハイジャック攻撃は、セッションIDが不適切に管理されている場合に発生する非常に危険な攻撃です。セッションIDの再生成、HTTPSの使用、セッションIDの有効期限の設定などの防止策を講じることで、この攻撃からアプリケーションを守ることができます。また、セッションIDの予測や盗聴を防ぐために、セキュアなセッション管理
を実施することが重要です。