+16

Làm sao để phòng tránh lỗ hổng "Host header injection"

I. HTTP Host header là gì?

HTTP Header là một phần bắt buộc phải có kể từ HTTP/1.1. Nó chỉ định tên miền mà khách hàng muốn truy cập. Ví dụ, khi chúng ta sử dụng trình duyệt vào trang web https://portswigger.net/web-security, trình duyệt củ chứng ta sẽ gửi một yêu cầu như sau đến web server

GET /web-security HTTP/1.1
Host: portswigger.net

Ở request trên, Trường Host được sử dụng trong các HTTP Header để chỉ định server và số cổng cho tài nguyên được request. Nếu không chỉ định port, điều này có nghĩa là cổng mặc định 80. Trong trường hợp muốn chỉ định port (ví dụ: 8000) request sẽ như sau:

GET /web-security HTTP/1.1
Host: portswigger.net:8000

Mục đích của Host header

  • HTTP Host header giúp máy chủ có thể xác định thành phần nào mà máy khách muốn giao tiếp thông qua địa chỉ IP hay URL (kèm theo port).
  • Nếu các yêu cầu không chứa Host header hoặc được gửi không đúng định dạng có thể dẫn đến sự cố khi định tuyến các yêu cầu đến ứng dụng dự định.
  • Với việc hỗ trợ Virtual hosting, bạn có thể chỉ sử dụng duy nhất 1 server, và sử dụng thông tin ở Host header để điều hướng người dùng đến rất nhiều các ứng dụng khác nhau:

Mô hình

image.png

Với 1 server, bạn có thể đưa người dùng đến example.com hoặc intranet-app tuỳ ý thông qua việc sử dụng một proxy server đứng ở giữa

II. HTTP Host header có thể bị tấn công như thế nào?

1. Tấn công Host header injection

Nếu máy chủ hoàn toàn tin tưởng vào HTTP Host header được gửi lên từ phía người dùng và không xác thực hoặc không xử lý yêu cầu đó đúng cách, kẻ tấn công có thể sử dụng thông tin đầu vào này để đưa vào các payloads có hại đồng thời điều khiển hành vi phía máy chủ. Các cuộc tấn công liên quan đến việc đưa trực tiếppayloads vào HTTP Host Header thường được gọi là "Host header injection".

2. Một số trường hợp có thể bị tấn công Host header injection

  • Khi không thực hiện kiểm tra yêu cầu của người dùng, kẻ tấn công có thể tiêm nhiễm những payloads độc hại vào HTTP Header
  • Ngay cả khi HTTP Header được xử lý an toàn hơn, tùy thuộc vào cấu hình của máy chủ xử lý các yêu cầu gửi đến, giá trị của trường "Host" có khả năng bị ghi đè bằng cách đưa vào các tiêu đề khác.
  • Do cấu hình sai trên website do sử dụng kiến trúc của bên thứ 3

3. Một số cách tấn công:

  • Thay đổi domain trong trường "Host" của HTTP Header request
GET /example HTTP/1.1
Host: hacker-domain.com
  • Chèn 2 trường "Host" trong HTTP request
GET /example HTTP/1.1
Host: vulnerable-website.com
Host: hacker-domain.com
  • Thêm ký tự line wrapping (\r, \n)
GET /example HTTP/1.1
 Host: hacker-domain.com
Host: vulnerable-website.com
  • Truyền trực tiếp URL trên GET request:
GET https://vulnerable-website.com/ HTTP/1.1
Host: hacker-domain.com
  • Chèn thêm trường "X-Forwarded-Host" để override host:
GET /example HTTP/1.1
Host: vulnerable-website.com
X-Forwarded-Host: hacker-domain.com

III. Demo tấn công

Tấn công Host Header Injection thông qua chức năng Reset Password:

Lab portswigger: https://portswigger.net/web-security/host-header/exploiting/password-reset-poisoning/lab-host-header-basic-password-reset-poisoning

Mô hình tấn công image.png

Cách thức tấn công

Username nạn nhân: carlos (carlos@carlos-montoya.net)

image.png

Bước 1: Chức năng reset password sử dụng giá trị trường Host trong request của người dùng để tạo ra link reset password. Cấu trúc đường link sẽ là:

https://$HOST/password/reset?token={token}

Bước 2: Kẻ tấn công sẽ tìm cách thay đổi giá trị trường Host thành domain của attacker đang nẵm giữ, email sẽ là email của nạn nhân. Request gửi lên sẽ là request như sau:

image.png

Bước 3: Khi nạn nhận nhận được một đường link reset password trong email, nạn nhân click vào đường link. Vì đường link chứa domain của kẻ tấn công nên khi đó trên server của kẻ tấn công sẽ thu thập được đường link chứa token của nạn nhân. Vì dĩ nhiên, đường link mà nạn nhân nhận được sẽ không hoạt động.

image.png

Bước 4: Vì ở bước trước, nạn nhân click vào link (có token hợp lệ nhưng sai domain) nên token vẫn là hợp lệ. Lúc này, kẻ tấn công chỉ cần lấy token và thay domain của trang web và từ đó kẻ tấn công có thể đổi mật khẩu tài khoản của nạn nhân:

image.png

Bước 5: Kết quả là : BOOOOOOOOOOM

Tài khoản của nạn nhân đã bị đánh cắp:

image.png

IV. Cách phòng tránh:

  • Config để website lấy tên miền hiện tại được thiết lập sẵn trong cấu hình của server thay vì nhận từ request của người dùng
  • Kiểm tra request được gửi lên, Host header cần được kiểm tra bằng cách sử dụng một white list các host đã được thiết lập trước trên server để nhằm loại bỏ các host độc hại
  • Tắt chức năng cho phép override headers để tránh các cuộc tấn công ghi đề host header
  • Khi sử dụng Virtual hosting, nên tránh đặt các trang nội bộ cùng với các ứng dụng public để ngăn chặn các lỗ hổng xảy ra do config không an toàn

Lưu bút

Năm mới chúc cộng đồng Viblo và toàn thể contributors có nhiều sức khỏe và tràn đầy năng lượng. HAPPY NEW YEAR!!!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí