Vấn đề
Xác thực trả lời câu hỏi bạn là ai. Phân quyền trả lời câu hỏi bạn được làm gì. Hai câu hỏi khác nhau, và một endpoint có thể trả lời đúng câu đầu mà bỏ qua hoàn toàn câu sau.
IDOR (Insecure Direct Object Reference) là dạng phổ biến nhất của lỗi này: định danh của bản ghi nằm trong request, và server dùng nó mà không hỏi bản ghi đó có thuộc về người gọi hay không.
Điều làm IDOR khác các lỗ hổng khác, và là lý do nó đứng đầu Top 10 hai bản liên tiếp: nó không có chữ ký cú pháp. SQL injection có một dấu nháy để grep. Một truy vấn thiếu kiểm quyền trông y hệt một truy vấn có kiểm quyền — cả hai đều là một câu FirstOrDefaultAsync(x => x.Id == id). Không linter nào tìm được nó, không WAF nào chặn được nó, và scanner tự động thì mù vì bắt được nó đòi hiểu ai nên đọc được cái gì — tức là hiểu nghiệp vụ của bạn.
Về mức thiệt hại: không cần leo thang, không cần payload. Một vòng for trên id là toàn bộ bảng, và trong log nó trông như lưu lượng bình thường của một người dùng đã đăng nhập.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…