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ồng | Cách dùng không dự tính | Kế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ền | Tiền dương từ hư không |
| Chuyển tiền giữa hai ví | Chuyển số âm từ ví B sang ví A | Rú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 unverified | Chiế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ỏi | Nhó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.
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…