SecLab
Logging, Error Handling & ResponsewalkthroughĐộ khó 2/523 phút

Trả lỗi ra ngoài mà không vẽ bản đồ

Mục tiêu: Sau bài này bạn thiết kế được một response lỗi đủ để người dùng tự sửa và không đủ để kẻ tấn công dò.

V16CWE-200A10:2025info-disclosure
Bước 1 / 5 · read5 phút

Hai người đọc thông báo lỗi của bạn

Mỗi thông báo lỗi có hai người đọc với hai nhu cầu đối lập:

Người đọcCần gì
Người dùng hoặc developer tích hợpĐủ thông tin để tự sửa request của họ
Kẻ tấn côngBất cứ gì nói về bên trong hệ thống

Cách giải quyết không phải chọn một bên mà là nhận ra hai nhu cầu đó cần hai loại thông tin khác nhau:

  • Người dùng cần biết cái gì trong request của họ sai — trường nào, quy tắc nào.
  • Kẻ tấn công muốn biết hệ thống được xây bằng gì và bên trong nó có gì — framework, phiên bản, tên bảng, đường dẫn file, tên host nội bộ.

Hai tập đó gần như không giao nhau, nên bạn cho được tập một mà không cho tập hai.

Bốn thứ hay lộ ra và mỗi thứ cho kẻ tấn công một mảnh bản đồ:

Lộ raNói gì cho kẻ tấn công
Stack traceFramework, phiên bản, cấu trúc thư mục, tên class nội bộ, có debug symbol không
Lỗi cơ sở dữ liệu nguyên vănLoại DB, tên bảng, tên cột, và một kênh cho SQL injection dựa vào lỗi
Đường dẫn file tuyệt đốiHệ điều hành, tên người dùng chạy tiến trình, layout của container
Thông báo lỗi khác nhau cho cùng một hành độngXem bài account-enumeration — mỗi chênh lệch là một bit

Hàng thứ hai đáng nhấn: một lỗi cơ sở dữ liệu nguyên văn không chỉ tiết lộ schema, nó biến một SQL injection blind thành một SQL injection có phản hồi. Kẻ tấn công không phải suy luận từ thời gian phản hồi nữa; họ đọc được thông báo lỗi nói rõ truy vấn của họ sai ở đâu, và điều đó rút thời gian khai thác từ hàng giờ xuống hàng phút.

Và giải pháp cho mâu thuẫn: một mã tương quan. Trả ra ngoài một traceId, ghi đầy đủ vào log, và nói với người dùng "hãy đưa mã này cho support". Người dùng có đường đi tiếp, support có đủ thông tin, và kẻ tấn công nhận được một GUID.

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…