ข้ามไปยังเนื้อหา

แอปพลิเคชัน

แต่ละแอปพลิเคชันทำงานเป็น Docker คอนเทนเนอร์ 4 ตัวที่กระจายโหลดหลัง nginx upstream pools เข้าถึงได้ผ่าน nginx reverse proxy บน VM การใช้ Sticky sessions ช่วยให้แอปพลิเคชันที่มีสถานะ (Juice Shop, DVWA, VAmPI, CSD Demo) ได้รับการกำหนดเส้นทางอย่างสม่ำเสมอ แอปพลิเคชันทั้งหมดมีช่องโหว่โดยเจตนาและออกแบบมาเพื่อการทดสอบความปลอดภัย

แทนที่ <ORIGIN> ด้วย http://<PUBLIC_IP> ในตัวอย่างทั้งหมดด้านล่าง หลังจากปรับใช้ผ่าน Terraform รับ IP ด้วย terraform output -raw public_ip

เส้นทางแอปพลิเคชันวิธี HTTPการตอบสนองที่คาดหวัง
/หน้าแรกGET200 HTML พร้อมลิงก์ไปยังแอปทั้งหมด
/healthตรวจสอบสุขภาพGET200 JSON {"status":"healthy","component":"origin-server",...}
/juice-shop/Juice ShopGET200 HTML (Angular SPA, ~75 KB)
/juice-shop/rest/products/search?q=Juice Shop APIGET200 JSON {"status":"success","data":[...]} (36 สินค้า)
/dvwa/DVWAGET302 เปลี่ยนเส้นทางไปยัง /dvwa/login.php
/dvwa/login.phpเข้าสู่ระบบ DVWAGET200 HTML ฟอร์มเข้าสู่ระบบ
/dvwa/setup.phpตั้งค่า DVWAGET200 HTML (เริ่มต้นฐานข้อมูลครั้งแรก)
/vampi/VAmPIGET200 HTML (เอกสาร API)
/vampi/users/v1VAmPI APIGET200 JSON {"users":[...]}
/vampi/users/v1/registerVAmPI APIPOST200 JSON {"status":"success",...}
/vampi/users/v1/loginVAmPI APIPOST200 JSON {"auth_token":"...","status":"success"}
/httpbin/gethttpbinGET200 JSON พร้อมรายละเอียดคำขอ
/httpbin/posthttpbinPOST200 JSON พร้อมข้อมูลที่ส่ง
/httpbin/headershttpbinGET200 JSON {"headers":{...}}
/httpbin/status/:codehttpbinGETคืนค่ารหัสสถานะ HTTP ที่ระบุ
/whoami/whoamiGET200 ข้อความธรรมดาพร้อมชื่อโฮสต์, IP, ส่วนหัวทั้งหมด
/csd-demo/CSD DemoGET200 HTML ฟอร์มชำระเงินพร้อมแผงโจมตี
/csd-demo/dashboardมุมมองผู้โจมตี CSDGET200 HTML แสดงข้อมูลที่ถูกดึงออก
/csd-demo/healthสุขภาพ CSDGET200 JSON {"status":"healthy","component":"csd-demo",...}
/csd-demo/exfil/logบันทึกการดึงข้อมูล CSDGET200 JSON อาร์เรย์ข้อมูลที่ถูกจับ
/dvga/DVGA GraphiQLGET200 HTML (GraphiQL IDE)
/dvga/graphqlDVGA GraphQL APIPOST200 JSON การตอบสนอง GraphQL
/restaurant/RESTaurantGET200 (เปลี่ยนเส้นทางไปยัง docs)
/restaurant/docsRESTaurant SwaggerGET200 HTML (FastAPI Swagger UI)
/restaurant/openapi.jsonRESTaurant OpenAPIGET200 JSON ข้อกำหนด OpenAPI
http://<PUBLIC_IP>:8888crAPIGET200 HTML (SPA)
http://<PUBLIC_IP>:8888/identity/api/auth/signupลงทะเบียน crAPIPOST200 JSON
http://<PUBLIC_IP>:8888/identity/api/auth/loginเข้าสู่ระบบ crAPIPOST200 JSON {"token":"..."}
เส้นทาง/juice-shop/
อิมเมจbkimminich/juice-shop:latest
อินสแตนซ์4 (พอร์ต 3001-3004), sticky ผ่าน hash $cookie_token, proxy cache (TTL 60 วินาที)
ทรัพยากร2 CPU / 1 GiB RAM ต่ออินสแตนซ์
เฟรมเวิร์กNode.js / Angular
โปรเจกต์owasp.org/www-project-juice-shop

