
実際に出荷するアプリのためのセキュリティトレーニング。ブラウザを開いてハッキングを始めましょう。
<div align="center">
<h1>OSS - OopsSec Store</h1>
</div>
<div align="center">
<p>
<b>実際に提供しているアプリのためのセキュリティトレーニング。</b>
</p>
<p>
<b>Web、API、認証、ビジネスロジック、暗号、サプライチェーン、AIエージェント、MCP</b>にわたる36のチャレンジ。
</p>
<p>
<b>Next.js、React、TypeScript、Prisma</b>で構築された、意図的に脆弱なEコマースアプリを攻略せよ。<br>
バグを見つけ、悪用し、なぜそれが機能するのかを理解する。
</p>
<p>
<a href="https://hub.docker.com/r/leogra/oss-oopssec-store">Docker Hub</a> ·
<a href="https://www.npmjs.com/package/create-oss-store">npm</a> ·
<a href="https://koadt.github.io/oss-oopssec-store/roadmap">ロードマップ</a> ·
<a href="https://koadt.github.io/oss-oopssec-store">ウォークスルー</a> ·
<a href="https://github.com/kOaDT/oss-oopssec-store/blob/main/CONTRIBUTING.md">コントリビューション</a> ·
<a href="https://github.com/users/kOaDT/projects/3/views/6">初心者向けイシュー</a>
</p>
[](https://vwad.owasp.org/app/oopssec-store/)
[](https://tryhackme.com/jr/oopssecstorethesummeraudit)

<br>
[](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
[](https://github.com/kOaDT/oss-oopssec-store/pulls)
[](https://github.com/users/kOaDT/projects/3/views/6)
<br>
[](https://github.com/kOaDT/oss-oopssec-store/stargazers)
[](https://github.com/kOaDT/oss-oopssec-store/network)
</div>
```bash
____ ____ ____ ____ ____ ____ _
/ __ \/ __// __/ / __ \ ___ ___ ___ / __/ ___ ____ / __/ / /_ ___ ____ ___
/ /_/ /\ \ _\ \ / /_/ // _ \ / _ \(_-<_\ \ / -_)/ __/_\ \ / __// _ \ / __// -_)
\____/___//___/ \____/ \___// .__/___/___/ \__/ \__//___/ \__/ \___//_/ \__/
/_/
# Start with Node.js
npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start
# Start with Docker
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
# Then open http://localhost:3000 and start hacking
```
<div align="center">
<table>
<tr>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-0.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/2656002fea49e81bc7876fc998d1bf1ddf664257bb023c03705e322e6dada5fb/9a5c520942d272122aeba14fd7a799dfecf60a99e0990904bff05e59ba634d37-display-v1.webp" alt="OopsSec Store storefront" width="100%"></a>
<br><sub><b>Storefront</b> · あなたが攻撃する e コマースアプリ</sub>
</td>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-1.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/a3edf2b1a9311abfe35c5cb956302c0e6568a5c8ba891f0d2c4056defa19b078/24355e727585878af96376d809ee68dce57dd5823691ccd00b8fb8ae424750f6-display-v1.webp" alt="Player dashboard tracking captured flags" width="100%"></a>
<br><sub><b>プレイヤーダッシュボード</b> · 進捗、難易度、カテゴリ別の内訳</sub>
</td>
</tr>
<tr>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-2.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/05a9601b40eb202f0ef72eae225d69bfceb5a6600361408be681131a51d29da7/41e77928d6eb00585c020ca88a60f8fcef577c5741c8fba826ed8ac1982c362e-display-v1.webp" alt="OSSBot AI customer support assistant" width="100%"></a>
<br><sub><b>OSSBot</b> · プロンプトインジェクションの対象となる AI サポートアシスタント</sub>
</td>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-3.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/91565414292b83d7dca7b97206404d899358e7b94ae9acad9c2a30d1886b8751/beac914224c61942f48311d8d3405292def762be276cffd16400ec6b6e2ec473-display-v1.webp" alt="Challenge roadmap across 11 chapters" width="100%"></a>
<br><sub><b>ロードマップ</b> · 本番コードに紛れ込むバグたち</sub>
</td>
</tr>
</table>
<sub>スクリーンショットをクリックするとフルサイズで表示されます。</sub>
</div>
---
## はじめに
<table>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/1-15803d?style=for-the-badge" alt="Step 1"></td>
<td valign="top">
<b>ラボを起動する</b><br>
<code>npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start</code><br>
<sub>または <a href="#docker">Docker で実行する</a>。ストアは <a href="http://localhost:3000">localhost:3000</a> で起動します。</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/2-15803d?style=for-the-badge" alt="Step 2"></td>
<td valign="top">
<b>チャレンジ #1 に挑戦する</b><br>
<a href="http://localhost:3000/vulnerabilities/public-env-variable">公開環境変数の漏洩</a>: Next.js がクライアントバンドルに埋め込んでしまう決済用シークレット。<br>
<sub>初級 · 15〜20 分 · 必要なのはブラウザの devtools だけ。</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/3-15803d?style=for-the-badge" alt="Step 3"></td>
<td valign="top">
<b>行き詰まったら? ウォークスルーを読む</b><br>
すべてのチャレンジに用意されています。脆弱性からエクスプロイト、修正まで。<br>
<sub>最初の一本: <a href="https://koadt.github.io/oss-oopssec-store/posts/next-public-env-variable-leak/">Reading Secrets From the Browser: The NEXT_PUBLIC_ Trap in Next.js</a>。</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/4-15803d?style=for-the-badge" alt="Step 4"></td>
<td valign="top">
<b>フラグを検証する</b><br>
<code>OSS{...}</code> をフラグチェッカー(全ページに表示されるフローティングウィジェット)に貼り付けます。<br>
<sub><a href="http://localhost:3000/player-dashboard">プレイヤーダッシュボード</a>で残りのフラグを追跡できます。</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/5-15803d?style=for-the-badge" alt="Step 5"></td>
<td valign="top">
<b>次のチャレンジを選ぶ</b><br>
<a href="https://koadt.github.io/oss-oopssec-store/roadmap">ロードマップ</a>では、すべてのチャレンジが章ごとに整理されています: 難易度、所要時間の目安、前提条件。<br>
<sub>次のカードに進み、ステップ 2 に戻りましょう。 ↻</sub>
</td>
</tr>
</table>
> [!TIP]
> すべて攻略しましたか? [Hall of Fame に参加](#hall-of-fame)し、リポジトリにスターを付け、あなたのルートを [Show your solve](https://github.com/kOaDT/oss-oopssec-store/discussions/categories/show-your-solve) に投稿しましょう。
<sub>オフェンシブセキュリティは初めてですか? <a href="https://tryhackme.com/jr/oopssecstorethesummeraudit">TryHackMe ルーム</a>では、最初のフラグをガイド付きのストーリーで体験できます。</sub>
---
## 目次
- [機能](#features)
- [なぜ OopsSec Store なのか?](#why-oopssec-store)
- [インストール](#installation)
- [クイックスタート (npm)](#quick-start)
- [Docker](#docker)
- [既存インストールの更新](#updating-an-existing-install)
- [殿堂](#hall-of-fame)
- [コミュニティ](#community)
- [プロジェクト構成](#project-structure)
- [テスト](#testing)
- [免責事項](#disclaimer)
- [コントリビューション](#contributing)
- [教育者キット](#-using-oopssec-store-in-a-course-or-ctf)
- [プロジェクト統計](#project-stats)
---
> [!WARNING]
> このアプリケーションには意図的なセキュリティ上の欠陥が含まれているため、本番環境にデプロイしてはなりません。
## 機能
- 意図的に脆弱な e コマースアプリ (XSS、CSRF、IDOR、JWT 攻撃、パストラバーサル、SQL インジェクションなど)
- Next.js (App Router)、React、TypeScript、Prisma、SQLite で構築
- 攻撃ベクトルが文書化された REST API
- 11 章にわたる 36 の CTF チャレンジを、体系的な[学習ロードマップ](https://koadt.github.io/oss-oopssec-store/roadmap)として構成
- 各チャレンジの脆弱性ドキュメントとコミュニティによるウォークスルー
- ガイド付きの [TryHackMe ルーム](https://tryhackme.com/jr/oopssecstorethesummeraudit): _The Summer Audit_、8 タスクと 7 フラグで、初心者向けの物語形式の入門を提供
- エクスプロイトが今も機能することを検証する自動テスト (誤って脆弱性を修正してしまう PR は CI で失敗します)
## なぜ OopsSec Store なのか?
モダンなフレームワークは、セキュリティ脆弱性が現れる場所と、その修正方法を変えます。OopsSec Store は、古典的な脆弱性クラスを、今日多くの開発者が使用しているスタック (Next.js App Router、React、TypeScript、Prisma) に組み込みます。
サーバーレンダリングコンポーネント、ミドルウェア、ORM は、異なる信頼境界と障害モードをもたらします。いくつかのチャレンジでは、このスタックに対して公開済みの CVE も再現しています。
カリキュラムは、AI 支援開発とともに登場した攻撃対象領域もカバーしています。カスタマーサポートエージェントに対するプロンプトインジェクション、MCP ツールポイズニング、バックドアが仕込まれたコーディングエージェントのルールファイル、そしてエンドツーエンドでシミュレートされた npm タイポスクワッティングの連鎖です。
| | OopsSec Store | Juice Shop | DVWA |
| ---------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------- |
| スタック | Next.js · React · TypeScript · Prisma | Node.js · Express · Angular | PHP · MySQL |
| セットアップ | `npx create-oss-store`(1分未満)/ Docker | Docker / npm | Docker / 手動 LAMP |
| CTF フラグ | ✅ 組み込み(静的フラグ) | ✅ オプトイン、インスタンスごとのフラグ(`CTF_KEY`)、CTFd/RootTheBox/FBCTF | ❌ |
| ガイド付き学習ロードマップ | ✅ 1 ロードマップ、11 章、36 フラグ | ❌ スコアボードのみ | 一部(セキュリティレベル) |
| すべてのチャレンジのウォークスルー | ✅ | ✅ コンパニオンガイド | 一部(ヒント) |
| LLM プロンプトインジェクション | ✅ 無料の API キーを接続 | ✅ v20+、独自の LLM を持ち込み設定 | ❌ |
| MCP ツールポイズニング | ✅ | ❌ | ❌ |
| AI コーディングエージェントのバックドア(汚染されたルールファイル) | ✅ | ❌ | ❌ |
| サプライチェーン攻撃チェーン | ✅ エンドツーエンドでシミュレーション: npm タイポスクワット → ルールバックドア | 一部(特定のみ) | ❌ |
| 実際の CVE に基づくチャレンジ | ✅ Next.js / React フレームワークの CVE | 一部(脆弱な npm 依存関係) | ❌ |
| プレイヤー向け Hall of Fame | ✅ | ❌ | ❌ |
<sub>最終確認: 2026年9月、Juice Shop v20 および DVWA 2.x に対して実施。誤りを見つけましたか? [Issue を作成](https://github.com/kOaDT/oss-oopssec-store/issues) するか、[PR を作成](https://github.com/kOaDT/oss-oopssec-store/pulls) してください。</sub>
## インストール
### クイックスタート
```bash
npx create-oss-store my-ctf-lab
cd my-ctf-lab
npm start
```
次に、ブラウザで http://localhost:3000 を開きます。
### 手動セットアップ
リポジトリをクローンし、セットアップスクリプトを実行します:
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
npm run setup
```
これにより `.env` ファイルが作成され、依存関係がインストールされ、SQLite データベースがセットアップされ、CTF フラグが投入され、アプリがポート 3000 で起動します。
### Docker
Node.js は不要です。[Docker](https://docs.docker.com/get-docker/) だけが必要です。
> `127.0.0.1:3000:3000` により、ラボは自分のマシンからのみアクセス可能になります。`-p 3000:3000` をそのまま使うのは、自分が管理する隔離された VM 上でのみにしてください。
#### Docker Hub から(最速)
```bash
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
```
再起動をまたいでデータを永続化するには:
```bash
docker run -p 127.0.0.1:3000:3000 -v oss-data:/app/data leogra/oss-oopssec-store
```
#### ソースから (Docker Compose)
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
docker compose up -d # Start in background (builds the image on first run)
docker compose logs -f # Follow container logs
docker compose down # Stop the container
docker compose down -v # Stop and wipe data for a fresh start
```
npm がインストールされている場合、同じ4つは `npm run docker:up`、`docker:logs`、`docker:down`、`docker:reset` です。
データベースは初回起動時に初期化されます。データは Docker の名前付きボリュームを介して再起動後も保持され、フラグの進捗、ユーザー、アップロードが含まれます。
### 既存のインストールを更新する
新しいバージョンは通常、新たな課題をもたらし、それに伴ってデータベースがこれまで見たことのないテーブルや行も生じます。破壊的変更については [changelog](https://github.com/koadt/oss-oopssec-store/blob/main/CHANGELOG.md) を確認し、最初からやり直さずに追いついてください:
```bash
npm run db:upgrade # local clone
docker compose up -d --build # Docker: the entrypoint upgrades on start
```
これによりクライアントが再生成され、スキーマがプッシュされた後、すべてのインストールに必要な行(フラグ、ヒント、SQLインジェクションのカナリア)が再適用されます。あなたの注文、キャプチャしたフラグ、ユーザー、アップロードはそのまま残ります。すでに発行されたトークンはその価値を保持します。
引き継がれないのはデモカタログです。`prisma/seed.ts` に追加された行は新規インストールにしか反映されず、シード全体を再実行するとあなたの注文が再作成されてしまいます。
アプリはスキーマが1つ遅れているデータベースに対して起動を拒否し、実行すべきコマンドを表示します。代わりにすべてを消去して最初からやり直すには、`npm run docker:reset`(Docker)または `npm run setup`(npm)を使用してください。
## Hall of fame
すべてのフラグを見つけましたか?プルリクエストを開いて [Hall of Fame](https://github.com/koadt/oss-oopssec-store/blob/main/hall-of-fame/data.json) に参加しましょう。`hall-of-fame/data.json` にエントリを追加すると、アプリの `/hall-of-fame` ページにあなたのプロフィールが表示されます。
エントリがマージされると、バッジが生成され、ドキュメントサイトから配信されます:
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
1200x630 のソーシャルカードが、同じパスに `.png` 拡張子で配置されています。
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
どちらも `/hall-of-fame` ページのカードから、Markdown、HTML、またはベア URL としてコピー&ペーストできます。
## コミュニティ
質問、解決策、フィードバックは [Discussions](https://github.com/kOaDT/oss-oopssec-store/discussions) に集まっています。
| 行き先 | 目的 |
| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| [🧩 チャレンジで行き詰まったら](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=stuck-on-a-challenge) | エクスプロイトが発火しない、フラグが検証されない |
| [🛠️ セットアップとインストール](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=setup-and-install) | ラボの起動における Docker、npm、Node の問題 |
| [🏆 自分の解答を共有する](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=show-your-solve) | ウォークスルーでは扱っていないフラグへの到達経路 |
| [💡 チャレンジのアイデア](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=challenge-ideas) | カリキュラムに追加する価値のある脆弱性クラス |
| [🎓 OopsSec を使った教育](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=teaching-with-oopssec) | クラス、ブートキャンプ、チームでラボを運用する |
| [Issues](https://github.com/kOaDT/oss-oopssec-store/issues) | ラボ自体のバグ、およびそれらに限る |
## プロジェクト構成
| フォルダー | 説明 |
| -------------------------- | -------------------------------------------------------------------------------------------------- |
| `app/` | Next.js App Router: ページ、API ルート、React コンポーネント |
| `app/api/` | REST API エンドポイント (auth、cart、orders、products、flags など) |
| `app/components/` | React UI コンポーネント (Header、Footer、ProductCard など) |
| `app/vulnerabilities/` | 各脆弱性を解説するページ |
| `content/vulnerabilities/` | 脆弱性と攻撃ベクトルの Markdown による説明 |
| `lib/` | 共有ユーティリティ: DB クライアント、認証、API ヘルパー、型 |
| `prisma/` | データベーススキーマ、シードスクリプト、および `flags.ts`: CTF フラグとそのヒント |
| `public/` | 静的アセットとエクスプロイトペイロード (例: CSRF デモ) |
| `hooks/` | カスタム React フック (認証など) |
| `scripts/` | セットアップと自動化スクリプト |
| `docs/` | コミュニティのウォークスルーを掲載した静的ドキュメントサイト |
| `hall-of-fame/` | すべてのフラグを見つけたプレイヤーのプロフィール |
| `packages/` | スキャフォールディング用の NPM パッケージ `create-oss-store` (および `react-toastfy` などのラボ隔離物) |
| `lab/quarantine/` | サプライチェーンチャレンジ用の無害化された悪性ペイロード (データとして扱い、命令として扱わないこと) |
| `tests/` | エクスプロイトを検証する Jest ユニットテストと API テスト |
| `cypress/` | 完全なエクスプロイトワークフロー向けの E2E テスト |
## テスト
このプロジェクトには、すべてのエクスプロイトチェーンとフラグが引き続き機能することを確認するセキュリティ回帰テストが含まれています。これらのテストは、意図的に安全でない動作を検証します。すべてのPRで実行されるため、誤って脆弱性にパッチを当ててしまった場合、CIがそれを検出します。
### テストの実行
```bash
# Unit tests (utility functions: MD5 hashing, JWT, input filters)
npm run test:unit
# API exploitation tests (requires a running server)
npm run test:api
# E2E exploitation tests (requires a running server)
npm run test:e2e
# Open Cypress interactive mode
npm run test:e2e:open
# All tests
npm run test:ci
```
## 免責事項
> [!CAUTION]
> このプロジェクトは教育および許可されたセキュリティテストのみを目的としています。
> 意図的に脆弱性と安全でない設定が含まれています。作者は、いかなる誤用、損害、または不正アクセスについても責任を負いません。隔離された環境で使用してください。
## コントリビューション
OSS – OopsSec Store は MIT ライセンスです。コントリビューションを歓迎します。
コントリビューションの方法:
- 新しいセキュリティチャレンジを追加する
- ウォークスルーを書く、または改善する
- アプリケーションを拡張する
- バグを報告し、修正する
- ドキュメントを改善する
計画中の作業については [Roadmap](https://github.com/users/kOaDT/projects/3) を確認するか、[good first issue](https://github.com/users/kOaDT/projects/3/views/6) を取得してください。
すべてのフラグを見つけましたか? [docs サイト](https://koadt.github.io/oss-oopssec-store)でウォークスルーを共有してください。
バグや提案については、[GitHub Issue](https://github.com/kOaDT/oss-oopssec-store/issues) を作成してください。ガイドラインについては [CONTRIBUTING.md](https://github.com/koadt/oss-oopssec-store/blob/main/CONTRIBUTING.md) を参照してください。
## 🎓 コースや CTF で OopsSec Store を使用しますか?
[Educator Kit](https://github.com/koadt/oss-oopssec-store/blob/main/EDUCATORS.md) をチェックしてください - OWASP カバレッジグリッド、シラバステンプレート、デプロイに関する FAQ、学生レポートテンプレートを備えたすぐに使えるガイドです。カリキュラムを中心に独自のツールを構築しますか? すべては [`challenges.json`](https://koadt.github.io/oss-oopssec-store/challenges.json) で機械可読フィードとして公開されており、docs のデプロイごとに再生成されます。
## プロジェクト統計
<div align="center">
[](https://koadt.github.io/oss-oopssec-store/roadmap)
<sub>カリキュラム自体と GitHub API からレンダリングされ、毎日更新されます。その行にあなたのアバターを載せませんか? <a href="https://github.com/users/kOaDT/projects/3/views/6">good first issue</a> を取得してください。</sub>
</div>
---
<div align="center">
作者: [kOaDT](https://github.com/kOaDT)
プロジェクト: [OopsSec Store](https://github.com/kOaDT/oss-oopssec-store)
連絡先: [email protected]
ライセンス: [MIT](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
フォーク内の LICENSE ファイルを削除または変更しないでください。
</div>