26Aug

Bagaimana Hacker Mengambil alih Situs Web dengan SQL Injection dan DDoS

click fraud protection

Bahkan jika Anda hanya mengikuti kejadian kelompok hacker Anonymous dan LulzSec, Anda mungkin pernah mendengar tentang situs web dan layanan yang diretas, seperti hacks Sony yang terkenal. Pernahkah Anda bertanya-tanya bagaimana mereka melakukannya?

Ada sejumlah alat dan teknik yang digunakan kelompok ini, dan sementara kami tidak berusaha memberi Anda manual untuk melakukan ini sendiri, ada gunanya untuk memahami apa yang sedang terjadi. Dua dari serangan yang Anda dengar secara konsisten tentang penggunaan "Denial of Service"( Distributed) Denial of Service "(DDoS) dan" SQL Injection "(SQLI).Begini cara kerjanya.

Gambar oleh xkcd

Denial of Service Attack

Apa itu?

Sebuah "penolakan layanan"( kadang-kadang disebut serangan "distributed denial of service" atau DDoS) terjadi ketika sebuah sistem, dalam kasus ini sebuah server web, menerima begitu banyak permintaan pada satu waktu sehingga sumber daya server kelebihan beban sistem hanya menguncinaik dan mati. Tujuan dan hasil dari serangan DDoS yang berhasil adalah situs web di server target tidak tersedia untuk melegitimasi permintaan lalu lintas.

instagram viewer

Bagaimana cara kerjanya?

Logistik serangan DDoS mungkin paling baik dijelaskan dengan sebuah contoh.

Bayangkan satu juta orang( penyerang) bergabung dengan tujuan menghambat bisnis Perusahaan X dengan menurunkan call center mereka. Penyerang berkoordinasi sehingga pada hari Selasa pukul 09.00 mereka semua akan menghubungi nomor telepon Perusahaan X.Kemungkinan besar, sistem telepon Perusahaan X tidak akan mampu menangani satu juta panggilan sekaligus sehingga semua jalur masuk akan diikat oleh penyerang. Hasilnya adalah panggilan pelanggan yang sah( yaitu orang-orang yang bukan penyerangnya) tidak melalui karena sistem telepon diikat menangani panggilan dari penyerang. Jadi pada intinya Perusahaan X berpotensi kehilangan bisnis karena permintaan sah yang tidak dapat diupayakan.

Serangan DDoS pada server web bekerja dengan cara yang persis sama. Karena hampir tidak ada cara untuk mengetahui lalu lintas apa yang bersumber dari permintaan yang sah vs penyerang sampai server web memproses permintaan, jenis serangan ini biasanya sangat efektif.

Melaksanakan serangan

Karena sifat "brute force" serangan DDoS, Anda harus memiliki banyak komputer yang semuanya terkoordinasi untuk menyerang pada saat bersamaan. Meninjau kembali contoh call center kami, ini akan mengharuskan semua penyerang untuk kedua tahu untuk menelepon jam 9 pagi dan benar-benar menelepon pada saat itu. Meskipun prinsip ini pasti akan berhasil ketika menyerang server web, semakin mudah komputer zombie, alih-alih komputer berawak yang sebenarnya, digunakan. Seperti yang mungkin Anda ketahui, ada banyak varian malware dan trojan yang, sekali di sistem Anda, terbengkalai dan kadang-kadang "menelepon rumah" untuk mendapatkan petunjuk. Salah satu petunjuk ini bisa, misalnya, mengirim permintaan berulang ke server web Perusahaan X pada pukul 09:00.Jadi dengan satu update ke lokasi rumah dari malware masing-masing, satu penyerang dapat langsung mengkoordinasikan ratusan ribu komputer yang dikompromikan untuk melakukan serangan DDoS yang masif.

Keindahan memanfaatkan komputer zombie tidak hanya dalam keefektifannya, namun juga anonimitasnya karena penyerang tidak benar-benar harus menggunakan komputer mereka sama sekali untuk melakukan serangan tersebut.

SQL Injection Attack

Apa itu?

Serangan "SQL injection"( SQLI) adalah eksploitasi yang memanfaatkan teknik pengembangan web yang buruk dan, biasanya dikombinasikan dengan, keamanan basis data yang salah. Hasil dari serangan yang berhasil dapat berkisar dari meniru akun pengguna hingga kompromi lengkap dari database atau server masing-masing. Tidak seperti serangan DDoS, serangan SQLI benar-benar dan mudah dicegah jika aplikasi web diprogram secara tepat.