OWASP Juice Shop คือแอปพลิเคชันเว็บที่มีช่องโหว่ซึ่งทันสมัยที่สุดและได้รับการดูแลอย่างต่อเนื่อง ครอบคลุม OWASP Top 10 ทั้งหมดด้วยความท้าทายกว่า 100 รายการในแอปพลิเคชัน e-commerce ที่สมจริง

สถานการณ์หมวดหมู่เวกเตอร์การโจมตี
SQL Injection การข้ามการเข้าสู่ระบบไฟร์วอลล์แอปเว็บ (WAF)' OR 1=1-- ในช่องอีเมลเข้าสู่ระบบ
Reflected XSSไฟร์วอลล์แอปเว็บ (WAF), การป้องกันฝั่งไคลเอนต์การแทรก Script ผ่านพารามิเตอร์การค้นหา
DOM-based XSSการป้องกันฝั่งไคลเอนต์Payload ใน URL fragment
การรับรองความถูกต้องที่บกพร่องไฟร์วอลล์แอปเว็บ (WAF)Brute force เข้าสู่ระบบ, การจัดการ JWT
การใช้ API ในทางที่ผิดความปลอดภัย APIการเข้าถึงโดยไม่ได้รับอนุญาตไปยัง endpoints /api/
การเปิดเผยข้อมูลที่ละเอียดอ่อนความปลอดภัย APIการเข้าถึงข้อมูลผู้ใช้โดยไม่ได้รับอนุญาต
CSRFไฟร์วอลล์แอปเว็บ (WAF)Cross-site request forgery บนการเปลี่ยนแปลงโปรไฟล์
Terminal window
curl -s "http://<PUBLIC_IP>/juice-shop/" -o /dev/null -w "%{http_code}"
เส้นทาง/dvwa/
อิมเมจdvwa-fpm:latest แบบกำหนดเอง (php-fpm + nginx, สร้างจาก ghcr.io/digininja/dvwa:latest)
อินสแตนซ์4 (พอร์ต 8101-8104), sticky ผ่าน hash $cookie_PHPSESSID
ทรัพยากร0.5 CPU / 256 MiB RAM ต่ออินสแตนซ์
ฐานข้อมูลMariaDB 10.11 ที่ใช้ร่วมกัน (คอนเทนเนอร์ dvwa-db, 1 CPU / 768 MiB)
เฟรมเวิร์กPHP 8 / php-fpm / MariaDB
ข้อมูลประจำตัวadmin / password

DVWA คือมาตรฐานอุตสาหกรรมสำหรับการทดสอบ WAF มีระดับความปลอดภัยที่ปรับได้ (ต่ำ, กลาง, สูง, เป็นไปไม่ได้) ซึ่งค่อยๆ เพิ่มการตรวจสอบอินพุตและการเข้ารหัสเอาต์พุต

สถานการณ์หมวดหมู่ระดับความปลอดภัย
SQL Injectionไฟร์วอลล์แอปเว็บ (WAF)ต่ำ: ' OR 1=1# ง่ายๆ, สูง: blind SQLi
Command Injectionไฟร์วอลล์แอปเว็บ (WAF)ต่ำ: ; ls, สูง: ตัวอักษรที่ถูกกรอง
File Inclusionไฟร์วอลล์แอปเว็บ (WAF)ต่ำ: path traversal โดยตรง, สูง: ผ่านการทำความสะอาด
XSS (Reflected)ไฟร์วอลล์แอปเว็บ (WAF), การป้องกันฝั่งไคลเอนต์ต่ำ: <script> พื้นฐาน, สูง: การข้ามแบบเข้ารหัส
XSS (Stored)ไฟร์วอลล์แอปเว็บ (WAF), การป้องกันฝั่งไคลเอนต์ต่ำ: script ถาวรใน guestbook
File Uploadไฟร์วอลล์แอปเว็บ (WAF)ต่ำ: อัปโหลด PHP shell, สูง: การกรองนามสกุล
Brute Forceการป้องกัน Bot มาตรฐานความพยายามเข้าสู่ระบบอัตโนมัติ

