Bagaimana Peretas Mengambil alih Situs Web dengan SQL Injection dan DDoS
Bahkan jika Anda hanya mengikuti acara kelompok peretas Anonymous dan LulzSec secara longgar, Anda mungkin pernah mendengar tentang situs web dan layanan yang diretas, seperti peretasan Sony yang terkenal. Pernahkah Anda bertanya-tanya bagaimana mereka melakukannya?
Ada sejumlah alat dan teknik yang digunakan oleh kelompok-kelompok ini, dan sementara kami tidak mencoba untuk memberi Anda manual untuk melakukan ini sendiri, itu berguna untuk memahami apa yang terjadi. Dua serangan yang secara konsisten Anda dengar tentang mereka menggunakan adalah "(Didistribusikan) Denial of Service" (DDoS) dan "SQL Suntikan" (SQLI). Begini cara kerjanya.
Gambar oleh xkcd
Serangan Denial of Service
Apa itu?
Serangan “penolakan layanan” (kadang-kadang disebut “penolakan layanan terdistribusi” atau DDoS) terjadi ketika suatu sistem, dalam hal ini server web, menerima begitu banyak permintaan pada satu waktu sehingga sumber daya server kelebihan beban sehingga sistem hanya mengunci. dan dimatikan. Tujuan dan hasil dari serangan DDoS yang berhasil adalah situs web di server target tidak tersedia untuk permintaan lalu lintas yang sah.
bagaimana cara kerjanya?
Logistik serangan DDoS mungkin paling baik dijelaskan dengan sebuah contoh.
Bayangkan satu juta orang (penyerang) berkumpul dengan tujuan menghambat bisnis Perusahaan X dengan menurunkan call center mereka. Para penyerang berkoordinasi sehingga pada hari Selasa pukul 9 pagi mereka semua akan memanggil nomor telepon Perusahaan X. Kemungkinan besar, sistem telepon Perusahaan X tidak akan dapat menangani sejuta panggilan sekaligus sehingga semua saluran yang masuk akan diikat oleh para penyerang. Hasilnya adalah bahwa panggilan pelanggan yang sah (yaitu mereka yang bukan penyerang) tidak dapat melewati karena sistem telepon terikat menangani panggilan dari penyerang. Jadi intinya Perusahaan X berpotensi kehilangan bisnis karena permintaan yang sah tidak dapat dipenuhi.
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.
Melakukan serangan
Karena sifat "brute force" dari serangan DDoS, Anda harus memiliki banyak komputer yang terkoordinasi untuk menyerang secara bersamaan. Melihat kembali contoh pusat panggilan kami, ini akan membutuhkan semua penyerang untuk keduanya tahu untuk menelepon pada jam 9 pagi dan benar-benar menelepon pada waktu itu. Sementara prinsip ini pasti akan bekerja ketika datang untuk menyerang server web, itu menjadi lebih mudah ketika komputer zombie, daripada komputer berawak yang sebenarnya, digunakan.
Seperti yang mungkin Anda ketahui, ada banyak varian malware dan trojan yang, sekali pada sistem Anda, tidak aktif dan terkadang "menelepon ke rumah" untuk mendapatkan petunjuk. Salah satu dari instruksi ini dapat, misalnya, mengirim permintaan berulang ke server web Perusahaan X pada jam 9 pagi. Jadi dengan satu pembaruan ke lokasi asal malware masing-masing, seorang penyerang tunggal dapat langsung mengoordinasikan ratusan ribu komputer yang dikompromikan untuk melakukan serangan DDoS besar-besaran.
Keindahan menggunakan komputer zombie tidak hanya dalam efektivitasnya, tetapi juga dalam anonimitasnya sebagai penyerang tidak benar-benar harus menggunakan komputer mereka sama sekali untuk melakukan serangan.
Serangan Injeksi SQL
Apa itu?
Serangan "injeksi SQL" (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 menyamar sebagai akun pengguna hingga kompromi lengkap dari database atau server masing-masing. Tidak seperti serangan DDoS, serangan SQLI sepenuhnya dan mudah dicegah jika aplikasi web diprogram dengan tepat.
Melakukan serangan
Setiap kali Anda masuk ke situs web dan memasukkan nama pengguna dan kata sandi Anda, untuk menguji kredensial Anda, aplikasi web dapat menjalankan kueri seperti berikut:
PILIH UserID DARI Pengguna DI MANA UserName = "myuser" AND Password = "mypass";
Catatan: nilai string dalam kueri SQL harus dilampirkan dalam tanda kutip tunggal, itulah sebabnya mereka muncul di sekitar nilai yang dimasukkan pengguna.
Jadi kombinasi dari nama pengguna yang dimasukkan (pengguna saya) dan kata sandi (mypass) harus cocok dengan entri dalam tabel Users agar UserID dikembalikan. Jika tidak ada kecocokan, tidak ada UserID yang dikembalikan sehingga kredensial masuk tidak valid. Walaupun implementasi tertentu mungkin berbeda, mekanisnya cukup standar.
Jadi sekarang mari kita lihat kueri otentikasi templat yang dapat kita gantikan dengan nilai yang dimasukkan pengguna di formulir web:
PILIH UserID DARI Pengguna DI MANA UserName = "[user]" AND Password = "[pass]"
Pada pandangan pertama ini mungkin tampak seperti langkah mudah dan logis untuk dengan mudah memvalidasi pengguna, namun jika substitusi sederhana dari nilai yang dimasukkan pengguna dilakukan pada templat ini, ia rentan terhadap serangan SQLI.
Sebagai contoh, misalkan "pengguna saya-" dimasukkan dalam bidang nama pengguna dan "kesalahan akses" dimasukkan dalam kata sandi. Menggunakan subtitusi sederhana dalam kueri templat kami, kami akan mendapatkan ini:
PILIH UserID DARI Pengguna DI MANA UserName = "myuser" - 'AND Password = "wrongpass"
Kunci dari pernyataan ini adalah dimasukkannya dua garis putus-putus (-)
. Ini adalah token komentar mulai untuk pernyataan SQL, jadi apa pun yang muncul setelah dua tanda hubung (inklusif) akan diabaikan. Pada dasarnya, permintaan di atas dijalankan oleh database sebagai:
PILIH UserID DARI Pengguna DI MANA UserName = "myuser"
Kelalaian mencolok di sini adalah kurangnya pemeriksaan kata sandi. Dengan memasukkan dua tanda hubung sebagai bagian dari bidang pengguna, kami benar-benar melewati kondisi pemeriksaan kata sandi dan dapat masuk sebagai "pengguna" tanpa mengetahui kata sandi yang bersangkutan. Tindakan memanipulasi kueri untuk menghasilkan hasil yang tidak diinginkan adalah serangan injeksi SQL.
Kerusakan apa yang bisa dilakukan?
Serangan injeksi SQL disebabkan oleh pengkodean aplikasi yang lalai dan tidak bertanggung jawab dan sepenuhnya dapat dicegah (yang akan kita bahas sebentar lagi), namun tingkat kerusakan yang dapat dilakukan tergantung pada pengaturan database. Agar aplikasi web berkomunikasi dengan database backend, aplikasi harus menyediakan login ke database (catatan, ini berbeda dari login pengguna ke situs web itu sendiri). Bergantung pada izin apa yang diperlukan aplikasi web, akun basis data ini dapat meminta apa saja dari izin baca / tulis di tabel yang ada hanya untuk akses database penuh. Jika ini tidak jelas sekarang, beberapa contoh akan membantu memberikan kejelasan.
Berdasarkan contoh di atas, Anda dapat melihatnya dengan memasukkan, misalnya, "pengguna Anda '-", "admin' -"
atau nama pengguna lain, kami dapat langsung masuk ke situs sebagai pengguna itu tanpa mengetahui kata sandi. Setelah kami berada di sistem tidak tahu kami bukan pengguna yang sebenarnya, jadi kami memiliki akses penuh ke akun masing-masing. Izin basis data tidak akan menyediakan jaring pengaman untuk ini karena, biasanya, situs web harus memiliki setidaknya akses baca / tulis ke database masing-masing.
Sekarang mari kita asumsikan situs web memiliki kontrol penuh dari database masing-masing yang memberikan kemampuan untuk menghapus catatan, menambah / menghapus tabel, menambah akun keamanan baru, dll. Penting untuk dicatat bahwa beberapa aplikasi web dapat memerlukan jenis izin ini sehingga tidak secara otomatis merupakan hal buruk yang diberikan kendali penuh.
Jadi untuk menggambarkan kerusakan yang dapat dilakukan dalam situasi ini, kami akan menggunakan contoh yang disediakan dalam komik di atas dengan memasukkan yang berikut ke dalam bidang nama pengguna: "Robert '; Pengguna DROP TABLE; -".
Setelah penggantian sederhana permintaan otentikasi menjadi:
PILIH UserID DARI Pengguna DI MANA UserName = "Robert"; DROP TABLE Users; - 'AND Password = "wrongpass"
Catatan: titik koma dalam kueri SQL digunakan untuk menandakan akhir pernyataan tertentu dan awal pernyataan baru.
Yang dieksekusi oleh database sebagai:
PILIH UserID DARI Pengguna DI MANA UserName = "Robert"
DROP TABLE Users
Jadi seperti itu, kami telah menggunakan serangan SQLI untuk menghapus seluruh tabel Pengguna.
Tentu saja, jauh lebih buruk dapat dilakukan karena, tergantung pada izin SQL yang diizinkan, penyerang dapat mengubah nilai, membuang tabel (atau seluruh database itu sendiri) ke file teks, membuat akun login baru atau bahkan membajak seluruh instalasi basis data.
Mencegah serangan injeksi SQL
Seperti yang kami sebutkan beberapa kali sebelumnya, serangan injeksi SQL mudah dicegah. Salah satu aturan utama pengembangan web adalah Anda tidak pernah mempercayai input pengguna secara membabi buta seperti yang kami lakukan saat kami melakukan penggantian sederhana dalam kueri templat kami di atas.
Serangan SQLI mudah digagalkan oleh apa yang disebut membersihkan (atau melarikan diri) input Anda. Proses sanitasi sebenarnya cukup sepele karena semua yang dilakukan pada dasarnya adalah menangani setiap karakter inline single quote (') dengan tepat sehingga mereka tidak dapat digunakan untuk mengakhiri secara prematur sebuah string di dalam pernyataan SQL.
Misalnya, jika Anda ingin mencari "O'neil" dalam database, Anda tidak bisa menggunakan substitusi sederhana karena kutipan tunggal setelah O akan menyebabkan string berakhir sebelum waktunya. Sebagai gantinya Anda membersihkannya dengan menggunakan karakter pelarian basis data masing-masing. Mari kita asumsikan bahwa karakter escape untuk kutipan tunggal sebaris adalah prefacing setiap kutipan dengan simbol \. Jadi "O'neal" akan disanitasi sebagai "O \ neil".
Tindakan sanitasi sederhana ini cukup banyak mencegah serangan SQLI. Untuk mengilustrasikannya, mari kita kembali contoh-contoh kami sebelumnya dan melihat permintaan yang dihasilkan ketika input pengguna dibersihkan.
pengguna saya--
/ kesalahan jalan:
PILIH UserID DARI Pengguna DI MANA UserName = "myuser \" - 'AND Password = "wrongpass"
Karena kutipan tunggal setelah pengguna saya diloloskan (artinya ini dianggap sebagai bagian dari nilai target), basis data akan secara harfiah mencari UserName dari "myuser '-".
Selain itu, karena tanda hubung termasuk dalam nilai string dan bukan pernyataan SQL itu sendiri, mereka akan dianggap sebagai bagian dari nilai target daripada ditafsirkan sebagai komentar SQL.
Robert '; DROP TABLE Users;--
/ kesalahan jalan:
PILIH UserID DARI Pengguna DI MANA UserName = "Robert \"; DROP TABLE Users; - 'AND Password = "wrongpass"
Dengan hanya menghindari kutip tunggal setelah Robert, baik tanda titik koma dan tanda hubung terdapat dalam string pencarian UserName sehingga database akan mencari secara harfiah "Robert '; Pengguna DROP TABLE; -"
bukannya mengeksekusi hapus tabel.
Singkatnya
Sementara serangan web berevolusi dan menjadi lebih canggih atau fokus pada titik masuk yang berbeda, penting untuk diingat untuk melindungi dari serangan yang benar dan telah menjadi inspirasi dari beberapa "alat peretas" yang tersedia secara bebas yang dirancang untuk mengeksploitasi mereka.
Jenis serangan tertentu, seperti DDoS, tidak dapat dengan mudah dihindari sementara yang lain, seperti SQLI, bisa. Namun, kerusakan yang dapat dilakukan oleh jenis serangan ini dapat berkisar dari ketidaknyamanan hingga bencana tergantung pada tindakan pencegahan yang diambil.