SecLab
SSRF & calling external APIswalkthroughĐộ khó 3/526 phút

Response của API bên ngoài là input không tin được

Mục tiêu: Sau bài này bạn xử lý được response của một API bên ngoài với cùng mức nghi ngờ như một request từ Internet.

V13API10:2023A10:2025api-security
Bước 1 / 5 · read5 phút

Vì sao "API đối tác" không phải một biên giới tin cậy

Mọi developer đều validate input từ người dùng. Rất ít người validate response từ một API bên ngoài — và API10 tồn tại vì lý do đó.

Lý do bỏ qua nghe hợp lý: "đó là API của đối tác, chúng ta có hợp đồng". Nhưng hợp đồng không phải một biện pháp kỹ thuật, và có bốn cách response đó trở nên độc hại mà không cần đối tác của bạn có ý xấu:

CáchVí dụ
Đối tác bị xâm nhậpChính bài m6-challenge — pipeline của họ, không phải ý định của họ
MITM trên đường tới đối tácBài tls-and-transport, dòng => true
SSRF của chính bạnBạn tưởng đang gọi đối tác, thật ra đang gọi chỗ kẻ tấn công chọn
Đối tác đổi hợp đồngKhông độc hại, nhưng cùng hệ quả: response không như bạn giả định

Hàng thứ ba là hàng đáng chú ý nhất vì nó nối module này lại với nhau: nếu bạn có SSRF thì mọi giả định về "response từ đối tác" trở thành giả định về "response từ kẻ tấn công". Hai lỗ hổng nhân nhau chứ không cộng nhau.

Năm giả định thường được đặt và thường sai:

Giả địnhHỏng thế nào
Response là JSON hợp lệHTML của một trang lỗi, hoặc một Content-Type khác
Kích thước hợp lý4 GB response làm cạn bộ nhớ tiến trình
Trả về trong vài giâyResponse nhỏ giọt vô hạn giữ kết nối và luồng của bạn
Trường có kiểu như tài liệu"amount": "1e999", "id": null ở chỗ bắt buộc
Chuỗi trong response an toàn để hiển thịNó đi vào innerHTML và trở thành XSS

Hàng thứ ba đáng nói riêng vì nó không phải một lỗi dữ liệu mà là một tấn công cạn tài nguyên: một server gửi một byte mỗi 20 giây giữ được một luồng của bạn vô thời hạn, và HttpClient.Timeout mặc định là 100 giây cho toàn bộ request — nhưng nó không giới hạn thời gian đọc body nếu bạn stream nó.

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…