Server Name Indication (SNI) là một phần mở rộng của giao thức TLS cho phép máy khách chỉ định tên máy chủ (hostname) mà nó muốn kết nối đến ngay từ đầu của quá trình bắt tay TLS.


Vấn Đề Mà SNI Giải Quyết: Lưu Trữ Ảo Trên HTTPS

Trước khi có SNI, một địa chỉ IP chỉ có thể lưu trữ một trang web an toàn (HTTPS) duy nhất. Điều này là do máy chủ không biết máy khách muốn truy cập trang web nào cho đến khi kết nối an toàn đã được thiết lập, lúc này đã quá muộn để cung cấp đúng chứng chỉ TLS.

  • Phép so sánh: Một địa chỉ IP là một tòa nhà chung cư. Một trang web là một căn hộ. Nếu không có SNI, khi bạn vào tòa nhà (kết nối đến IP), bạn không nói cho máy chủ biết bạn muốn đến căn hộ (trang web) nào. Máy chủ chỉ có thể chỉ cho bạn căn hộ mặc định.
  • Giải pháp của SNI: Với SNI, bạn nói với máy chủ, “Tôi muốn kết nối đến www.example.com” trong quá trình bắt tay ban đầu. Máy chủ sau đó có thể tìm đúng chứng chỉ cho www.example.com và trình bày nó cho bạn, cho phép nó lưu trữ hàng nghìn trang HTTPS trên cùng một IP. Tên máy chủ www.example.com chính là SNI Name.

Tại Sao Công Cụ Pentest Cho Phép Tùy Chỉnh SNI

Thông thường, Tên SNI và tiêu đề Host trong HTTP là giống nhau. Tuy nhiên, các công cụ bảo mật như httpxcurl cho phép bạn đặt chúng thành các giá trị khác nhau. Đây là một kỹ thuật mạnh mẽ để kiểm thử bảo mật.

Trường Hợp Sử Dụng Chính: Vượt qua Các Lớp Bảo Vệ (Domain Fronting)

Kỹ thuật này có thể đánh lừa tường lửa (WAF) và các hệ thống phòng thủ khác để cho phép một yêu cầu truy cập đến một ứng dụng backend bị hạn chế.

Kịch bản:

  • Một WAF cho phép lưu lượng truy cập đến public-site.com nhưng chặn internal-api.com.
  • Cả hai trang web đều được lưu trữ trên cùng một máy chủ/địa chỉ IP.

Cuộc tấn công:

  1. Kẻ tấn công tạo một yêu cầu với các tên không khớp:
    • Tên SNI: public-site.com (tên miền “thân thiện”)
    • Tiêu đề HTTP Host: internal-api.com (mục tiêu “thực sự”)
  2. Lớp TLS (Sự lừa dối): WAF kiểm tra quá trình bắt tay TLS ban đầu chưa được mã hóa. Nó thấy tên SNI là public-site.com, quyết định rằng lưu lượng truy cập là hợp lệ và chuyển tiếp nó đến máy chủ. Một kết nối an toàn được thiết lập.
  3. Lớp HTTP (Tải trọng): Bên trong đường hầm đã được mã hóa, yêu cầu HTTP thực sự được gửi với Host: internal-api.com.
  4. Phía Máy chủ: Máy chủ web nhận được yêu cầu, giải mã nó và sử dụng tiêu đề Host để định tuyến yêu cầu trong nội bộ. Nó phục vụ nội dung từ internal-api.com.

WAF đã bị vượt qua vì nó đưa ra quyết định bảo mật dựa trên lớp bên ngoài (TLS), trong khi máy chủ ứng dụng đưa ra quyết định định tuyến dựa trên lớp bên trong (HTTP). Đây là một ví dụ kinh điển về việc khai thác sự “bất đồng bộ” giữa cách các lớp bảo mật và lớp ứng dụng diễn giải một yêu cầu.