Trong thế giới an ninh mạng, có những lỗ hổng không cần exploit phức tạp, không cần shell, không cần payload cao siêu…
Chỉ cần bạn truy cập được thứ không thuộc về mình – thế là đủ toang.
Đó chính là Broken Access Control.
❓ Access Control là gì?
Access Control (kiểm soát truy cập) là cơ chế quyết định:
- Ai được làm gì?
- Ai được xem cái gì?
- Ai được sửa, xóa, tạo dữ liệu?
- User thường ❌ không được xóa tài khoản khác
- Admin ✅ được xem toàn bộ hệ thống
- Người A ❌ không được xem dữ liệu của người B
💥 Broken Access Control là gì?
Broken Access Control xảy ra khi hệ thống không kiểm tra đúng quyền hạn, cho phép người dùng:
- Truy cập tài nguyên không được phép
- Thực hiện hành động vượt quyền
- Thay đổi dữ liệu của người khác
OWASP xếp nó Top 1 lỗ hổng nguy hiểm nhất – không phải ngẫu nhiên.
🧨 Những ví dụ “kinh điển”
1️⃣ IDOR – Insecure Direct Object Reference
URL kiểu:
/api/user/profile?id=123
Bạn đổi 123 → 124
➡️ Xem được profile người khác
➡️ Không cần login thêm
➡️ Không bị chặn
💣 Boom – IDOR.
2️⃣ Leo thang đặc quyền (Privilege Escalation)
User thường gửi request:
POST /change-role role=user
Bạn sửa thành:
role=admin
Server:
- ❌ Không kiểm tra role hiện tại
- ❌ Tin dữ liệu client gửi lên
➡️ Chúc mừng, bạn vừa thành admin.
3️⃣ Bypass kiểm tra phía client
Frontend ẩn nút Delete User
Nhưng backend:
- ❌ Không kiểm tra quyền
- ❌ Chỉ dựa vào UI
➡️ Gửi request thủ công = xóa được user
👉 Ẩn nút ≠ bảo mật
🚨 Vì sao Broken Access Control nguy hiểm?
- Không cần kỹ thuật cao
- Khai thác cực dễ
- Ảnh hưởng trực tiếp dữ liệu người dùng
- Dễ bị exploit hàng loạt (automation)
Rất nhiều vụ:
- Leak dữ liệu cá nhân
- Mất quyền admin
- Chiếm hệ thống nội bộ
… đều bắt đầu từ Access Control.
🛠️ Nguyên nhân phổ biến
- Kiểm tra quyền ở frontend thay vì backend
- Tin dữ liệu từ client (role, user_id…)
- Không kiểm tra ownership (ai sở hữu dữ liệu)
- Logic phân quyền rối rắm, chồng chéo
- Dev nghĩ: “Chắc không ai đoán được URL đâu” 😅
✅ Cách phòng tránh (Best Practices)
🔒 Luôn kiểm tra quyền ở backend
Backend mới là nơi ra quyết định, không phải frontend.
🔒 Áp dụng nguyên tắc Least Privilege
User chỉ có đúng quyền cần thiết – không hơn.
🔒 Kiểm tra ownership
Không chỉ hỏi:
“User đã login chưa?”
Mà phải hỏi:
“User có quyền với tài nguyên này không?”
🔒 Không tin client
- Không tin role
- Không tin user_id
- Không tin bất kỳ thứ gì gửi từ client
🔒 Test thường xuyên
- Dùng Burp Suite
- Dùng DVWA / Juice Shop
- Viết test cho authorization logic
🎯 Kết luận
Broken Access Control không phải lỗi “cao siêu”,
nhưng lại là lỗi phá hoại nặng nhất.
Nếu bạn:
- Là developer → hãy viết code phòng thủ
- Là pentester → hãy test authorization trước tiên
- Là người học security → nắm Access Control thật chắc
mọi lớp bảo mật khác gần như vô nghĩa.