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

SSRF và cách viết allowlist cho đúng

Mục tiêu: Sau bài này bạn viết được một allowlist SSRF chống được cả DNS rebinding và redirect, và biết vì sao blocklist luôn thất bại.

V13CWE-918API7:2023C10:2024ssrf
Bước 1 / 5 · read6 phút

Bạn cho kẻ tấn công mượn vị trí mạng của mình

SSRF xảy ra khi ứng dụng của bạn nhận một URL từ người dùng rồi tự đi gọi URL đó. Điều làm nó nghiêm trọng không phải việc gọi mà là vị trí mạng mà lời gọi xuất phát từ đó: kẻ tấn công không tới được 10.0.0.5 hay 169.254.169.254, nhưng server của bạn thì tới được — nên họ mượn tay bạn.

Ba mục tiêu, xếp theo mức thiệt hại trong môi trường cloud:

Mục tiêuCái lấy được
Metadata endpoint (169.254.169.254)Credential tạm của instance role — tức là quyền của cả role đó
Dịch vụ nội bộ không xác thựcRedis, Elasticsearch, một admin API "chỉ nội bộ nên không cần auth"
Quét mạng nội bộBản đồ mạng, qua chênh lệch thời gian phản hồi hoặc mã lỗi

Và giờ là phần quan trọng nhất của bài: blocklist không hoạt động. Danh sách chặn 127.0.0.1, localhost, 10.*, 192.168.* trông đầy đủ và nó thất bại theo ít nhất bảy cách khác nhau:

Biến thểVí dụ
Thập phânhttp://2130706433/ = 127.0.0.1
Bát phânhttp://0177.0.0.1/
Thập lục phânhttp://0x7f000001/
IPv6 và dạng ánh xạhttp://[::1]/, http://[::ffff:127.0.0.1]/
Ngắn gọnhttp://127.1/, http://0/
DNS trỏ về nội bộhttp://internal.attacker.tld/ → A record 10.0.0.5
RedirectURL công khai trả 302 tới 169.254.169.254

Bảy dòng đó là bảy lần bạn phải nhớ thêm một trường hợp, và lần thứ tám là lỗ hổng. Đây chính là lý do bản vá phải là allowlist: bạn liệt kê những gì được phép, và mọi biến thể sáng tạo đều không nằm trong danh sách đó.

Hai dòng cuối bảng đáng nói riêng, vì chúng vượt qua cả allowlist viết ngây thơ:

  • DNS rebinding: bạn resolve hostname, thấy nó hợp lệ, rồi HttpClient resolve lần thứ hai lúc kết nối — và lần đó DNS trả về một IP khác. Kiểm và dùng là hai thời điểm khác nhau.
  • Redirect: bạn kiểm URL đầu tiên, nó hợp lệ, rồi server trả 302HttpClient đi theo tới một chỗ bạn chưa bao giờ kiểm.
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…