Informasi untuk seorang penyerang adalah pengidentifikasi sesi, karena ini diperlukan untuk setiap serangan peniruan. Ada tiga metode yang umum digunakan untuk mendapatkan identifier sesi yang valid:
- Fixation
- Capture
- Prediction
Prediksi mengacu menebak identifier session yang valid. Dengan mekanisme session asli PHP, identifier session sangat acak, dan ini tidak mungkin menjadi titik terlemah dalam implementasi.Baca juga Mencari Shell c99 dengan Google Dork
Karena pengidentifikasi session biasanya disebarluaskan dalam cookie atau sebagai variabel GET, pendekatan yang berbeda fokus pada menyerang metode transfer. Sementara telah ada kerentanan browser sedikit tentang cookie, ini sebagian besar telah di Internet Explorer, dan cookies yang sedikit kurang terekspos dari GET variabel. bagi para pengguna yang memungkinkan cookies, Anda dapat memberikan mereka dengan mekanisme yang lebih aman dengan menggunakan cookie untuk menyebarkan sesi.
Fixation adalah metode paling sederhana untuk mendapatkan identifier session yang valid. Meskipun tidak sangat sulit untuk mempertahankan diri, jika mekanisme session Anda terdiri dari tidak lebih dari session_start (), Anda rentan.
Untuk menunjukkan session fixation, saya akan menggunakan script berikut, session-hijacking.php:
session_start();
if (!isset($_SESSION['visits']))
{
$_SESSION['visits'] = 1;
}
else
{
$_SESSION['visits']++;
}
echo $_SESSION['visits'];
Pertama pastikan bahwa Anda tidak memiliki identifier sesi yang ada (mungkin menghapus cookie), kemudian mengunjungi halaman ini dengan? PHPSESSID = 123456789 ditambahkan ke URL. Selanjutnya, dengan browser yang sama sekali berbeda (atau bahkan komputer yang sama sekali berbeda), kunjungi URL yang sama lagi dengan? PHPSESSID = 123456789 ditambahkan.
Anda akan melihat bahwa Anda tidak melihat 1 output pada kunjungan pertama Anda, melainkan terus sesi sebelumnya Anda dimulai.
Jika tidak ada sesi aktif terkait dengan identifier session bahwa pengguna menampilkan, maka menumbuhkan itu sekadar memastikan:
if (!isset($_SESSION['initiated']))
{
session_regenerate_id();
$_SESSION['initiated'] = true;
}
Masalah dengan pertahanan sederhana seperti itu adalah bahwa penyerang hanya dapat menginisialisasi sesi untuk identifier session tertentu dan kemudian menggunakan identifier yang untuk memulai serangan.
Jika mekanisme session Anda hanya memiliki session_start (), Anda rentan.
Dengan mekanisme session yang paling sederhana, identifier session yang valid adalah semua yang diperlukan untuk berhasil membajak sesi. Untuk memperbaiki ini, kita perlu melihat apakah ada sesuatu yang tambahan dalam permintaan HTTP yang dapat kita gunakan untuk identifikasi tambahan.
Hanya Host header yang diperlukan oleh HTTP / 1.1, sehingga tampaknya bijaksana untuk bergantung pada hal lain. Namun, konsistensi benar-benar semua yang kita butuhkan, karena kita hanya tertarik pada komplikasi peniruan tanpa mengganggu pengguna yang sah.
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 Gecko
Accept: text/xml, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=123456789
Bayangkan bahwa permintaan sebelumnya diikuti dengan permintaan dengan berbeda User-Agent:
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Compatible (MSIE)
Accept: text/xml, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=123456789