Penyerangan Pada Bug HTTP Host Header
Untuk memahami injeksi header host, Anda harus terlebih dahulu mengetahui apa itu header host, cara kerjanya, cara menyuntikkan konten berbahaya, cara mengotori cache web, cara menyetel ulang sandi, dan banyak lagi. Inilah yang perlu Anda ketahui tentang header host dan serangan injeksi ini:
Apa itu header host HTTP?
Header host HTTP adalah header permintaan yang menentukan domain yang akan diakses oleh klien (browser). Header ini diperlukan karena cukup standar bagi server untuk meng-host situs web dan aplikasi dengan alamat IP yang sama. Namun, itu tidak secara otomatis tahu ke mana harus mengirim permintaan.
Saat server menerima permintaan, server memeriksa parameter header host untuk mengidentifikasi domain yang perlu memproses permintaan dan mengirimkannya. Header dapat dimodifikasi saat dirutekan ke domain yang sesuai. Injeksi header host dapat terjadi di sini.
Alasan banyak situs web di-host di satu alamat IP, di satu sisi, adalah karena habisnya alamat IPv4 dan popularitas cloud hosting.
Ada dua cara utama untuk mengakses beberapa situs web dengan alamat IP yang sama. Pertama, ini adalah saat virtual host atau sistem perantara ada.
virtual Host
Ketika beberapa situs web atau aplikasi di-host di satu server, ini disebut hosting virtual. Dalam skenario ini, server memiliki satu alamat IP dan permintaan masuk diarahkan ke domain terkait.
Sistem Perantara
Opsi lainnya anda dapat menggunakan sistem perantara untuk menemukan beberapa situs web dengan satu alamat IP. Dalam hal ini, situs web terletak di server yang berbeda tetapi diakses melalui mediator seperti server proxy terbalik, jaringan pengiriman konten (CDN), sindikasi web, atau bentuk perutean lalu lintas lainnya.
Untuk alasan yang sama seperti di atas, ini memerlukan instruksi kepada perantara ke mana harus meneruskan permintaan yang masuk.
Apa fungsi dari header host HTTP?
Situs web dan aplikasi tidak memiliki alamat IP pribadinya sendiri, jadi tujuan dari header host adalah untuk memberikan informasi kepada server tentang penerima yang sesuai dari permintaan downstream.
Header host menentukan bahwa domain yang dihosting di server (backend) harus menerima dan memproses permintaan klien, dan server meneruskannya sesuai dengan itu. Backend tidak tahu bagaimana permintaan memasuki jaringan, sehingga mengikuti rute yang sama untuk menanggapi permintaan tersebut.
Contoh header host HTTP
Misalnya, jika Anda ingin menampilkan halaman blog utama, permintaan berisi header host berikut:
GET /security-penetration-testing-blog HTTP/1.1
Host: www.crashtest-security.com
Jadi bagaimana jika tajuk host permintaan cacat? Sayangnya, sebagian besar server dikonfigurasi untuk melayani host virtual pertama (yaitu, situs web default) untuk permintaan yang tidak memiliki header host yang dapat dikenali.
Header host dikendalikan oleh pengguna, sehingga permintaan yang berisi header host apa pun dapat dikirim ke virtual host pertama di server mana pun. Ini dimungkinkan karena tidak ada cara untuk memeriksa apakah domain yang terdapat dalam header host sesuai dengan bagian alamat IP dari handshake Transmission Control Protocol (TCP) pertama. Oleh karena itu, hampir semua orang yang dapat memanipulasi permintaan yang masuk dapat mengutak-atik header host.
Ini membuka pintu ke injeksi header host, yang memanipulasi perilaku sisi server dan menyediakan konten berbahaya kepada pengguna.
Apa itu Injeksi Header Host?
Injeksi header host mengeksploitasi kerentanan di beberapa situs web dan menerimanya tanpa pandang bulu tanpa memvalidasi atau sepenuhnya keluar dari header host.
Ini berbahaya karena banyak aplikasi bergantung pada header host untuk pembuatan tautan, impor skrip, penentuan alamat pengalihan yang tepat, pembuatan tautan pengaturan ulang kata sandi, dan sebagainya. Oleh karena itu, saat aplikasi mendapatkan header host, aplikasi tersebut dapat menyajikan konten berbahaya sebagai respons. Itu akan disuntikkan di sana.
Contohnya adalah permintaan untuk mendapatkan halaman web e-banking (https://www.your-ebanking.com/login.php).
Jika penyerang dapat mengubah header host permintaan dan mengubahnya menjadi https://www.attacker.com/login.php, situs web palsu ini akan ditawarkan kepada pengguna dan menipu pengguna untuk memasukkan kredensial login mereka. kemungkinan.
Di atas adalah contoh kasar tentang cara menyisipkan header host. Injeksi header host yang berhasil dapat menyebabkan keracunan cache web, keracunan pengaturan ulang kata sandi, akses ke host internal, skrip lintas situs (XSS), bypass otentikasi, paksaan host virtual, dan banyak lagi. Di bawah ini adalah dua skenario injeksi header host HTTP utama.
Keracunan cache web
Keracunan cache web terjadi ketika penyerang dapat berinteraksi dengan server proxy caching atau sistem perantara lain yang disediakan oleh situs web.
Untuk tujuan ini, penyerang harus terlebih dahulu meracuni proxy itu sendiri. Mencapai ini memungkinkan Anda untuk menangkap pengguna tak terduga yang mencari situs web tertentu dan menyajikan situs web palsu.
Tergantung pada kasus tertentu, ini dapat dilakukan dengan memodifikasi header host, menggunakan beberapa header host, atau menggunakan header X-Forwarded-Host. Yang terakhir ini digunakan ketika aplikasi menolak header host yang dirusak. Intinya, ini hanyalah pendekatan yang berbeda menuju tujuan akhir menyajikan konten yang terkontaminasi.
Jika pengguna berhasil tertipu, mereka dapat menjalankan skrip yang membuka pintu untuk serangan lain.
Kecanduan mengatur ulang kata sandi
Efek potensial lain dari injeksi header host adalah bahwa hal itu mengganggu fungsionalitas pengaturan ulang kata sandi. Akibatnya, Anda dapat mengelabui pengguna agar mengeklik tautan setel ulang untuk menyetel ulang dan mengambil sandi baru. Untuk memahami masalah ini, Anda perlu memahami perbedaan antara URL relatif dan absolut.
URL relatif dan URL absolut
Dalam kebanyakan kasus, situs web dan aplikasi tidak perlu mengetahui domain tempat mereka bekerja dan memberikan URL relatif, bukan URL absolut. URL relatif adalah pilihan yang lebih baik dari perspektif pengembangan dan memberikan keamanan yang lebih baik.
Namun, URL absolut diperlukan dalam kasus tertentu, seperti saat tautan dibuat sebagai tanggapan atas permintaan penyetelan ulang sandi. Selain itu, pengguna memerlukan URL absolut untuk mengakses situs web dari luar. Oleh karena itu, pengguna perlu mengetahui alamat domain lengkap.
Jika aplikasi web menggunakan header host saat membuat tautan reset, itu mungkin memberikan pengguna tautan beracun jika header host telah dirusak. Jika pengguna tidak memperhatikan tautan dan situs web terlihat seperti yang diharapkan, kredensial dapat dikirimkan secara efektif ke penyerang.
Kerentanan Injeksi Header Host
Kerentanan header host dapat terjadi karena beberapa alasan. Pertama, ada cara untuk menimpa host dan melakukan injeksi, bahkan jika header host diproses dengan hati-hati. Banyak kerentanan terjadi ketika opsi konfigurasi default sisi server atau komponen pihak ketiga yang tidak dilindungi dengan benar terintegrasi, Alasan umum untuk jenis serangan injeksi ini adalah:
- Server yang menerima header host yang berubah-ubah atau salah format untuk opsi default atau fallback
- Validasi domain rusak yang memungkinkan penyerang merusak port atau memasukkan subdomain acak
- Permintaan ambigu dengan header host duplikat, URL absolut dari baris permintaan, header host, header indentasi, dll.
- Permintaan HTTP yang diselundupkan (Smuggled)
- Header override yang disisipkan untuk X-Host, X-Forwarded-Server, dll.
Bagaimana cara mencegah serangan header host?
Tergantung pada jenis konfigurasi, ada beberapa cara untuk mencegah penyisipan header host. Tentu saja, pendekatan paling sederhana adalah selalu tidak mempercayai header host dan tidak menggunakannya dalam kode sisi server. Perubahan sederhana ini pada dasarnya menghilangkan kemungkinan serangan header host yang diluncurkan terhadap pengguna.
Namun, ini tidak selalu memungkinkan, jadi jika Anda perlu menggunakan header host, Anda harus mempertimbangkan untuk menerapkan solusi berikut: Gunakan URL relatif bila memungkinkan.
Use relative URLs as much as possible.
Mulailah dengan mempertimbangkan apakah URL absolut itu penting. Dalam banyak kasus, dimungkinkan untuk menggunakan URL relatif sebagai gantinya.
Jika Anda perlu menggunakan URL absolut tertentu, seperti surat transaksional, Anda perlu menentukan domain di file konfigurasi sisi server dan mendapatkannya dari sana. Ini menghilangkan kemungkinan keracunan pengaturan ulang kata sandi dengan tidak mereferensikan header host saat membuat token.
Validasi tajuk host
Masukan pengguna harus selalu dianggap tidak aman dan harus divalidasi dan disanitasi terlebih dahulu. Salah satu cara untuk memvalidasi header host sesuai kebutuhan adalah dengan membuat daftar putih domain yang diizinkan dan memeriksa header host untuk permintaan masuk terhadap daftar ini. Setiap host yang tidak dikenal harus ditolak atau dialihkan.
Untuk memahami cara menerapkan daftar putih seperti itu, lihat dokumentasi kerangka kerja yang relevan.
Saat memvalidasi header host, Anda juga perlu memastikan bahwa permintaan berasal dari host target asli.
Daftar putih domain tepercaya
Sudah dalam pengembangan, semua nama domain tepercaya yang membalikkan proksi, penyeimbang beban, atau sistem perantara lainnya yang dapat meneruskan permintaan harus masuk daftar putih. Ini membantu mencegah serangan berbasis perutean seperti pemalsuan permintaan sisi server (SSRF). Terapkan pemetaan domain
Memetakan semua server asal yang dibutuhkan proxy untuk menangani permintaan. Artinya, petakan nama host ke situs web Anda. Tolak penggantian header
Header override host seperti X-Host dan X-Forwarded-Host sering digunakan dalam injeksi header. Sangat penting untuk memeriksa ulang bahwa ini bukan masalahnya, karena server mungkin mendukung ini secara default. Hindari menggunakan situs web khusus internal di bawah host virtual
Injeksi header host dapat digunakan untuk mengakses domain internal (pribadi). Hindari skenario ini dan jangan host situs web publik dan pribadi di host virtual yang sama.
Buat host virtual tiruan
Jika Anda menggunakan Apache atau Nginx, Anda dapat membuat host virtual tiruan untuk menangkap permintaan dari header host yang tidak dikenal (yaitu, permintaan palsu) dan mencegah keracunan cache.
Ubah konfigurasi server
Penyisipan header host sering kali disebabkan oleh pengaturan default, konfigurasi server yang gagal, atau konfigurasi server lama. Dengan memeriksa dan memperbaiki konfigurasi server, Anda dapat menghilangkan kerentanan kritis yang membuka pintu untuk injeksi.
FAQ
Apa itu Injeksi Header Host?
Injeksi header host HTTP adalah serangan di mana aktor jahat memodifikasi header host dari permintaan klien. Ini salah paham bahwa host virtual atau sistem perantara memberikan konten beracun kepada klien sebagai tanggapan.
Apakah serangan header host berbahaya?
Memasukkan header host dapat berpotensi berbahaya karena dapat mencemari cache web dan membahayakan fitur pengaturan ulang kata sandi. Untungnya, ini dapat dengan mudah dicegah dengan konfigurasi server yang tepat. Bagaimana cara menghindari serangan header host?
Yang paling penting-jangan percaya header host sama sekali atau tanpa pra-verifikasi yang tepat. Jika Anda tidak punya pilihan selain menggunakan header host, terapkan daftar putih domain yang diizinkan. Apa risiko yang terkait dengan injeksi header host?
Serangan header host yang berhasil dapat menyebabkan berbagai masalah, termasuk polusi cache web, kompromi pengaturan ulang kata sandi, skrip lintas situs dan permintaan pemalsuan sisi server, injeksi SQL, dan pembajakan sesi.