ตั้งค่าระดับความปลอดภัยที่ /dvwa/security.php หลังจากเข้าสู่ระบบ:

  • ต่ำ — ไม่มีการตรวจสอบอินพุต ทุกการโจมตีได้ผล เหมาะสำหรับการสาธิต WAF signature
  • กลาง — การกรองพื้นฐาน การโจมตีบางอย่างต้องใช้การเข้ารหัสหรือเทคนิคการข้าม
  • สูง — การกรองที่แข็งแกร่ง มีเพียงเทคนิคขั้นสูงเท่านั้นที่สำเร็จ เหมาะสำหรับแสดงข้อจำกัดของ WAF
  • เป็นไปไม่ได้ — การใช้งานที่ปลอดภัยอย่างสมบูรณ์ สาธิตการเขียนโค้ดป้องกันที่ถูกต้อง

DVWA ต้องการการตั้งค่าฐานข้อมูลครั้งเดียวหลังจากการปรับใช้ครั้งแรก:

  1. ไปยัง http://<PUBLIC_IP>/dvwa/setup.php
  2. คลิก Create / Reset Database
  3. เข้าสู่ระบบด้วย admin / password
เส้นทาง/vampi/
อิมเมจerev0s/vampi:latest พร้อม gunicorn entrypoint (4 workers)
อินสแตนซ์4 (พอร์ต 5101-5104), sticky ผ่าน ip_hash (SQLite ต่ออินสแตนซ์)
ทรัพยากร0.5 CPU / 512 MiB RAM ต่ออินสแตนซ์
เฟรมเวิร์กPython / Flask / gunicorn
โปรเจกต์github.com/erev0s/VAmPI

VAmPI ถูกสร้างขึ้นโดยเฉพาะสำหรับการทดสอบ OWASP API Security Top 10 มี REST API ที่สมจริงพร้อมช่องโหว่โดยเจตนา แต่ละอินสแตนซ์รัน gunicorn พร้อม 4 workers และฐานข้อมูล SQLite ของตัวเอง Sticky session แบบ ip_hash ช่วยให้การลงทะเบียนและการเข้าสู่ระบบจาก IP ไคลเอนต์เดียวกันเข้าถึงอินสแตนซ์เดิมเสมอ

สถานการณ์OWASP API Top 10วิธีการ
Broken Object Level Authorization (BOLA)API1เข้าถึงข้อมูลผู้ใช้คนอื่นโดยการจัดการ ID
Broken AuthenticationAPI2การจัดการโทเคนที่อ่อนแอ ไม่มีการจำกัดอัตรา
Excessive Data ExposureAPI3API คืนค่าข้อมูลมากกว่าที่ไคลเอนต์ต้องการ
Mass AssignmentAPI6แก้ไขฟิลด์ admin ผ่านพารามิเตอร์ที่ไม่คาดคิด
SQL InjectionAPI8การแทรกผ่านพารามิเตอร์ API
Improper Assets ManagementAPI9API endpoints ที่ไม่มีเอกสาร
Terminal window
# ลงทะเบียนผู้ใช้ใหม่
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/register" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123","email":"test@test.com"}'
# เข้าสู่ระบบ
curl -X POST "http://<PUBLIC_IP>/vampi/users/v1/login" \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123"}'
# แสดงรายการผู้ใช้ (การเปิดเผยข้อมูลมากเกินไป)
curl "http://<PUBLIC_IP>/vampi/users/v1"
เส้นทาง/httpbin/
อิมเมจkennethreitz/httpbin:latest พร้อม gunicorn CMD override (-w 4 -k gevent --timeout 30)
อินสแตนซ์4 (พอร์ต 8201-8204), round-robin (stateless)
ทรัพยากร0.5 CPU / 256 MiB RAM ต่ออินสแตนซ์
เฟรมเวิร์กPython / Flask / gunicorn + gevent
โปรเจกต์httpbin.org

httpbin คือบริการคำขอ/การตอบสนอง HTTP แบบง่ายที่มีประโยชน์สำหรับการสาธิต API พื้นฐาน การทดสอบส่วนหัวคำขอ และการตรวจสอบพฤติกรรม proxy

