SecLab
Access ControlwalkthroughĐộ khó 2/522 phút

Mass assignment và DTO riêng cho input

Mục tiêu: Sau bài này bạn nhìn một endpoint nhận body và nói được người gọi ghi được vào những trường nào.

V2CWE-639API3:2023A01:2025access-control
Bước 1 / 5 · read4 phút

Model binder không biết trường nào là bí mật

IDOR là đọc sai bản ghi. Mass assignment là ghi sai trường — và nó cùng một gốc: server tin một thứ do client gửi mà không hỏi client có quyền đặt thứ đó hay không.

Cơ chế đơn giản đến mức khó tin: bạn khai một action nhận User và ASP.NET Core làm đúng việc nó được thiết kế để làm — gán mọi trường trong JSON vào mọi property khớp tên. Nó không có cách nào biết Role khác DisplayName về mức nghiêm trọng. Với nó cả hai chỉ là hai string.

Kết quả là một lớp lỗi có hình dạng rất đặc trưng: request hợp lệ, không có payload gì lạ, và một trường thừa.

HTTP
PATCH /api/users/meContent-Type: application/json { "displayName": "Thong", "role": "Admin" }

API3 gọi tên đầy đủ của nó là Broken Object Property Level Authorization, và cái tên dài đó nói đúng điều cần nói: phân quyền không chỉ ở mức đối tượng mà còn ở mức từng property. Cùng một người dùng, cùng một bản ghi, và vẫn có trường họ đọc được nhưng không được ghi.

Hai hướng, và cả hai đều là API3:

HướngTênVí dụ
Ghi trường không được phépMass assignment{"role":"Admin"}, {"isVerified":true}, {"balance":9999}
Đọc trường không được phépExcessive data exposureTrả cả passwordHash, internalNotes, stripeCustomerId vì DTO trả thẳng entity

Hướng thứ hai đáng chú ý vì nó âm thầm hơn: không ai báo lỗi, response vẫn 200, và dữ liệu thừa nằm trong JSON mà giao diện không hiển thị — nên không ai thấy, trừ người mở DevTools.

Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để 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.

Đăng kýĐăng nhập

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…