StoreLab là một môi trường web giả lập, được thiết kế để sinh viên và người học bảo mật thực hành khai thác các lỗi bảo mật phổ biến. Ứng dụng mô phỏng một cửa hàng trực tuyến đơn giản (sản phẩm, đơn hàng, quản lý người dùng) và chứa một số lỗ hổng phục vụ mục đích học tập/CTF: Broken Access Control, NoSQL Injection, SSRF, JWT tampering, v.v.
⚠️ Cảnh báo: Đây là app dùng cho mục đích học tập/CTF. Không triển khai lên production hoặc hệ thống thật.
-
Đăng ký / Đăng nhập — JWT + session
-
User Dashboard — xem profile, lịch sử đơn hàng
-
Orders — mỗi user chỉ xem đơn của mình (mục tiêu IDOR)
-
Admin Panel — CRUD user (dùng để luyện Broken Access Control)
-
Sản phẩm mẫu — có 1 sản phẩm “flag” trả flag nếu mua
-
Lỗ hổng mô phỏng:
- Broken Access Control / IDOR
- NoSQL Injection
- JWT Forgery / Tampering
- SSRF (khi server fetch URL)
- Logic bugs (ví dụ: bypass nghiệp vụ mua hàng)
StoreLab/
├── images/ # ảnh, uploads
├── src/
│ ├── app/
│ │ ├── controllers/
│ │ ├── models/
│ │ │ ├── User.js
│ │ │ ├── Product.js
│ │ │ └── Order.js
│ │ ├── routes/
│ │ └── views/
│ ├── index.js
│ └── .env # cấu hình môi trường (MONGODB_URI, JWT_SECRET,...)
├── seedUsers.js # seed users (admin,test,...)
├── seedProducts.js # seed products (bao gồm product flag)
├── Dockerfile
├── docker-compose.yml
├── package.json
└── README.md
- Docker & Docker Compose (khuyến nghị)
- Node.js ≥ 16 nếu chạy local
- MongoDB (nếu không dùng Docker)
- Clone:
git clone https://github.com/dinhvaren/StoreLab.git
cd StoreLab- Build & chạy:
docker compose up -d --build- Truy cập:
http://localhost:3000
Trong docker-compose.yml có service mongo_cleaner (node) để:
- chạy seedUsers.js & seedProducts.js ngay khi container khởi động;
- tiếp đó chạy lại mỗi 2 tiếng theo cron
0 */2 * * *.
Nếu bạn muốn seed ngay khi khởi động và sau đó lặp mỗi 2 tiếng, đảm bảo mongo_cleaner command chạy seed lần đầu rồi set cron (mình đã chuẩn hóa sẵn trong ví dụ).
Xem log:
docker logs -f mongo_cleanerMuốn chỉ reset products (giữ users)? chỉnh cron command chỉ gọi node seedProducts.js thay vì cả hai.
Lưu ý lỗi phổ biến:
E11000 duplicate key error collection: VHUStore.users index: userId_1 dup key: { userId: null }
Nguyên nhân & cách xử lý:
-
Nguyên nhân
- Bạn dùng plugin
mongoose-sequence(auto-increment) chouserIdvà_idcùng lúc, hoặc counters/index cũ còn tồn tại. insertMany()bypass middlewarepre('save')của plugin → plugin không gán giá trị auto-increment →userId=null→ trùng key.
- Bạn dùng plugin
-
Cách khắc phục (đã chuẩn hóa trong seed script)
-
Trước khi insert, drop index
userId_1(nếu tồn tại) và xóa collectioncounters:await db.collection("users").dropIndex("userId_1").catch(()=>{}); await db.collection("counters").deleteMany({}).catch(()=>{});
-
Xóa documents cũ (nếu cần) rồi insert.
-
Dùng
new Model(doc).save()thay vìinsertMany()nếu muốn middleware (plugin) chạy và gán_id/userIdchính xác.
-
-
Nếu bạn muốn giữ model nguyên (auto-increment cho _id và userId):
- Thì seed script phải làm sạch index + counters trước khi insert — seed script mẫu mình cung cấp đã thực hiện các bước này.
- NoSQLi: thử bypass login bằng payload JSON (ví dụ
{ "$ne": null }kiểu truy vấn) - JWT tamper: chỉnh payload token, thay
rolethànhadminnếu backend không verify signature đúng - IDOR: truy vấn
/orders/:idcủa người khác - SSRF: truyền URL đến param hiển thị ảnh, xem server fetch nội dung
- Logic bug: thao tác trái phép trong flow mua hàng để lấy
flagValue
-
Không deploy công khai.
-
Không chứa dữ liệu thật.
-
Thử nghiệm chỉ trong môi trường cách ly (lab, VM, local).
-
Nếu gặp lỗi auto-increment / counters, dùng seed script đã chuẩn hóa hoặc thủ công chạy:
docker exec -it storelab_mongo mongosh --eval 'use VHUStore; db.users.dropIndexes(); db.counters.deleteMany({});'
- Tác giả: dinhvaren
- Mục đích: môi trường CTF / lab bảo mật cho sinh viên & cộng đồng
- Chào đón PR / issue / feature request (đặc biệt: thêm challenge, write-up mẫu, docs).