실제로 출시하는 앱을 위한 보안 교육입니다. 브라우저를 열고 해킹을 시작하세요.
<div align="center">
<h1>OSS - OopsSec Store</h1>
</div>
<div align="center">
<p>
<b>실제로 배포하는 앱을 위한 보안 훈련.</b>
</p>
<p>
<b>웹, API, 인증, 비즈니스 로직, 암호학, 공급망, AI 에이전트 및 MCP</b> 전반에 걸친 36개의 챌린지.
</p>
<p>
<b>Next.js, React, TypeScript 및 Prisma</b>로 구축된 의도적으로 취약한 전자상거래 앱을 공략하세요.<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 스토어프런트" width="100%"></a>
<br><sub><b>스토어프런트</b> · 공격 대상인 이커머스 앱</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="획득한 플래그를 추적하는 플레이어 대시보드" 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 고객 지원 어시스턴트" 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="11개 챕터에 걸친 챌린지 로드맵" 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="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="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분 · 브라우저 개발자 도구만 있으면 됩니다.</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="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="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="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)하고, 저장소에 스타를 눌러주시고, [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]
> 이 애플리케이션은 의도적인 보안 결함을 포함하고 있으며, 절대 프로덕션 환경에 배포해서는 안 됩니다.
## 기능
- 의도적으로 취약한 전자상거래 앱 (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 의존성) | ❌ |
| 플레이어 명예의 전당 | ✅ | ❌ | ❌ |
<sub>최종 검증: 2026년 9월, Juice Shop v20 및 DVWA 2.x 기준. 부정확한 내용을 발견하셨나요? [이슈를 열거나](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이 설치된 상태에서 동일한 네 가지 명령은 `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`에 추가된 행들은 오직 새 설치에만 도달하며, 전체 시드를 재실행하면 주문이 다시 생성됩니다.
앱은 스키마가 한 단계 뒤처진 데이터베이스에 대해서는 시작을 거부하며, 실행해야 할 명령을 알려줍니다. 대신 모든 것을 지우고 새로 시작하려면 `npm run docker:reset`(Docker) 또는 `npm run setup`(npm)을 사용하세요.
## 명예의 전당
모든 플래그를 찾으셨나요? [명예의 전당](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 엔드포인트 (인증, 장바구니, 주문, 상품, 플래그 등) |
| `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 라이선스입니다. 기여를 환영합니다.
기여 방법:
- 새로운 보안 챌린지 추가
- 연습 가이드(walkthrough) 작성 또는 개선
- 애플리케이션 확장
- 버그 보고 및 수정
- 문서 개선
계획된 작업은 [로드맵](https://github.com/users/kOaDT/projects/3)을 확인하거나 [good first issue](https://github.com/users/kOaDT/projects/3/views/6)를 선택하십시오.
모든 플래그를 찾으셨나요? [문서 사이트](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)의 기계 판독 가능 피드로 게시되며, 문서 배포 시마다 다시 생성됩니다.
## 프로젝트 통계
<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>