OWASP VulnerableApp
๋ถ์๊ณ , ์ค์บํ๊ณ , ์ฌํํ๊ณ , ๋ฒค์น๋งํฌํ๊ณ , ๊ฐ์ ํ๋ผ.
OWASP VulnerableApp์ ์ฌํ ๊ฐ๋ฅํ ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ํตํด ๋ณด์ ์ค์บ๋๋ฅผ ๊ฒ์ฆํ๊ณ ๋ฒค์น๋งํนํ๋ ๊ฒ์ ์ฃผ๋ชฉ์ ์ผ๋ก ์ค๊ณ๋, ์๋์ ์ผ๋ก ์ทจ์ฝํ๊ฒ ๋ง๋ ๋ชจ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ๋์์ ํ์ต๊ณผ ์คํ ์ฉ๋๋ก๋ ํ์ฉํ ์ ์์ต๋๋ค.
๐ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ
๊ธฐ์กด์ ์ทจ์ฝํ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๊ณผ ๋ฌ๋ฆฌ, VulnerableApp์ ์ ์ ์ธ ํ์ต์ฉ ์ฑ์ด ์๋๋ผ ํ ์คํธ ๊ฐ๋ฅํ ๋ณด์ ์ํ๊ณ๋ก ์ค๊ณ๋์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ก ํ ์ ์๋ ๊ฒ:
- ๐ฌ Burp Suite, OWASP ZAP, ์ปค์คํ DAST ์์ง ๋ฑ ๋ค์ํ ๋๊ตฌ์ ๋ํ ์ค์บ๋ ๋ฒค์น๋งํน
- ๐งฉ ํต์ฌ ์๋น์ค๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ์๋ก์ด ์๋๋ฆฌ์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ชจ๋ํ ์ทจ์ฝ์ ์ค๊ณ
- ๐ ๋ฆด๋ฆฌ์ค์ ํ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์น ๋ณด์ ํ๊ท ํ ์คํธ
- ๐ฏ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ํจํด์ ๋ฐ์ํ ํ์ค์ ์ธ ๊ณต๊ฒฉ ํ๋ฉด ์๋ฎฌ๋ ์ด์
- ๐งช ๋ฐ๋ณต ๊ฐ๋ฅํ ์ค์บ๋ ๊ฒฐ๊ณผ๋ฅผ ์ํ ๊ฒฐ์ ๋ก ์ (deterministic) ์ทจ์ฝ์ ๋์
- ๐ง ๋ณด์ ์์ง๋์ด, ์ฐ๊ตฌ์, ๊ต์ก์๋ฅผ ์ํด ๋ง๋ค์ด์ง

VulnerableApp์ด ๋์์ค ์ ์๋ ๊ฒ:
- ์๋ ค์ง ์ทจ์ฝ์ ํจํด์ ๋ํด ๋ณด์ ๋๊ตฌ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฒ์ฆ
- ๋ณด์ ์คํ์ ์ํ ํต์ ๋ ํ๊ฒฝ ๊ตฌ์ถ
- ์๋ก์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ ๋๋ง๋ค ์ทจ์ฝ์ ์ปค๋ฒ๋ฆฌ์ง ํ์ฅ
- ์ผ๊ด๋๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ณด์ ํ ์คํธ ํ์ดํ๋ผ์ธ ์คํ
โ๏ธ ์ ์ค์ํ๊ฐ
๋๋ถ๋ถ์ ์ทจ์ฝํ ์ ํ๋ฆฌ์ผ์ด์ ์:
- ์ ์ ์ด๊ณ
- ํ์ฅํ๊ธฐ ์ด๋ ค์ฐ๋ฉฐ
- ์๋ ํ์ต๋ง์ ์ํด ์ค๊ณ๋์ด ์์ต๋๋ค
VulnerableApp์ด ์งํฅํ๋ ๊ฒ:
์๋ํ, ์ฌํ์ฑ, ๊ทธ๋ฆฌ๊ณ ์งํ
์ฌ์ฉ์ ์ธํฐํ์ด์ค

