SecLab
Secure Design & Threat ModelingwalkthroughĐộ khó 4/530 phút

Abuse case: lỗi không có payload nào

Mục tiêu: Sau bài này bạn viết được abuse case cho một luồng nghiệp vụ và tìm ra lỗi mà không scanner nào tìm được.

V2API6:2023A06:2025business-logic
Bước 1 / 5 · read6 phút

Dùng tính năng theo cách bạn không dự tính

Mọi lỗ hổng trong tám module trước có một chữ ký: một payload, một ký tự lạ, một id không thuộc về bạn, một cấu hình sai. Lớp lỗi trong bài này không có chữ ký nào — mọi request đều hợp lệ, mọi giá trị đều trong khoảng cho phép, và kết quả vẫn sai.

Ba ví dụ, và cả ba đều là những request mà một validator hoàn hảo cho qua:

LuồngCách dùng không dự tínhKết quả
Mã giảm giá 10%Áp mã cho một đơn, huỷ đơn, mã không được hoàn lại nhưng đơn được hoàn tiềnTiền dương từ hư không
Chuyển tiền giữa hai víChuyển số âm từ ví B sang ví ARút tiền của người khác
Đổi email cần xác nhậnĐổi sang email mới, không xác nhận, rồi đổi lại — nếu code đặt email mới ngay và chỉ đánh dấu unverifiedChiếm tài khoản qua reset mật khẩu

Điều làm lớp lỗi này khác về bản chất: không công cụ nào tìm được nó. Một scanner không biết mã giảm giá của bạn nên hoạt động thế nào; một linter không biết chuyển số âm là sai; một WAF thấy một request POST /transfer {"amount": -1000} hoàn toàn hợp lệ. Chỉ người hiểu nghiệp vụ tìm ra được, và đó là bạn.

Abuse case là use case viết từ góc nhìn của người muốn lạm dụng. Kỹ thuật để viết nó gồm bốn câu hỏi, và mỗi câu tìm ra một nhóm khác nhau:

Câu hỏiNhóm lỗi nó tìm ra
Làm bước này hai lần thì sao?Áp mã hai lần, gửi hai lần, ký hai lần (bài m2-challenge)
Làm các bước sai thứ tự thì sao?Thanh toán trước khi kiểm tồn kho, xác nhận trước khi trả tiền
Số này âm, bằng 0, hoặc rất lớn thì sao?Chuyển tiền âm, chia cho 0, tràn số
Hai người làm cùng lúc thì sao?Race condition — hai request thấy cùng một trạng thái cũ

Câu thứ nhất và câu thứ tư là hai câu tìm ra nhiều lỗi thật nhất, và chúng liên quan: "làm hai lần" là phiên bản tuần tự của "hai người cùng lúc", nhưng bản vá cho hai cái khác nhau — idempotency key cho cái đầu, và một khoá ở tầng dữ liệu cho cái sau.

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…