Endpointวัตถุประสงค์
/httpbin/getคืนค่าข้อมูลคำขอ GET (ส่วนหัว, args, origin)
/httpbin/postคืนค่าข้อมูลคำขอ POST (body, form, JSON)
/httpbin/headersคืนค่าส่วนหัวคำขอ
/httpbin/ipคืนค่า IP ต้นทาง
/httpbin/user-agentคืนค่าส่วนหัว User-Agent
/httpbin/status/:codeคืนค่ารหัสสถานะ HTTP ที่ระบุ
/httpbin/delay/:secondsหน่วงการตอบสนอง N วินาที
/httpbin/anythingคืนค่าทุกอย่างที่ส่งในคำขอ
Terminal window
# ตรวจสอบส่วนหัวที่ origin มองเห็น (มีประโยชน์สำหรับการตรวจสอบการแทรกส่วนหัว F5 XC)
curl -s "http://<PUBLIC_IP>/httpbin/headers" | jq .
# ทดสอบรหัสสถานะ HTTP ที่เฉพาะเจาะจง
curl -s -o /dev/null -w "%{http_code}" "http://<PUBLIC_IP>/httpbin/status/403"
เส้นทาง/whoami/
อิมเมจtraefik/whoami:latest
อินสแตนซ์4 (พอร์ต 8082-8085), round-robin (stateless)
ทรัพยากร0.25 CPU / 64 MiB RAM ต่ออินสแตนซ์
เฟรมเวิร์กGo
โปรเจกต์github.com/traefik/whoami

whoami คือเซิร์ฟเวอร์ echo คำขอ HTTP แบบเบาของ Traefik แสดงรายละเอียดทุกอย่างของคำขอ HTTP ขาเข้าตามที่ origin มองเห็น ได้แก่ ชื่อโฮสต์, ที่อยู่ IP, ส่วนหัวทั้งหมด, วิธีการ และ URL นี่คือเครื่องมือวินิจฉัยที่สำคัญที่สุดเมื่อต้องการตรวจสอบว่า F5 XC แทรกส่วนหัวที่ถูกต้องหรือไม่

กรณีการใช้งานสิ่งที่ต้องมองหา
ตรวจสอบการแทรกส่วนหัว F5 XCส่วนหัว X-Forwarded-For, True-Client-IP, X-Volterra-*
ยืนยันการมองเห็น IP ไคลเอนต์X-Real-IP เทียบกับ RemoteAddr
Debug WAF false positivesเปรียบเทียบส่วนหัวคำขอก่อน/หลัง F5 XC
ตรวจสอบการติดแท็ก bot defenseส่วนหัว X-Volterra-Bot-Type, X-Volterra-Bot-Verified
ตรวจสอบการสิ้นสุด TLSX-Forwarded-Proto แสดง https เมื่อ TLS สิ้นสุดที่ F5 XC
Terminal window
# คำขอพื้นฐาน -- ดูสิ่งที่ origin ได้รับ
curl "http://<PUBLIC_IP>/whoami/"
# จำลองคำขอผ่าน F5 XC (พร้อมส่วนหัวที่แทรก)
curl "http://<PUBLIC_IP>/whoami/" \
-H "X-Forwarded-For: 203.0.113.50" \
-H "True-Client-IP: 203.0.113.50" \
-H "X-Forwarded-Proto: https"

ตัวอย่างผลลัพธ์:

