1. Ikhtisar
Dalam dua tahun terakhir, pakar keamanan harus lebih memperhatikan serangan pada lapisan aplikasi jaringan. Karena sekuat apa pun aturan firewall Anda atau seberapa rajin Anda menambalnya, jika pengembang aplikasi web Anda tidak mengikuti kode aman, penyerang akan memasuki sistem Anda melalui port 80. Dua teknik serangan utama yang banyak digunakan adalah serangan injeksi SQL [ref1] dan serangan CSS [ref2]. Injeksi SQL mengacu pada teknik memasukkan meta-karakter SQL (karakter khusus yang mewakili beberapa data) dan instruksi melalui area input Internet untuk memanipulasi eksekusi kueri SQL back-end. Serangan ini terutama menargetkan server WEB organisasi lain. Serangan CSS memastikan bahwa kode Javascript berbahaya berjalan di mesin korban dengan memasukkan tag skrip ke dalam URL dan kemudian meyakinkan pengguna yang mempercayai mereka untuk mengkliknya. Serangan ini memanfaatkan hubungan kepercayaan antara pengguna dan server. Faktanya, server tidak mendeteksi input dan output, sehingga tidak menolak kode JavaScript.
Artikel ini membahas teknik deteksi injeksi SQL dan kerentanan serangan CSS. Ada banyak diskusi di Internet tentang kedua jenis serangan berbasis WEB ini, seperti cara menerapkan serangan, dampaknya, dan cara mempersiapkan dan merancang program dengan lebih baik untuk mencegah serangan ini. Namun, diskusi tentang cara mendeteksi serangan ini belum cukup. Kami menggunakan IDS Snort open source yang populer [ref 3] untuk merumuskan ekspresi reguler berdasarkan aturan untuk mendeteksi serangan ini. Kebetulan, pengaturan aturan default Snort menyertakan metode untuk mendeteksi CSS, namun hal ini dapat dengan mudah dihindari. Misalnya, kebanyakan dari mereka menggunakan pengkodean hex, seperti %3C%73%63%72%69%70% 74%3E alih-alih <script> untuk menghindari deteksi.
Bergantung pada kemampuan organisasi pada tingkat paranoia, kami telah menulis beberapa aturan untuk mendeteksi serangan yang sama. Jika Anda ingin mendeteksi semua kemungkinan serangan injeksi SQL, Anda hanya perlu memperhatikan meta-karakter SQL yang ada, seperti tanda kutip tunggal, titik koma, dan tanda hubung ganda. Cara ekstrem lainnya untuk mendeteksi serangan CSS adalah dengan memperhatikan tanda kurung sudut pada tag HTML. Tapi ini akan mendeteksi banyak kesalahan. Untuk menghindari hal ini, aturan perlu dimodifikasi agar pendeteksiannya lebih tepat, namun tetap tidak menghindari kesalahan.
Gunakan kata kunci pcre (Ekspresi Reguler Kompatibel Perl) [ref4] dalam aturan Snort, dan setiap aturan dapat diambil dengan atau tanpa tindakan aturan lainnya. Aturan ini juga dapat digunakan oleh perangkat lunak publik seperti grep (alat pencarian dokumen) untuk meninjau log server jaringan. Namun, Anda perlu berhati-hati karena server WEB akan mencatat input pengguna di buku harian hanya ketika permintaan dikirimkan sebagai GET. Jika permintaan dikirimkan sebagai POST, permintaan tersebut tidak akan dicatat di buku harian.
2. Ekspresi Reguler untuk Injeksi SQL
Ketika Anda memilih ekspresi reguler untuk serangan injeksi SQL, penting untuk diingat bahwa penyerang dapat melakukan injeksi SQL dengan mengirimkan formulir, atau melalui bidang Cookie. Logika deteksi masukan Anda harus mempertimbangkan berbagai jenis masukan yang diatur oleh pengguna (seperti informasi formulir atau cookie). Dan jika Anda menemukan banyak peringatan yang berasal dari suatu aturan, perhatikan tanda kutip tunggal atau titik koma, karena karakter ini mungkin merupakan masukan yang valid dalam cookie yang dibuat oleh aplikasi web Anda. Oleh karena itu, Anda perlu mengevaluasi setiap aturan terhadap aplikasi web khusus Anda.
Seperti disebutkan sebelumnya, ekspresi reguler terperinci untuk mendeteksi serangan injeksi SQL harus memperhatikan meta-karakter khusus SQL, seperti tanda kutip tunggal (') dan tanda ekspansi ganda (--), untuk mengetahui karakter tersebut dan karakternya. bilangan setara hex, ekspresi reguler berikut ini berlaku:
2.1 Ekspresi reguler untuk mendeteksi meta-karakter SQL
/(%27)|(')|(--)|(%23)|(#)/ix
penjelasan:
Pertama-tama kita periksa hex dari ekuivalen kutipan tunggal, kutipan tunggal itu sendiri atau kutipan ganda tanda ekspansi. Ini adalah karakter MS SQL Server atau Oracle, yang menunjukkan bahwa berikut ini adalah komentar, dan semua komentar berikutnya akan diabaikan. Selain itu, jika Anda menggunakan MySQL, Anda perlu memperhatikan kemunculan '#' dan padanan hex-nya. Perhatikan bahwa kita tidak perlu memeriksa hex untuk tanda hubung ganda, karena ini bukan karakter meta HTML dan tidak akan dikodekan oleh browser. Selain itu, jika penyerang berhasil mengubah tanda hubung ganda secara manual ke nilai hex %2D (menggunakan proksi seperti Achilles [ref 5]), injeksi SQL akan gagal.
Aturan Snort baru yang ditambahkan ke ekspresi reguler di atas adalah sebagai berikut:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,founded;uricontent:".pl";pcre:
"/ (%27)|(')|(--)|(%23)|(#)/i"; classtype:Serangan aplikasi web;
artikel ini Dalam pembahasan, nilai kata kunci uricontent adalah ".pl" karena di lingkungan pengujian kami, program CGI ditulis dalam Perl. Nilai kata kunci uricontent bergantung pada aplikasi khusus Anda. Nilai ini dapat berupa ".php", atau ".asp", atau ".jsp", dll. Dari sudut pandang ini, kami tidak menampilkan aturan Snort yang sesuai, tetapi kami akan memberikan ekspresi reguler yang membuat aturan ini. Anda dapat dengan mudah membuat banyak aturan Snort melalui ekspresi reguler ini. Pada ekspresi reguler sebelumnya, kami mendeteksi tanda hubung ganda karena mungkin ada titik injeksi SQL meskipun tidak ada tanda kutip tunggal [ref 6]. Misalnya, entri kueri SQL hanya berisi nilai numerik, sebagai berikut:
pilih nilai1, nilai2, angka_nilai3 dari database
di mana num_value3=some_user_supplied_number
Dalam hal ini, penyerang dapat mengeksekusi query SQL tambahan. Demonstrasi mengirimkan masukan berikut:
3; memasukkan nilai ke dalam some_other_table.
Terakhir, pengubah pcre 'i' dan 'x' digunakan untuk mencocokkan huruf besar/kecil dan abaikan masing-masing ruang kosong. Aturan di atas juga dapat diperluas untuk memeriksa keberadaan titik koma. Namun, titik koma mungkin merupakan bagian dari respons HTTP normal. Untuk mengurangi kesalahan ini, dan untuk mencegah terjadinya tanda kutip tunggal dan tanda perluasan ganda secara normal, aturan di atas harus diubah untuk mendeteksi keberadaan tanda = terlebih dahulu. Input pengguna akan merespons permintaan GET atau POST. Umumnya, input dikirimkan sebagai berikut:
nama pengguna=some_user_supplied_value&password=some_user_supplied_value
Oleh karena itu, upaya injeksi SQL akan menyebabkan input pengguna muncul setelah tanda a = atau nilai hex yang setara.
2.2 Perbaiki ekspresi reguler untuk mendeteksi karakter meta SQL
/((%3D)|(=))[^n]*((%27)|(')|(--)|( %3B)|(:))/i
Penjelasan:
Aturan ini pertama-tama memperhatikan tanda = atau nilai hexnya (%3D), kemudian mempertimbangkan nol atau lebih karakter apa pun kecuali baris baru, dan terakhir mendeteksi tanda kutip tunggal dan tanda hubung ganda atau titik koma.
Injeksi SQL tipikal akan mencoba memanipulasi kueri asli seputar penggunaan tanda kutip tunggal untuk mendapatkan nilai yang berguna. Serangan ini umumnya dibahas menggunakan string 1'or'1'='1. Namun, deteksi string ini dapat dengan mudah dihindari, seperti menggunakan 1'or2>1 -- Namun, satu-satunya bagian yang konstan adalah nilai karakter awal, Ikuti satu kutipan dan tambahkan 'atau'. Logika Boolean berikut ini dapat bervariasi dalam berbagai gaya, dari yang biasa hingga yang sangat kompleks. Serangan ini dapat dideteksi dengan cukup akurat menggunakan ekspresi reguler berikut. Bab 2.3 menjelaskan.
2.3 Ekspresi reguler serangan injeksi SQL yang umum
/w*((%27)|('))((%6F)|o|(%4F))((%72)|r| (% 52))/ix
penjelasan:
w* - Nol atau lebih karakter atau garis bawah.
(%27)|' - kutipan tunggal atau setara hexnya.
(%6 F)|o|(%4 F))((%72)|r|-(%52) - Kasus 'atau' dan ekuivalen heksadesimalnya.
kueri union'SQL dalam injeksi SQL serangan juga sangat umum di berbagai database. Jika ekspresi reguler sebelumnya hanya mendeteksi tanda kutip tunggal atau karakter meta SQL lainnya, itu akan menyebabkan banyak kesalahan. Anda harus memodifikasi kueri lebih lanjut untuk mendeteksi tanda kutip tunggal dan kata 'union' juga dapat diperluas lebih lanjut dengan kata kunci SQL lainnya, seperti 'pilih', 'masukkan', 'perbarui', 'hapus', dll.
2.4 Mendeteksi injeksi SQL, ekspresi reguler kata kunci kueri UNION
/ ((%27)|(') )union/ix
(%27)|(') - kutipan tunggal dan padanan hexnya
union - Kata kunci union
juga dapat digunakan untuk menyesuaikan ekspresi untuk kueri SQL lainnya, seperti >pilih, sisipkan, perbarui, hapus, lepas, dll.
Jika, pada tahap ini, penyerang telah menemukan bahwa aplikasi web memiliki injeksi SQL kerentanannya, dia akan mencoba memanfaatkannya. Jika dia menyadari bahwa server backend adalah server MS SQL, dia biasanya akan mencoba menjalankan beberapa penyimpanan berbahaya dan prosedur tersimpan yang diperluas. Prosedur ini umumnya dimulai dengan huruf 'sp' atau 'xp'. Biasanya, dia mungkin mencoba menjalankan prosedur tersimpan diperpanjang 'xp_cmdshell' (yang menjalankan perintah Windows melalui SQL Server). Otoritas SA dari server SQL memiliki wewenang untuk menjalankan perintah ini. Demikian pula, mereka dapat memodifikasi registri melalui xp_regread, xp_regwrite dan prosedur tersimpan lainnya.
2.5 Penjelasan ekspresi reguler
/exec(s|+)+(s|x)pw+/ix
untuk mendeteksi serangan injeksi SQL MS SQL Server:
exec - kata kunci yang meminta eksekusi prosedur tersimpan atau diperpanjang
(s|+)+ - satu atau lebih spasi atau http yang setara
(s|x) huruf p- 'sp' atau 'xp' digunakan untuk mengidentifikasi prosedur penyimpanan atau penyimpanan yang diperluas
w+ - satu atau lebih karakter atau garis bawah untuk mencocokkan nama prosedur
3. Ekspresi reguler untuk skrip lintas situs (CSS)
Saat meluncurkan serangan CSS atau mendeteksi kerentanan situs web, penyerang mungkin terlebih dahulu membuat tag HTML sederhana seperti < b> (tebal), <i> (miring) atau <u> (garis bawah), atau dia mungkin mencoba tag skrip sederhana seperti <script>alert("OK")</script> digunakan sebagai contoh untuk mendeteksi apakah suatu situs web memiliki kerentanan CSS yang disebarkan melalui Internet. Upaya ini dapat dengan mudah dideteksi. Namun, penyerang yang cerdik bisa mengganti seluruh string dengan nilai hexnya. Dengan cara ini, tag <script> akan muncul sebagai %3C%73%63%72%69%70%74%3E. Di sisi lain, penyerang dapat menggunakan server proxy web seperti Achilles untuk secara otomatis mengubah beberapa karakter khusus seperti < menjadi %3C, > menjadi %3E di URL.
Ekspresi reguler berikut akan mendeteksi teks apa pun yang mengandung <, > dalam html. Ini akan menangkap upaya untuk menggunakan <b>, <u>, atau <script>. Regex ini harus mengabaikan huruf besar-kecil. Kita perlu mendeteksi braket sudut dan ekuivalen hexnya (% 3C|<). Untuk mendeteksi seluruh string yang dikonversi ke hex, kita harus mendeteksi angka dan tanda % yang dimasukkan oleh pengguna, yaitu menggunakan [a-z0-9%]. Hal ini mungkin menyebabkan munculnya beberapa bug, tetapi tidak sebagian besar dapat mendeteksi serangan sebenarnya.
3.1 Ekspresi reguler untuk serangan CSS umum
/((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)/ix
jelaskan :
((%3C)|<) - memeriksa < dan ekuivalen hexnya
((%2F)|/)* - tag penutup/ atau setara heksanya
[a-z0-9%]+ - Periksa huruf dalam tag atau padanan hexnya
((%3E)|>) - Periksa > atau
aturan Snort yang setara dengan hex:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (pesan:"NII Upaya pembuatan skrip lintas situs"; flow:to_server,mapan; pcre:"/((%3C)|<)((%2F)| /)*[a-z0-9%]+((%3E)|>)/i"; classtype:Web-application-action; sid:9000; rev:5;)
Pembuatan skrip lintas situs juga dapat dilakukan digunakan< img src=>Teknologi. Aturan snort default saat ini dapat dengan mudah dielakkan.
Bagian 3.2 memberikan metode untuk mencegah teknik ini.
3.2 ekspresi reguler serangan CSS "<img src"
/((%3C)|<)((%69)|i|(%49))((%6D)|m|(%4D) ) ((%67)|g|(%47))[^n]+((%3E)|>)/I
penjelasan:
(%3 C)|<) -<atau setara hexnya
(%69)|i|(%49))((%6D)|m|(%4D))((%67)|g|(%47) - huruf 'img' atau itu Kombinasi variasi ekuivalen huruf besar dan huruf kecil
[^n]+ - karakter apa pun setelah <img kecuali baris baru
(%3E)|>) -> atau setara hexnya
3.3 CSS Attack Extreme Regular Expression
/((%3C)|<)[^n]+((%3E)|>) /I
Penjelasan:
Ini aturan hanya mencari <+karakter apa pun kecuali karakter baris baru+>. Tergantung pada arsitektur server web dan aplikasi web Anda, aturan ini mungkin menghasilkan beberapa kesalahan. Namun dijamin dapat menangkap serangan CCS atau seperti CSS.
Ringkasan:
Dalam artikel ini, kami mengusulkan berbagai jenis aturan ekspresi reguler untuk mendeteksi injeksi SQL dan serangan skrip lintas situs. Beberapa aturannya sederhana dan ekstrem, dan potensi serangan akan meningkatkan kewaspadaan Anda. Namun aturan ekstrem ini dapat menyebabkan beberapa kesalahan proaktif. Dengan mengingat hal ini, kami memodifikasi aturan sederhana ini untuk menggunakan gaya tambahan sehingga dapat diperiksa dengan lebih akurat. Dalam mendeteksi serangan terhadap aplikasi jaringan ini, sebaiknya gunakan ini sebagai titik awal untuk melakukan debug pada IDS atau metode analisis log Anda. Setelah beberapa revisi lagi, Anda akan siap mendeteksi serangan tersebut setelah Anda mengevaluasi respons tidak berbahaya terhadap bagian transaksi jaringan normal.
Referensi
1. Injeksi SQL
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
2. FAQ Skrip Lintas Situs http://www.cgisecurity.com/articles/xss -
faq.shtml
3. ID Snort http://www.snort.org
4. Ekspresi reguler yang kompatibel dengan Perl (pcre) http://www.pcre.org
5. Proksi aplikasi web, Achilles http://achilles.mavensecurity.com
3. Injeksi SQL Tingkat Lanjut
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
7. HOWTO Pemrograman Aman, David Wheeler www.dwheeler.com
8. Ancaman dan Penanggulangannya, MSDN, Microsoft