Melaksanakan serangan

Setiap kali Anda login ke situs web dan memasukkan nama pengguna dan kata sandi Anda, untuk menguji kredensial Anda, aplikasi web mungkin menjalankan query seperti berikut:

PILIH UserID FROM Users WHERE UserName = 'myuser' AND Password= 'mypass';

Catatan: nilai string dalam query SQL harus dilampirkan dalam tanda petik tunggal sehingga mereka muncul di sekitar nilai yang dimasukkan pengguna.

Jadi kombinasi dari nama pengguna yang dimasukkan( myuser) dan kata sandi( mypass) harus sesuai dengan entri di tabel Pengguna agar UserID dikembalikan. Jika tidak ada yang cocok, tidak ada UserID yang dikembalikan sehingga kredensial masuk tidak sah. Sementara implementasi tertentu mungkin berbeda, mekanikanya cukup standar.

Jadi sekarang mari kita lihat query otentikasi template yang bisa kita gunakan untuk mengganti nilai yang masuk pengguna pada formulir web:

PILIH UserID FROM Users WHERE UserName = '[user]' AND Password = '[pass]'

Sekilas inimungkin tampak seperti langkah sederhana dan logis untuk memudahkan pengguna yang memvalidasi, namun jika substitusi sederhana dari pengguna memasukkan nilai dilakukan pada template ini, rentan terhadap serangan SQLI.

Misalnya, anggap "myuser'-" dimasukkan ke dalam field nama pengguna dan "wrongpass" dimasukkan dalam kata sandi. Dengan menggunakan substitusi sederhana dalam query template kita, kita akan mendapatkan ini:

PILIH UserID FROM Users WHERE UserName = 'myuser' - 'AND Password =' ​​wrongpass '

Kunci pernyataan ini adalah masuknya dua tanda hubung( -).Ini adalah token komentar awal untuk pernyataan SQL, jadi apapun yang muncul setelah dua tanda hubung( inklusif) akan diabaikan. Intinya, query di atas dieksekusi oleh database sebagai:

SELECT UserID FROM Users WHERE UserName = 'myuser'

Kelalaian mencolok di sini adalah kurangnya cek kata sandi. Dengan memasukkan dua tanda hubung sebagai bagian dari bidang pengguna, kami benar-benar melewati kondisi cek password dan dapat masuk sebagai "myuser" tanpa mengetahui kata sandinya. Tindakan memanipulasi query untuk menghasilkan hasil yang tidak diinginkan adalah serangan injeksi SQL.

Kerusakan apa yang bisa dilakukan?

Serangan injeksi SQL disebabkan oleh pengodean aplikasi yang lalai dan tidak bertanggung jawab dan benar-benar dapat dicegah( yang akan kita bahas sebentar lagi), namun tingkat kerusakan yang dapat dilakukan bergantung pada penyiapan basis data. Agar aplikasi web bisa berkomunikasi dengan database backend, aplikasi harus menyediakan login ke database( catatan, ini berbeda dari user login ke situs web itu sendiri).Bergantung pada hak akses yang dibutuhkan aplikasi web, akun database masing-masing ini memerlukan sesuatu dari izin baca / tulis di tabel yang ada hanya untuk akses basis data penuh. Jika ini tidak jelas sekarang, beberapa contoh akan membantu memberikan kejelasan.

Berdasarkan contoh di atas, Anda dapat melihat bahwa dengan memasukkan, misalnya, "youruser '-", "admin' -" atau nama pengguna lainnya, kita dapat langsung masuk ke situs tersebut sebagai pengguna tanpa mengetahui kata sandinya..Begitu kita berada dalam sistem tidak tahu kita sebenarnya bukan pengguna itu maka kita memiliki akses penuh ke akun masing-masing. Perizinan database tidak akan menyediakan jaring pengaman untuk ini karena, biasanya, situs web setidaknya memiliki akses baca / tulis ke database masing-masing.

Sekarang mari kita asumsikan bahwa situs web memiliki kontrol penuh terhadap database masing-masing yang memberi kemampuan untuk menghapus catatan, menambah / menghapus tabel, menambahkan akun keamanan baru, dan lain-lain. Penting untuk dicatat bahwa beberapa aplikasi web memerlukan jenis izin ini. Bukan secara otomatis hal buruk yang dikontrol penuh dikabulkan.

