Django Security Lab

Django PostgreSQL
Django Security Lab

概要

Django Security Lab は、Django 初心者向けに Web アプリケーションの脆弱性を視覚的・インタラクティブに体験できるセキュリティ学習ラボです。意図的に脆弱性を組み込んだ模擬銀行アプリ(SafeBank)と、実際の攻撃をシミュレーションする悪意のある Web サイト(EvilSite)の 2 つで構成されており、攻撃の仕組みから Django の対策方法までを一貫して学べます。各自のローカル環境で動作するため、GitHub からリポジトリをクローンするだけで学習を開始できます。

Django Security Lab は、次の 2 つの課題意識から生まれました。

  • Web アプリの脆弱性を 初心者向けに、正確かつ分かりやすく 説明する教材が少ない
  • Django はセキュリティを重視したフレームワークであるにもかかわらず、その 組み込みセキュリティ機能が初心者には理解しにくい 形で実装されている

これらを解決するため、攻撃の流れと対策の因果関係が視覚的に追えるインタラクティブなラボを開発しました。

ラボは 2 つのアプリで構成されています。

  • SafeBanksafebank.com:8000): OWASP Top 10 に基づく脆弱性を意図的に組み込んだ模擬銀行アプリ。学習者はソースコードを実際に動かしながら脆弱性の挙動を確認し、Django の組み込み機能(CSRF トークン、自動エスケープ、@transaction.atomic など)を使った修正方法を学びます。

  • EvilSiteevilsite.com:8001): SafeBank に対するクロスサイト攻撃をシミュレーションする攻撃者サイト。CSRF・クリックジャッキング・認証情報の窃取・Cookie 窃取などの攻撃ペイロードが組み込まれており、攻撃者側の動きをリアルに体験できます。

開発のこだわり

  • OWASP Top 10 に基づく 15 種類の脆弱性のケーススタディを、攻撃から対策まで一貫して体験できるラボとして設計・実装
  • 単なる攻撃可能なデモアプリではなく、攻撃の各段階の因果関係が視覚的に追えるよう、ラボ全体の学習フローを独自設計
  • 攻撃者サイト(EvilSite)と攻撃パネル・クレデンシャルパネルを実装し、攻撃者側の動きをリアルタイムで確認できる仕組みを実現
  • セキュリティの専門知識を活かし、脆弱性の選定・攻撃シナリオの設計・Django による修正パターンの実装まで一人で担当
  • Burp Suite Community Edition を使ったリアルな脆弱性検証にも対応

工夫した点・学んだこと

本プロジェクトで最も苦労したのは、ラボ全体の学習設計です。単に「攻撃できるダミーアプリ」を作るのではなく、攻撃の各段階の繋がりと因果関係が初心者にも自明に見えるよう、脆弱性の選定・攻撃シナリオの設計・対策方法の提示まで、一貫した学習フローを構築する必要がありました。「どの脆弱性を選ぶか」「攻撃の流れをどう見せるか」「対策をどう体験させるか」という設計判断の連続が、技術的な実装と同じくらい難しい作業でした。

技術面では、攻撃者サイト(EvilSite)の実装が特に挑戦的でした。CSRF 攻撃のペイロードを SafeBank に対して実際に実行し、攻撃の成功・失敗・タイムスタンプをリアルタイムでログに残す攻撃パネルを実装することで、学習者が攻撃者の視点を具体的に体験できる仕組みを作りました。

このプロジェクト全体を通じて、ラボに含まれている脆弱性について、 「なんとなく分かる」 レベルから 「ちゃんと理解している」 レベルに引き上げることができました。

機能一覧

SafeBank(模擬銀行アプリ)

  • OWASP Top 10 2025 に基づく 15 種類の脆弱性を意図的に組み込み
  • 各脆弱性に対応した Django の修正パターンをソースコード上で学習
  • Burp Suite Community Edition を使ったリアルな脆弱性検証に対応

EvilSite(攻撃者サイト)

  • SafeBank に対するクロスサイト攻撃(CSRF・クリックジャッキング・認証情報窃取・Cookie 窃取)をシミュレーション
  • 攻撃パネル/attacker-panel/): EvilSite が閲覧されるたびに攻撃ログを記録。攻撃の種類(メールアドレス改ざん / 不正送金)・成功/失敗・タイムスタンプ・閲覧回数・ペイロード実行回数をリアルタイムで表示
  • クレデンシャルパネル/credentials-panel/): 偽ログインページ(/fake-login/)で窃取したユーザー名・パスワードをプレーンテキストで表示し、認証情報窃取の危険性を可視化

SafeBank の脆弱性とEvilSiteの攻撃一覧

技術スタック

  • フロントエンド: HTML、CSS、JavaScript、Bootstrap 5
  • バックエンド: Python 3、Django 6.0
  • データベース: PostgreSQL(Docker イメージ)
  • PDF 生成: ReportLab
  • 設定管理: python-decouple
  • HTTPS 開発サーバー: django-extensions(runserver_plus
  • セキュリティテスト: Burp Suite Community Edition

アーキテクチャ

  • SafeBanksafebank.com:8000)と EvilSiteevilsite.com:8001)の 2 アプリがローカル環境で同時稼働
  • データベースは PostgreSQL の Docker イメージを使用
  • HTTPS 環境は django-extensionsrunserver_plus で再現し、Cookie の Secure 属性や HSTS などの本番相当のセキュリティ設定を検証可能
  • 脆弱性の修正・対策はソースコードを直接編集することで体験する設計(VS Code などの IDE を使用)
  • Burp Suite Community Edition をプロキシとして設定することで、HTTP リクエスト・レスポンスの傍受・改ざん・脆弱性検証が可能

スクリーンショット

XSS 反射型
XSS 反射型
XSS 格納型
XSS 格納型
攻撃者サイト
攻撃者サイト
CSRF攻撃による不正送金
CSRF攻撃による不正送金
パストラバーサル攻撃
パストラバーサル攻撃
攻撃パネル
攻撃パネル

デモ動画