แต่ละแอปพลิเคชันทำงานเป็น 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 | การตอบสนองที่คาดหวัง |
|---|
/ | หน้าแรก | GET | 200 HTML พร้อมลิงก์ไปยังแอปทั้งหมด |
/health | ตรวจสอบสุขภาพ | GET | 200 JSON {"status":"healthy","component":"origin-server",...} |
/juice-shop/ | Juice Shop | GET | 200 HTML (Angular SPA, ~75 KB) |
/juice-shop/rest/products/search?q= | Juice Shop API | GET | 200 JSON {"status":"success","data":[...]} (36 สินค้า) |
/dvwa/ | DVWA | GET | 302 เปลี่ยนเส้นทางไปยัง /dvwa/login.php |
/dvwa/login.php | เข้าสู่ระบบ DVWA | GET | 200 HTML ฟอร์มเข้าสู่ระบบ |
/dvwa/setup.php | ตั้งค่า DVWA | GET | 200 HTML (เริ่มต้นฐานข้อมูลครั้งแรก) |
/vampi/ | VAmPI | GET | 200 HTML (เอกสาร API) |
/vampi/users/v1 | VAmPI API | GET | 200 JSON {"users":[...]} |
/vampi/users/v1/register | VAmPI API | POST | 200 JSON {"status":"success",...} |
/vampi/users/v1/login | VAmPI API | POST | 200 JSON {"auth_token":"...","status":"success"} |
/httpbin/get | httpbin | GET | 200 JSON พร้อมรายละเอียดคำขอ |
/httpbin/post | httpbin | POST | 200 JSON พร้อมข้อมูลที่ส่ง |
/httpbin/headers | httpbin | GET | 200 JSON {"headers":{...}} |
/httpbin/status/:code | httpbin | GET | คืนค่ารหัสสถานะ HTTP ที่ระบุ |
/whoami/ | whoami | GET | 200 ข้อความธรรมดาพร้อมชื่อโฮสต์, IP, ส่วนหัวทั้งหมด |
/csd-demo/ | CSD Demo | GET | 200 HTML ฟอร์มชำระเงินพร้อมแผงโจมตี |
/csd-demo/dashboard | มุมมองผู้โจมตี CSD | GET | 200 HTML แสดงข้อมูลที่ถูกดึงออก |
/csd-demo/health | สุขภาพ CSD | GET | 200 JSON {"status":"healthy","component":"csd-demo",...} |
/csd-demo/exfil/log | บันทึกการดึงข้อมูล CSD | GET | 200 JSON อาร์เรย์ข้อมูลที่ถูกจับ |
/dvga/ | DVGA GraphiQL | GET | 200 HTML (GraphiQL IDE) |
/dvga/graphql | DVGA GraphQL API | POST | 200 JSON การตอบสนอง GraphQL |
/restaurant/ | RESTaurant | GET | 200 (เปลี่ยนเส้นทางไปยัง docs) |
/restaurant/docs | RESTaurant Swagger | GET | 200 HTML (FastAPI Swagger UI) |
/restaurant/openapi.json | RESTaurant OpenAPI | GET | 200 JSON ข้อกำหนด OpenAPI |
http://<PUBLIC_IP>:8888 | crAPI | GET | 200 HTML (SPA) |
http://<PUBLIC_IP>:8888/identity/api/auth/signup | ลงทะเบียน crAPI | POST | 200 JSON |
http://<PUBLIC_IP>:8888/identity/api/auth/login | เข้าสู่ระบบ crAPI | POST | 200 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 บนการเปลี่ยนแปลงโปรไฟล์ |
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 ต้องการการตั้งค่าฐานข้อมูลครั้งเดียวหลังจากการปรับใช้ครั้งแรก:
- ไปยัง
http://<PUBLIC_IP>/dvwa/setup.php
- คลิก Create / Reset Database
- เข้าสู่ระบบด้วย
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 Authentication | API2 | การจัดการโทเคนที่อ่อนแอ ไม่มีการจำกัดอัตรา |
| Excessive Data Exposure | API3 | API คืนค่าข้อมูลมากกว่าที่ไคลเอนต์ต้องการ |
| Mass Assignment | API6 | แก้ไขฟิลด์ admin ผ่านพารามิเตอร์ที่ไม่คาดคิด |
| SQL Injection | API8 | การแทรกผ่านพารามิเตอร์ API |
| Improper Assets Management | API9 | API endpoints ที่ไม่มีเอกสาร |
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 | คืนค่าทุกอย่างที่ส่งในคำขอ |
# ตรวจสอบส่วนหัวที่ 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 |
| ตรวจสอบการสิ้นสุด TLS | X-Forwarded-Proto แสดง https เมื่อ TLS สิ้นสุดที่ F5 XC |
# คำขอพื้นฐาน -- ดูสิ่งที่ 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"
ตัวอย่างผลลัพธ์:
RemoteAddr: 172.17.0.1:55118
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Real-Ip: 104.219.105.84
DVGA ถูกสร้างขึ้นโดยเฉพาะสำหรับการทดสอบช่องโหว่เฉพาะของ GraphQL มี GraphiQL IDE ที่ /dvga/ สำหรับการสำรวจ query แบบโต้ตอบ และ GraphQL API endpoint ที่ /dvga/graphql แต่ละอินสแตนซ์ใช้ฐานข้อมูล SQLite ของตัวเอง ดังนั้น sticky sessions แบบ ip_hash จึงรับประกันสถานะที่สม่ำเสมอ
| สถานการณ์ | หมวดหมู่ | เวกเตอร์การโจมตี |
|---|
| GraphQL Injection | ความปลอดภัย API | Query ที่เป็นอันตรายผ่านการแทรกสตริง |
| Denial of Service | ความปลอดภัย API | Query ที่ซ้อนกันลึก, batch queries, การใช้ทรัพยากรหมด |
| Authorization Bypass | ความปลอดภัย API | การเข้าถึงข้อมูลที่ไม่ได้รับอนุญาตผ่าน GraphQL |
| Information Disclosure | ความปลอดภัย API | Introspection queries เปิดเผยรายละเอียด schema |
| Batching Attack | ความปลอดภัย API | การดำเนินการหลายรายการในคำขอเดียว |
# 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 } }"}'
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 Authentication | API2 | การจัดการโทเคนที่อ่อนแอ, credential stuffing |
| Broken Object Property Level Authorization | API3 | Mass assignment บนฟิลด์โปรไฟล์ผู้ใช้ |
| Unrestricted Resource Consumption | API4 | ไม่มีการจำกัดอัตราบน endpoints |
| Broken Function Level Authorization (BFLA) | API5 | เข้าถึง admin endpoints ในฐานะผู้ใช้ทั่วไป |
| Server Side Request Forgery (SSRF) | API7 | จัดการคำขอ URL ฝั่งเซิร์ฟเวอร์ |
| Security Misconfiguration | API8 | ข้อความแสดงข้อผิดพลาดที่มีรายละเอียดมาก, ข้อมูลประจำตัวเริ่มต้น |
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
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 Exposure | API คืนค่าข้อมูลผู้ใช้ที่ละเอียดอ่อน |
# ตรวจสอบว่า 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-mailhog (email capture, port 18025)
| กรณีการใช้งานสาธิต | แอปหลัก | แอปรอง |
|---|
| WAF — SQL Injection | DVWA | Juice Shop |
| WAF — XSS | DVWA | Juice Shop |
| WAF — Command Injection | DVWA | — |
| ความปลอดภัย API — BOLA | VAmPI | — |
| ความปลอดภัย API — การข้ามการรับรองความถูกต้อง | VAmPI | Juice Shop |
| ความปลอดภัย API — การเปิดเผยข้อมูล | VAmPI | httpbin |
| การป้องกัน Bot — Brute force | DVWA | Juice Shop |
| การป้องกัน Bot — Scraping | Juice Shop | — |
| การป้องกันฝั่งไคลเอนต์ — DOM XSS | Juice Shop | — |
| การป้องกันฝั่งไคลเอนต์ — Stored XSS | DVWA | Juice Shop |
| การป้องกันฝั่งไคลเอนต์ — Card Skimmer | CSD Demo | — |
| การป้องกันฝั่งไคลเอนต์ — Formjacker | CSD Demo | — |
| การป้องกันฝั่งไคลเอนต์ — Keylogger | CSD Demo | — |
| การป้องกันฝั่งไคลเอนต์ — Cryptominer | CSD Demo | — |
| การป้องกันฝั่งไคลเอนต์ — DOM Hijack | CSD Demo | — |
| ความปลอดภัย API — GraphQL injection | DVGA | — |
| ความปลอดภัย API — GraphQL DoS | DVGA | — |
| ความปลอดภัย API — OWASP API Top 10 2023 | RESTaurant | crAPI |
| ความปลอดภัย API — BFLA | RESTaurant | crAPI |
| ความปลอดภัย API — Mass assignment | crAPI | RESTaurant |
| ความปลอดภัย API — SSRF | crAPI | RESTaurant |
| ความปลอดภัย API — JWT manipulation | crAPI | — |
| ความปลอดภัย API — NoSQL injection | crAPI | — |
| การทดสอบการเชื่อมต่อพื้นฐาน | httpbin | — |
| การวินิจฉัยคำขอ | whoami | httpbin |
| การตรวจสอบการแทรกส่วนหัว | whoami | — |