Hostname: 534c5084e169
IP: 127.0.0.1
RemoteAddr: 172.17.0.1:55118
GET / HTTP/1.1
Host: 20.12.78.159
User-Agent: curl/8.5.0
Accept: */*
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Forwarded-Proto: https
X-Real-Ip: 104.219.105.84
เส้นทาง/dvga/
อิมเมจdolevf/dvga:latest
อินสแตนซ์4 (พอร์ต 5201-5204), sticky ผ่าน ip_hash (SQLite ต่ออินสแตนซ์)
ทรัพยากร0.5 CPU / 256 MiB RAM ต่ออินสแตนซ์
เฟรมเวิร์กPython / Flask / GraphQL
โปรเจกต์github.com/dolevf/Damn-Vulnerable-GraphQL-Application

DVGA ถูกสร้างขึ้นโดยเฉพาะสำหรับการทดสอบช่องโหว่เฉพาะของ GraphQL มี GraphiQL IDE ที่ /dvga/ สำหรับการสำรวจ query แบบโต้ตอบ และ GraphQL API endpoint ที่ /dvga/graphql แต่ละอินสแตนซ์ใช้ฐานข้อมูล SQLite ของตัวเอง ดังนั้น sticky sessions แบบ ip_hash จึงรับประกันสถานะที่สม่ำเสมอ

สถานการณ์หมวดหมู่เวกเตอร์การโจมตี
GraphQL Injectionความปลอดภัย APIQuery ที่เป็นอันตรายผ่านการแทรกสตริง
Denial of Serviceความปลอดภัย APIQuery ที่ซ้อนกันลึก, batch queries, การใช้ทรัพยากรหมด
Authorization Bypassความปลอดภัย APIการเข้าถึงข้อมูลที่ไม่ได้รับอนุญาตผ่าน GraphQL
Information Disclosureความปลอดภัย APIIntrospection queries เปิดเผยรายละเอียด schema
Batching Attackความปลอดภัย APIการดำเนินการหลายรายการในคำขอเดียว
Terminal window
# GraphiQL UI (IDE แบบโต้ตอบ)
curl -sf "http://<PUBLIC_IP>/dvga/" -o /dev/null -w "%{http_code}"
# Introspection query -- ระบุ schema ทั้งหมด
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ __schema { types { name fields { name } } } }"}'
# แสดงรายการ pastes (ตัวอย่าง query)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"{ pastes { title content } }"}'
# สร้าง paste (mutation)
curl -s "http://<PUBLIC_IP>/dvga/graphql" \
-H "Content-Type: application/json" \
-d '{"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"}'
เส้นทาง/restaurant/
อิมเมจสร้างแบบกำหนดเองจาก theowni/Damn-Vulnerable-RESTaurant-API-Game
อินสแตนซ์4 (พอร์ต 8301-8304), round-robin (PostgreSQL ที่ใช้ร่วมกัน)
ทรัพยากร0.5 CPU / 256 MiB RAM ต่ออินสแตนซ์
ฐานข้อมูลPostgreSQL 15.4 ที่ใช้ร่วมกัน (คอนเทนเนอร์ restaurant-db, 0.5 CPU / 512 MiB)
เฟรมเวิร์กPython / FastAPI / PostgreSQL
ข้อมูลประจำตัวadmin / password (PostgreSQL)
โปรเจกต์github.com/theowni/Damn-Vulnerable-RESTaurant-API-Game

RESTaurant คือ REST API ที่มีช่องโหว่แบบเกมที่ครอบคลุม OWASP API Security Top 10 ปี 2023 ใช้ FastAPI พร้อมเอกสาร Swagger UI อัตโนมัติที่ /restaurant/docs อินสแตนซ์ทั้ง 4 ตัวใช้ฐานข้อมูล PostgreSQL เดียวกัน ดังนั้นการกระจายโหลดแบบ round-robin จึงทำงานได้โดยไม่ต้องใช้ sticky sessions

สถานการณ์OWASP API Top 10 2023วิธีการ
Broken Object Level Authorization (BOLA)API1เข้าถึงคำสั่งซื้อของผู้ใช้คนอื่นโดยการจัดการ ID
Broken AuthenticationAPI2การจัดการโทเคนที่อ่อนแอ, credential stuffing
Broken Object Property Level AuthorizationAPI3Mass assignment บนฟิลด์โปรไฟล์ผู้ใช้
Unrestricted Resource ConsumptionAPI4ไม่มีการจำกัดอัตราบน endpoints
Broken Function Level Authorization (BFLA)API5เข้าถึง admin endpoints ในฐานะผู้ใช้ทั่วไป
Server Side Request Forgery (SSRF)API7จัดการคำขอ URL ฝั่งเซิร์ฟเวอร์
Security MisconfigurationAPI8ข้อความแสดงข้อผิดพลาดที่มีรายละเอียดมาก, ข้อมูลประจำตัวเริ่มต้น
Terminal window
# Swagger UI
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
# ข้อกำหนด OpenAPI
curl -s "http://<PUBLIC_IP>/restaurant/openapi.json" | jq .info
# BOLA -- เข้าถึงคำสั่งซื้อของผู้ใช้คนอื่น (หลังการรับรองความถูกต้อง)
curl -s "http://<PUBLIC_IP>/restaurant/orders/1" \
-H "Authorization: Bearer <token>"
# BFLA -- พยายามดำเนินการ admin ในฐานะผู้ใช้ทั่วไป
curl -s -X POST "http://<PUBLIC_IP>/restaurant/admin/users" \
-H "Authorization: Bearer <user_token>" \
-H "Content-Type: application/json"
พอร์ต8888 (เฉพาะ — ไม่มีคำนำหน้าเส้นทาง)
อิมเมจcrapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHog
อินสแตนซ์7 microservices (อินสแตนซ์เดียวแต่ละตัว)
ทรัพยากร~3.0 CPU / ~2.0 GiB RAM รวม
เฟรมเวิร์กReact SPA + Java/Go/Python microservices
โปรเจกต์github.com/OWASP/crAPI

crAPI คือโปรเจกต์หลักของ OWASP สำหรับการทดสอบความปลอดภัย API รันเป็น 7 microservices บนพอร์ตเฉพาะ (8888) เนื่องจาก React SPA ฮาร์ดโค้ดเส้นทาง API และไม่สามารถให้บริการหลังคำนำหน้าเส้นทางได้ NSG อนุญาตให้รับทราฟฟิกขาเข้าบนพอร์ต 8888

MailHog จับอีเมลทั้งหมดที่ส่งโดย crAPI (การยืนยันบัญชี, การรีเซ็ตรหัสผ่าน) เข้าถึง MailHog ผ่าน SSH tunnel บนพอร์ต 18025

หมวดหมู่ช่องโหว่
BOLA (Broken Object Level Authorization)เข้าถึงยานพาหนะ, คำสั่งซื้อ และรายงานของผู้ใช้คนอื่น
BFLA (Broken Function Level Authorization)ยกระดับสิทธิ์เป็น admin, เข้าถึง endpoints ที่จำกัด
Mass Assignmentแก้ไขฟิลด์ที่ป้องกัน (role, balance) ผ่าน API
SSRF (Server Side Request Forgery)จัดการการดึง URL ฝั่งเซิร์ฟเวอร์
JWT Manipulationปลอมแปลงหรือแก้ไขโทเคน JWT เพื่อยกระดับสิทธิ์
NoSQL Injectionแทรก queries เข้าไปใน endpoints ที่ใช้ MongoDB
Excessive Data ExposureAPI คืนค่าข้อมูลผู้ใช้ที่ละเอียดอ่อน
Terminal window
# ตรวจสอบว่า crAPI กำลังทำงาน
curl -sf "http://<PUBLIC_IP>:8888" -o /dev/null -w "%{http_code}"
# ลงทะเบียนผู้ใช้ใหม่
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/signup" \
-H "Content-Type: application/json" \
-d '{"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"}'
# เข้าสู่ระบบ
curl -s -X POST "http://<PUBLIC_IP>:8888/identity/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Test1234!"}'
# เข้าถึง MailHog (ผ่าน SSH tunnel สำหรับการยืนยันอีเมล)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# จากนั้นเปิด http://localhost:18025 ในเบราว์เซอร์ของคุณ
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, user auth, JWT)
-> crapi-community (Go, forums, posts)
-> crapi-workshop (Python, vehicle service)
-> crapi-postgres (PostgreSQL)
-> crapi-mongo (MongoDB)
-> crapi-mailhog (email capture, port 18025)
กรณีการใช้งานสาธิตแอปหลักแอปรอง
WAF — SQL InjectionDVWAJuice Shop
WAF — XSSDVWAJuice Shop
WAF — Command InjectionDVWA
ความปลอดภัย API — BOLAVAmPI
ความปลอดภัย API — การข้ามการรับรองความถูกต้องVAmPIJuice Shop
ความปลอดภัย API — การเปิดเผยข้อมูลVAmPIhttpbin
การป้องกัน Bot — Brute forceDVWAJuice Shop
การป้องกัน Bot — ScrapingJuice Shop
การป้องกันฝั่งไคลเอนต์ — DOM XSSJuice Shop
การป้องกันฝั่งไคลเอนต์ — Stored XSSDVWAJuice Shop
การป้องกันฝั่งไคลเอนต์ — Card SkimmerCSD Demo
การป้องกันฝั่งไคลเอนต์ — FormjackerCSD Demo
การป้องกันฝั่งไคลเอนต์ — KeyloggerCSD Demo
การป้องกันฝั่งไคลเอนต์ — CryptominerCSD Demo
การป้องกันฝั่งไคลเอนต์ — DOM HijackCSD Demo
ความปลอดภัย API — GraphQL injectionDVGA
ความปลอดภัย API — GraphQL DoSDVGA
ความปลอดภัย API — OWASP API Top 10 2023RESTaurantcrAPI
ความปลอดภัย API — BFLARESTaurantcrAPI
ความปลอดภัย API — Mass assignmentcrAPIRESTaurant
ความปลอดภัย API — SSRFcrAPIRESTaurant
ความปลอดภัย API — JWT manipulationcrAPI
ความปลอดภัย API — NoSQL injectioncrAPI
การทดสอบการเชื่อมต่อพื้นฐานhttpbin
การวินิจฉัยคำขอwhoamihttpbin
การตรวจสอบการแทรกส่วนหัวwhoami