ํ๋ก์ ํธ ์คํํ๊ธฐ
ํ๋ก์ ํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
- ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ Docker ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ ์์ ํ VulnerableApp์ ์คํํฉ๋๋ค:
- Docker Compose๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ค์นํฉ๋๋ค
- ์ด GitHub ์ ์ฅ์๋ฅผ ํด๋ก ํฉ๋๋ค
- ํฐ๋ฏธ๋์ ์ด๊ณ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค
docker-compose pull && docker-compose up๋ช ๋ น์ ์คํํฉ๋๋ค- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ
http://localhost๋ก ์ด๋ํ๋ฉด VulnerableApp ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํ์๋ฉ๋๋ค. - ๋ก์ปฌ SMTP ์๋ฒ๊ฐ ์บก์ฒํ ์ด๋ฉ์ผ์ ํ์ธํ๋ ค๋ฉด
http://localhost/mailpit/์์ Mailpit๋ ์ด์ฉํ ์ ์์ต๋๋ค.
์ฐธ๊ณ : ์์ ๋จ๊ณ๋ ์ต์ ๋ฏธ์ถ์(non-release) ๋ฒ์ ์ VulnerableApp์ ์คํํฉ๋๋ค. ์ต์ ์์ ๋ฒ์ ์ ์คํํ๋ ค๋ฉด Docker์ latest ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ VulnerableApp์ ๋
๋ฆฝ ์คํํ(standalone) ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์คํํ๋ ๊ฒ์
๋๋ค:
- GitHub์ ๋ฆด๋ฆฌ์ค ์น์ ์ผ๋ก ์ด๋ํ์ฌ ์ต์ ๋ฒ์ ์ JAR ํ์ผ์ ๋ค์ด๋ก๋ํฉ๋๋ค
- ํฐ๋ฏธ๋์ ์ด๊ณ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค
java -jar VulnerableApp-*๋ช ๋ น์ ์คํํฉ๋๋ค- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ
http://localhost:9090/VulnerableApp์ผ๋ก ์ด๋ํ๋ฉด ๋ ๊ฑฐ์(Legacy) ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํ์๋ฉ๋๋ค.
ํ๋ก์ ํธ ๋น๋ํ๊ธฐ
ํ๋ก์ ํธ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋น๋ํ ์ ์์ต๋๋ค:
- ์์ ํ VulnerableApp์ ์คํํ๊ธฐ ์ํ Docker ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋น๋ํ๊ธฐ:
./gradlew jibDockerBuild๋ช ๋ น์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค- Docker-Compose๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๊ฐ์ ๋๋ ํฐ๋ฆฌ์์
docker-compose up์ ์คํํฉ๋๋ค - ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ
http://localhost๋ก ์ด๋ํ๋ฉด VulnerableApp ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํ์๋ฉ๋๋ค.
- ๋ ๊ฑฐ์ UI ๋๋ REST API๋ฅผ ์ฌ์ฉํ๋ SpringBoot ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋น๋ํ๊ธฐ โ ๋๋ฒ๊น
์ ์ ์ฉํฉ๋๋ค:
- ํ๋ก์ ํธ๋ฅผ IDE๋ก ๊ฐ์ ธ์์ ์คํํฉ๋๋ค
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ
http://localhost:9090/VulnerableApp์ผ๋ก ์ด๋ํ๋ฉด ๋๋ฒ๊น ๋ฐ ํ ์คํธ๋ฅผ ์ํ ๋ ๊ฑฐ์ VulnerableApp ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ํ์๋ฉ๋๋ค.
ํ๋ก์ ํธ ๊ธฐ์ฌํ๊ธฐ
ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
- ๊ฐ๋ฐ์์ด๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์ด์ ๋ง ์์ํ๋ ๋จ๊ณ๋ผ๋ฉด,
good first issue๋ผ๋ฒจ์ด ๋ถ์ ์ด์ ๋ชฉ๋ก์ ํ์ธํด๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์์ํ๊ธฐ ์ข์ ํญ๋ชฉ๋ค์ ๋๋ค. - ๊ฐ๋ฐ์์ด๊ฑฐ๋ ๋ณด์ ์ ๋ฌธ๊ฐ๋ก์ ์๋ก์ด ์ ํ์ ์ทจ์ฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด,
./gradlew GenerateSampleVulnerability๋ช ๋ น์ ์คํํ์ธ์. ์ด ๋ช ๋ น์ ์๋ฆฌํ์์(placeholder)์ ์ฃผ์์ด ํฌํจ๋ ํ ํ๋ฆฟ์ ์์ฑํฉ๋๋ค. ๋ณ๊ฒฝ๋ ํ์ผ์ ๋ช ๋ น ์คํ ๋ก๊ทธ๋ git ํ์คํ ๋ฆฌ์์ ํ์ธํ ์ ์์ต๋๋ค. ํด๋น ํ์ผ๋ก ์ด๋ํด ์๋ฆฌํ์์๋ฅผ ์ฑ์ฐ๊ณ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์. - ํ๋ก์ ํธ์ ์ฑ์ฅ์ด๋ ํ๋ณด์ ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด, ํ ๋ก (discussion)์ด๋ ์ด์ ์น์ ์ ์์ ๋กญ๊ฒ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์. ๊ธฐ๊บผ์ด ๋ ผ์ํ๊ฒ ์ต๋๋ค.
๋ชจ๋ UI๋ก ํ ์คํธํ๊ธฐ
VulnerableApp-facade๋ VulnerableApp์ ์ํ ๋ชจ๋ UI๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ก์ปฌ์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ ๋ชจ๋ UI๋ก ํ ์คํธํ๋ ค๋ฉด:
- ์ฌ์ ์ค๋น: Docker์ Docker-Compose๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- ํ
์คํธ ์คํฌ๋ฆฝํธ ์คํ:
- Windows:
.\scripts\testWithModernUI.bat - Linux/Mac:
./scripts/testWithModernUI.sh
- Windows:
์ด ์คํฌ๋ฆฝํธ๋ ๋ก์ปฌ์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ Docker ์ด๋ฏธ์ง(sasanlabs/owasp-vulnerableapp:unreleased)๋ก ๋น๋ํ๊ณ , docker-compose.local.yml์ ์ฌ์ฉํด facade, jsp, php ์๋น์ค๋ฅผ ํฌํจํ ์ ์ฒด ์คํ์ ์คํํฉ๋๋ค.
-
UI ์ ์: ๋ธ๋ผ์ฐ์ ์์
http://localhost๋ก ์ด๋ํ๋ฉด ๋ณ๊ฒฝ๋ ๋ด์ฉ์ด ๋ฐ์๋ ๋ชจ๋ UI๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. -
Mailpit ์ ์: ๋ธ๋ผ์ฐ์ ์์
http://localhost/mailpit/๋ก ์ด๋ํ๋ฉด ๋ก์ปฌ SMTP ์๋ฒ๊ฐ ์บก์ฒํ ์ด๋ฉ์ผ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ์ฉ๋ ๊ธฐ์
- Java 17
- Spring Boot
- ReactJS
- Javascript/TypeScript
๋ด์ฅ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ
๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ค๋ฉด ๋ค์ ์ฃผ์๋ก ์ด๋ํ์ธ์: http://localhost:9090/VulnerableApp/h2
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด:
JDBC Url: jdbc:h2:mem:testdb
User Name: admin
Password: hacker
ํ์ฌ ๋ค๋ฃจ๊ณ ์๋ ์ทจ์ฝ์ ๋ชฉ๋ก
- JWT ์ทจ์ฝ์
- ์ปค๋งจ๋ ์ธ์ ์
- ์ํธํ ๊ด๋ จ ์ทจ์ฝ์
- ํ์ผ ์ ๋ก๋ ์ทจ์ฝ์
- ๊ฒฝ๋ก ํ์(Path Traversal) ์ทจ์ฝ์
- SQL ์ธ์ ์
- XSS
- XXE
- ์คํ ๋ฆฌ๋ค์ด๋ ํธ
- SSRF
- IDOR
- ํด๋ฆญ์ฌํน(Clickjacking)
- LDAP ์ธ์ ์
- ์ธ์ฆ ์ทจ์ฝ์
์ค์บ๋ ๋ฒค์น๋งํนํ๊ธฐ
VulnerableApp์ ์ค์บ๋๊ฐ ์ฐพ์๋ธ ๊ฒฐ๊ณผ๋ฅผ ํ๋ก์ ํธ์ ๋ด์ฅ๋ ์ ๋ต(ground truth)๊ณผ ๋น๊ตํด์ ์ฑ์ ํ๊ณ , ์ปค๋ฒ๋ฆฌ์ง/๋๋ฝ/๋ถ์ผ์น ๋ฆฌํฌํธ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋น๊ต๊ธฐ(comparator)๋ฅผ ์ ๊ณตํฉ๋๋ค. DAST์ SAST ์ค์บ๋ ๋ชจ๋ ๋์ผํ ์๋ํฌ์ธํธ๋ก ์ง์๋ฉ๋๋ค:
- ์๋ํฌ์ธํธ:
POST http://<baseurl>/VulnerableApp/scanner/benchmark - ์์ฒญ ๋ณธ๋ฌธ โ ์ฌ์ฉํ๋ ์ค์บ๋์ ๋ง๋ ํํ๋ฅผ ์ ํํ์ธ์:
- DAST:
{ tool, scanType: "DAST", findings: [ { url, type, cwe, wascId } ] }(scanType์ ์ ํ ํญ๋ชฉ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ์DAST์ ๋๋ค.type/cwe/wascId๋ ๊ฐ๊ฐ ์ ํ ํญ๋ชฉ์ด๋ฉฐ, ์ด ์ค ํ๋๋ง ์ผ์นํด๋ ์ถฉ๋ถํฉ๋๋ค) - SAST:
{ tool, scanType: "SAST", findings: [ { filePath, line, cwe, type } ] }
- DAST:
- ์๋ต ๋ณธ๋ฌธ๊ณผ ๋์คํฌ์ ์ ์ฅ๋๋
benchmarks/<tool>-results.json: ์ปค๋ฒ๋ฆฌ์ง ๋ฆฌํฌํธ
์ค์บ๋ ์์ฒด๋ฅผ ์คํํ๋ ๊ฒ์ ์ด ๊ธฐ๋ฅ์ ๋ฒ์ ๋ฐ์ด๋ฉฐ, ์ฌ์ฉ์๊ฐ JSON์ ์ง์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ ์ฒด ์
์ถ๋ ฅ ์คํค๋ง, ๋งค์นญ ๊ท์น, ํ์ค ์ทจ์ฝ์ ์ ํ ์ฉ์ด์ง, curl ์์ ๋ benchmarks/README.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ฌธ์
์งํ ๋จ๊ณ๋ ํ๋ก์ ํธ์ ๋ชฉ์ ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐ ์ด๋ ค์์ด ์๋ค๋ฉด karan.sasan@owasp.org๋ก ๋ฉ์ผ์ ๋ณด๋ด์๊ฑฐ๋ ์ด์๋ฅผ ์์ฑํด ์ฃผ์ธ์. ์ต์ ์ ๋คํด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ฐ ๋งํฌ
๊ธฐ์ฌ ๋ฐ ๋ธ๋ก๊ทธ
- OWASP-VulnerableApp ๊ฐ์ โ Medium ๊ฒ์๊ธ
- OWASP-VulnerableApp ๊ฐ์ โ Blogspot ๊ฒ์๊ธ
- Kenji Nakajima์ OWASP VulnerableApp ์๊ฐ
- VulnerableApp์ ํ์ฉํ ์์ฑํ AI ๊ธฐ๋ฐ Shannon ํ๋ซํผ
- OWASP ZAP ํ์ผ ์ ๋ก๋ ์ ๋์จ์ ๋ง๋ ์ด์ผ๊ธฐ โ VulnerableApp-Facade๊ฐ ๋จผ์ ์กด์ฌํด์ผ ํ๋ ์ด์