NE株式会社で実施した脆弱性勉強会の演習用リポジトリです。
意図的に脆弱な TODO アプリ「脆弱くん」を Docker でローカル起動し、実際に攻撃を体験しながら Web セキュリティの基礎を学びます。
詳細はSpeaker Deckの配布スライドを参照してください。
Warning
本リポジトリは教育目的のため、脆弱性を意図的に作り込んでいます。
インターネット公開環境・本番環境への展開は絶対に行わないでください。
- 脆弱性知識の向上・インシデント対応力の強化
- 攻撃手法を知ることで、守り方を学ぶ
- セキュリティを「他人事」ではなく開発文化として根付かせる
「ツールの使い方」ではなく「攻撃者の思考法」を身につけることがゴールです。
Burp Suite Community Edition を使いながら 4 つの攻撃シナリオを体験します。
| # | テーマ | 概要 |
|---|---|---|
| シナリオ ① | 4バイト文字による認証バイパス | MySQL の utf8mb3 と utf8mb4 の差異を突いた文字コード起因の認証回避 |
| シナリオ ② | Brute Force Attack(辞書攻撃) | Burp Suite Intruder とパスワードリストを使ったログイン突破 |
| シナリオ ③ | IDOR(不正な直接オブジェクト参照) | 認可チェック不備を突いて他ユーザーのデータを参照・改ざんする |
| シナリオ ④ | RCE(任意コード実行) | ファイルアップロード機能に PHP を送り込みサーバー上でコードを実行、機密情報を奪取する |
① 4バイト文字による認証バイパス
- MySQL の
utf8は実はutf8mb3(3バイトまでしか扱えない) - 4バイト文字(絵文字など)がパスワード末尾に付加されると DB 側で切り捨てが起き、意図しないパスワードで認証が通る
- 「文字コードと認証処理の相互作用」という盲点を学ぶ
② Brute Force Attack
- Burp Suite の Intruder 機能と辞書ファイル(
SecListsより抜粋)を使用 - ログイン試行制限がない実装の危険性を体験
- 防御策:MFA・アカウントロック・強力なパスワードポリシー
③ IDOR
- 認証(Authentication)と認可(Authorization)の違いを理解する
- 「ログインしているから安全」ではないことを実感
- パラメータ改ざん・API 改ざんによる他ユーザーデータへのアクセス
- 防御策:すべてのリクエストでサーバー側の所有者確認を行う
④ RCE(任意コード実行)
- 拡張子・MIME チェックなしのアップロード機能に PHP ファイルを送り込む
- Web シェルとして機能させ、環境変数・DB 認証情報を奪取する
- 防御策:拡張子制限・MIME チェック・実行領域の分離・WAF
| 役割 | 技術 |
|---|---|
| 言語 | PHP 8.2 |
| Web サーバー | Apache 2.4 |
| データベース | MySQL 8.0 |
| インフラ | Docker / Docker Compose |
| 演習ツール | Burp Suite Community Edition |
- Docker Desktop がインストール済みであること
- Burp Suite Community Edition がインストール済みであること(ダウンロード)
# 1. リポジトリをクローン
git clone <repository-url>
cd security_workshop_public
# 2. コンテナを起動
docker compose up -dコンテナ初回起動時に MySQL へのデモデータ投入が自動で行われます。
詳細な演習手順はこのファイルの上部に記載した、Speaker Deckのスライドを参照してください。
- 本アプリはローカル環境専用です。外部に公開しないでください。
- 演習で生成されるアップロードファイル(
src/public/files/todos/)は.gitignoreにより追跡対象外です。 - 本演習で学んだ攻撃手法を、許可のないシステムへ使用することは禁止します。
MIT License — 詳細は LICENSE.txt を参照してください。
- Yudai Makishima
- Kotone Sakurai