Jadi untuk menggambarkan kerusakan yang bisa dilakukan dalam situasi ini, kita akan menggunakan contoh yang diberikan dalam komik di atas dengan memasukkan berikut ke dalam field nama pengguna: "Robert '; DROP TABLE Users; -".Setelah substitusi sederhana, permintaan otentikasi menjadi:

PILIH UserID FROM Users WHERE UserName = 'Robert';DROP TABLE Users; - 'AND Password =' ​​wrongpass '

Catatan: titik koma dalam query SQL digunakan untuk menandakan akhir dari sebuah pernyataan tertentu dan awal sebuah pernyataan baru.

Yang dijalankan oleh database sebagai:

PILIH UserID DARI Pengguna WHERE UserName = 'Robert'

DROP TABLE Users

Jadi begitu saja, kami telah menggunakan serangan SQLI untuk menghapus keseluruhan tabel Pengguna. Tentu saja, jauh lebih buruk dapat dilakukan karena, tergantung pada izin SQL yang diizinkan, penyerang dapat mengubah nilai, tabel dump( atau keseluruhan database itu sendiri) ke file teks, membuat akun login baru atau bahkan membajak seluruh instalasi database.

Mencegah serangan injeksi SQL

Seperti yang telah kami sebutkan sebelumnya, serangan injeksi SQL mudah dicegah. Salah satu aturan utama pengembangan web adalah Anda tidak pernah secara membabi buta mempercayai masukan pengguna seperti yang kami lakukan saat melakukan substitusi sederhana pada kueri template kami di atas.

Serangan SQLI mudah digagalkan oleh apa yang disebut sanitasi( atau melarikan diri) masukan Anda. Proses sanitasi sebenarnya cukup sepele karena semua dasarnya pada dasarnya adalah menangani karakter kutipan tunggal tunggal( ') dengan tepat sedemikian rupa sehingga tidak dapat digunakan untuk menghentikan secara prematur string di dalam pernyataan SQL.

Misalnya, jika Anda ingin mencari "O'neil" dalam database, Anda tidak dapat menggunakan substitusi sederhana karena kutipan tunggal setelah O akan menyebabkan string berakhir sebelum waktunya. Sebagai gantinya Anda membersihkannya dengan menggunakan karakter escape database masing-masing. Mari kita asumsikan karakter escape untuk inline single quote adalah prefacing setiap quote dengan simbol \.Jadi "O'neal" akan disanitasi sebagai "O \ 'neil".

Tindakan sanitasi sederhana ini cukup banyak mencegah serangan SQLI.Sebagai ilustrasi, mari kita lihat contoh sebelumnya dan melihat kueri yang dihasilkan saat input pengguna disanitasi.

myuser '- myuser' - / salahpass :

PILIH UserID DARI Pengguna WHERE UserName = 'myuser \' - 'AND Password =' ​​wrongpass '

Karena kutipan tunggal setelah myuser diloloskan( artinya itu dianggap sebagai bagian dari targetnilai), database secara harfiah akan mencari UserName dari "myuser '-".Selain itu, karena tanda hubung disertakan dalam nilai string dan bukan pernyataan SQL itu sendiri, mereka akan dianggap sebagai bagian dari nilai target alih-alih ditafsirkan sebagai komentar SQL.

Robert ';DROP TABLE Users; - / salahpass :

PILIH UserID DARI Pengguna WHERE UserName = 'Robert \';DROP TABLE Users; - 'AND Password =' ​​wrongpass '

Dengan hanya melepaskan kutipan tunggal setelah Robert, keduanya titik koma dan garis-garisnya terkandung di dalam string pencarian UserName sehingga database benar-benar akan mencari "Robert'; DROP TABLE Users;- "alih-alih mengeksekusi tabel hapus

Dalam Ringkasan

Sementara serangan web berkembang dan menjadi lebih canggih atau fokus pada titik masuk yang berbeda, penting untuk diingat untuk melindungi dari serangan coba dan serangan sejati yang telah menjadi inspirasi beberapa alat peretas yang tersedia secara bebas yang dirancang untuk memanfaatkannya..

Beberapa jenis serangan, seperti DDoS, tidak dapat dengan mudah dihindari sementara yang lain, seperti SQLI, bisa. Namun, kerusakan yang bisa dilakukan oleh jenis serangan ini bisa berkisar dari ketidaknyamanan hingga bencana tergantung pada tindakan pencegahan yang dilakukan.