Bagaimana Hacker Mengambil Tapak Web dengan Suntikan SQL dan DDoS
Sekali sekiranya anda hanya mengikuti perkembangan kumpulan penggodam Anonymous dan LulzSec, anda mungkin pernah mendengar mengenai laman web dan perkhidmatan yang digodam, seperti hacks Sony yang terkenal. Pernahkah anda tertanya-tanya bagaimana mereka melakukannya?
Terdapat beberapa alat dan teknik yang digunakan oleh kumpulan ini, dan ketika kami tidak cuba memberikan manual untuk melakukannya sendiri, ini berguna untuk memahami apa yang sedang berlaku. Dua serangan yang anda secara konsisten mendengar mengenai penggunaannya ialah "(Pengedaran) Penolakan Perkhidmatan" (DDoS) dan "SQL Injections" (SQLI). Inilah cara mereka bekerja.
Imej oleh xkcd
Penafian Penyerang Perkhidmatan
Apa itu?
"Penafian perkhidmatan" (kadangkala dinamakan "serangan penafian diedarkan" atau serangan DDoS) berlaku apabila sistem, dalam hal ini pelayan web, menerima begitu banyak permintaan pada satu ketika sumber daya server terlalu banyak sistem hanya mengunci dan menutup. Matlamat dan hasil dari serangan DDoS yang berjaya adalah laman web pada pelayan sasaran tidak tersedia untuk permintaan trafik yang sah.
Bagaimanakah ia berfungsi?
Logistik serangan DDoS mungkin dijelaskan dengan baik oleh contoh.
Bayangkan satu juta orang (penyerang) bersama-sama dengan matlamat menghalang perniagaan Syarikat X dengan menundukkan pusat panggilan mereka. Penyerang menyelaras supaya pada hari Selasa pukul 9 pagi mereka akan memanggil nombor telefon Syarikat X. Kemungkinan besar, sistem telefon Syarikat X tidak dapat mengendalikan satu juta panggilan serentak sehingga semua baris masuk akan diikat oleh penyerang. Hasilnya ialah panggilan pelanggan yang sah (iaitu mereka yang bukan penyerang) tidak dapat melalui kerana sistem telefon terikat menangani panggilan dari penyerang. Jadi pada dasarnya Company X berpotensi kehilangan bisnis karena permintaan yang sah tidak dapat dilalui.
Serangan DDoS pada pelayan web berfungsi dengan cara yang sama. Kerana hampir tidak ada cara untuk mengetahui apa trafik yang diperolehi daripada permintaan yang sah vs. penyerang sehingga pelayan web memproses permintaan itu, serangan jenis ini biasanya sangat berkesan.
Melaksanakan serangan
Disebabkan sifat "kekerasan" serangan DDoS, anda perlu mempunyai banyak komputer yang semuanya diselaraskan untuk menyerang pada masa yang sama. Kembali ke contoh pusat panggilan kami, ini memerlukan semua penyerang untuk mengetahui panggilan pada pukul 9 pagi dan sebenarnya panggilan pada masa itu. Walaupun prinsip ini tentunya akan berfungsi apabila menyerang pelayan web, ia menjadi lebih mudah apabila komputer zombie, bukan komputer kendali sebenar, digunakan.
Seperti yang mungkin anda ketahui, terdapat banyak variasi malware dan trojan yang, sekali pada sistem anda, terletak tidak aktif dan kadang-kadang "rumah telefon" untuk arahan. Salah satu arahan ini boleh, misalnya, menghantar permintaan berulang ke pelayan web Syarikat X pada jam 9 pagi. Jadi dengan kemas kini tunggal ke lokasi rumah malware masing-masing, penyerang tunggal dengan serta-merta boleh menyelaraskan beratus-ratus ribu komputer yang dikompromi untuk melakukan serangan DDoS secara besar-besaran.
Keindahan penggunaan komputer zombie bukan hanya dalam keberkesanannya, tetapi juga dengan tidak mahu dikenalinya sebagai penyerang sebenarnya tidak perlu menggunakan komputer mereka sama sekali untuk melaksanakan serangan.
Serangan Suntikan SQL
Apa itu?
Serangan SQL "suntikan" (SQLI) adalah eksploit yang memanfaatkan teknik pembangunan web yang lemah dan, biasanya digabungkan dengan keselamatan pangkalan data yang salah. Hasil dari serangan yang berjaya dapat berkisar dari menyamar sebagai pengguna akaun untuk kompromi lengkap dari pangkalan data atau pelayan masing-masing. Tidak seperti serangan DDoS, serangan SQLI sepenuhnya dan mudah dicegah jika aplikasi web diprogram dengan sewajarnya.
Melaksanakan serangan
Apabila anda log masuk ke laman web dan masukkan nama pengguna dan kata laluan anda, untuk menguji kelayakan anda, aplikasi web boleh menjalankan pertanyaan seperti yang berikut:
SELECT UserID FROM Users WHERE UserName = "myuser" AND Password = "mypass";
Nota: nilai rentetan dalam pertanyaan SQL mesti dilampirkan dalam petikan tunggal, sebab itulah mereka muncul di sekitar pengguna yang memasukkan nilai.
Jadi gabungan nama pengguna yang dimasukkan (myuser) dan kata laluan (mypass) mesti sepadan dengan entri dalam jadual Pengguna agar UserID dapat dikembalikan. Sekiranya tidak ada padanan, tiada UserID dikembalikan supaya kelayakan log masuk tidak sah. Walaupun pelaksanaan tertentu mungkin berbeza, mekanik cukup standard.
Jadi sekarang mari kita lihat pertanyaan pengesahan templat yang kita boleh menggantikan nilai pengguna masuk ke dalam borang web:
SELECT UserID FROM Users WHERE UserName = "[user]" AND Password = "[pass]"
Pada pandangan pertama ini mungkin kelihatan seperti langkah mudah dan logik untuk memudahkan pengguna mengesahkan, namun jika penggantian mudah pengguna memasuki nilai dilakukan pada templat ini, ia mudah terdedah kepada serangan SQLI.
Sebagai contoh, katakan "myuser'-" dimasukkan dalam medan nama pengguna dan "wrongpass" dimasukkan dalam kata laluan. Dengan menggunakan penggantian mudah dalam pertanyaan templat kami, kami akan mendapatkan ini:
SELECT UserID FROM Users WHERE UserName = "myuser" - 'AND Password = "wrongpass"
Kunci kepada pernyataan ini adalah kemasukan dua garis (-)
. Ini adalah token komen awal untuk penyataan SQL, jadi apa-apa yang muncul selepas dua garis putus (inklusif) akan diabaikan. Pada dasarnya, pertanyaan di atas dijalankan oleh pangkalan data sebagai:
SELECT UserID FROM Users WHERE UserName = "myuser"
Ketidakpatuhan di sini adalah kekurangan cek kata sandi. Dengan menyertakan kedua jalur sebagai sebahagian daripada medan pengguna, kami benar-benar melewati keadaan semakan kata laluan dan dapat masuk sebagai "myuser" tanpa mengetahui kata laluan masing-masing. Tindakan memanipulasi pertanyaan untuk menghasilkan hasil yang tidak diingini adalah serangan suntikan SQL.
Apa kerosakan yang boleh dilakukan?
Serangan suntikan SQL disebabkan oleh pengekodan permohonan yang cuai dan tidak bertanggungjawab dan boleh dicegah sepenuhnya (yang akan kita tutup dalam sekejap), namun sejauh mana kerusakan yang boleh dilakukan bergantung pada persediaan pangkalan data. Agar aplikasi web dapat berkomunikasi dengan pangkalan data backend, aplikasi mesti membekalkan log masuk ke pangkalan data (nota, ini berbeza daripada pengguna masuk ke laman web itu sendiri). Bergantung kepada apa kebenaran yang diperlukan oleh aplikasi web, akaun pangkalan data masing-masing boleh menghendaki apa-apa daripada membaca / menulis kebenaran dalam jadual sedia ada hanya untuk mengakses pangkalan data penuh. Jika ini tidak jelas sekarang, beberapa contoh harus membantu memberikan kejelasan.
Berdasarkan contoh di atas, anda dapat melihatnya dengan memasukkan, contohnya, "youruser '-", "admin' -"
atau nama pengguna lain, kami dapat dengan serta-merta masuk ke laman web ini sebagai pengguna tanpa mengetahui kata laluan. Sebaik sahaja kita berada dalam sistem tidak tahu kita sebenarnya bukan pengguna itu sehingga kita mempunyai akses penuh ke akaun masing-masing. Kebenaran pangkalan data tidak akan memberikan jaringan keselamatan untuk ini kerana, biasanya, laman web mesti mempunyai sekurang-kurangnya membaca / menulis akses ke pangkalan data masing-masing.
Sekarang mari kita asumsikan laman web ini mempunyai kawalan penuh dari pangkalan data masing-masing yang memberikan keupayaan untuk memadam rekod, menambah / mengalih keluar jadual, menambah akaun keselamatan baru, dan lain-lain. Penting untuk diketahui bahawa sesetengah aplikasi web mungkin memerlukan jenis izin ini supaya ia tidak secara automatik perkara buruk yang diberikan sepenuhnya kawalan.
Jadi untuk menggambarkan kerosakan yang boleh dilakukan dalam situasi ini, kami akan menggunakan contoh yang disediakan dalam komik di atas dengan memasukkan yang berikut ke dalam medan nama pengguna: "Robert '; DROP TABLE Users; -".
Selepas penggantian mudah pertanyaan pengesahan menjadi:
SELECT UserID FROM Users WHERE UserName = "Robert"; DROP TABLE Users; - 'AND Password = "wrongpass"
Nota: titik koma dalam query SQL digunakan untuk menandakan akhir pernyataan tertentu dan permulaan pernyataan baru.
Yang akan dilaksanakan oleh pangkalan data sebagai:
SELECT UserID DARI pengguna WHERE UserName = "Robert"
DROP TABLE Users
Jadi seperti itu, kami telah menggunakan serangan SQLI untuk menghapuskan keseluruhan jadual Pengguna.
Sudah tentu, lebih teruk boleh dilakukan seperti, bergantung kepada kebenaran SQL yang dibenarkan, penyerang boleh menukar nilai, jadual dump (atau keseluruhan pangkalan data itu sendiri) ke fail teks, membuat akaun log masuk baru atau merampas keseluruhan pemasangan pangkalan data.
Mencegah serangan suntikan SQL
Seperti yang telah kita nyatakan beberapa kali sebelum ini, serangan suntikan SQL mudah dicegah. Salah satu peraturan kardinal pembangunan web adalah anda tidak pernah membabi buta mempercayai input pengguna seperti yang kita lakukan apabila kami melakukan penggantian mudah dalam pertanyaan templat kami di atas.
Serangan SQLI mudah digagalkan oleh apa yang dipanggil sanitasi (atau melarikan diri) input anda. Proses sanitisasi sebenarnya agak remeh kerana yang pada dasarnya adalah mengendalikan apa-apa petikan tunggal sebaris (') yang tepat supaya mereka tidak boleh digunakan untuk menamatkan rentetan di dalam penyataan SQL.
Sebagai contoh, jika anda ingin mencari "O'neil" dalam pangkalan data, anda tidak boleh menggunakan penggantian mudah kerana sebut harga tunggal selepas O akan menyebabkan rentetan itu berakhir dengan lebih awal. Sebaliknya anda membersihkannya dengan menggunakan watak pelarian pangkalan data masing-masing. Mari kita anggap karakter melarikan diri untuk sebut harga sebaris adalah prefacing setiap petikan dengan simbol \. Jadi "O'neal" akan dibersihkan sebagai "O \ 'neil".
Tindakan sanitasi sederhana ini cukup menghalang serangan SQLI. Untuk menggambarkan, mari kita semak semula contoh terdahulu kita dan lihat pertanyaan yang dihasilkan apabila input pengguna dibersihkan.
myuser '--
/ salah jalan:
SELECT UserID FROM Users WHERE UserName = "myuser \" - 'AND Password = "wrongpass"
Kerana quote tunggal selepas myuser telah melarikan diri (bermakna ia dianggap sebahagian daripada nilai sasaran), pangkalan data secara literal akan mencari UserName of "myuser" - ".
Di samping itu, kerana sengkang dimasukkan dalam nilai rentetan dan bukan pernyataan SQL itu sendiri, mereka akan dianggap sebagai sebahagian daripada nilai sasaran dan bukan ditafsirkan sebagai ulasan SQL.
Robert '; DROP JALAN Pengguna;--
/ salah jalan:
SELECT UserID FROM Users WHERE UserName = "Robert \"; DROP TABLE Users; - 'AND Password = "wrongpass"
Dengan hanya melepaskan petikan tunggal selepas Robert, kedua titik koma dan sengkang terkandung dalam rentetan carian UserName sehingga pangkalan data secara literal akan mencari "Robert '; DROP TABLE Users; -"
bukannya melaksanakan hapus jadual.
Dalam Ringkasan
Walaupun serangan web berkembang dan menjadi lebih canggih atau menumpukan pada titik kemasukan yang lain, adalah penting untuk diingat untuk melindungi daripada serangan yang cuba dan benar yang telah menjadi inspirasi beberapa alat hacker yang tersedia secara percuma yang direka untuk mengeksploitasi mereka.
Sesetengah jenis serangan, seperti DDoS, tidak dapat dielakkan dengan mudah manakala yang lain, seperti SQLI, boleh. Walau bagaimanapun, kerosakan yang boleh dilakukan oleh jenis serangan ini boleh berkisar di mana-mana sahaja dari ketidaknyamanan kepada bencana bergantung kepada langkah berjaga-jaga yang diambil.