Serangan berbasis web saat ini umumnya bersifat injeksi. Alasan injeksi umumnya adalah pemfilteran variabel yang tidak lengkap, yang memungkinkan penyusup mengeksekusi program atau melakukan kueri secara ilegal dan mengubah data sewenang-wenang. Ketika serangan injeksi menjadi semakin intens, beberapa kode penyaringan khusus telah muncul. Namun, ketidaksempurnaan dalam beberapa kode penyaringan dapat menyebabkan serangan baru. Berikut ini adalah kode pemfilteran yang paling banyak digunakan - program anti-injeksi universal SQL - untuk menjelaskan penyebab, metode pemanfaatan, dan tindakan pencegahan kerentanan.
Program anti-injeksi universal SQL ditulis oleh Feng Zhiqiu dari Firefox. Ini adalah kode anti-injeksi yang cukup lengkap. Ini dapat mengimplementasikan pemfilteran pengiriman untuk karakter filter yang ditentukan, dan dapat merekam informasi data yang dikirimkan oleh IP penyerang. Saat menggunakannya, Anda hanya perlu menambahkan kode <--#Include File="WrSky_Sql.Asp"--> ke header file untuk mencegah injeksi guna mencapai pemfilteran variabel. Jika Anda menambahkan kode program setelah file koneksi database (seperti conn.asp), Anda dapat mencapai pemfilteran variabel seluruh situs, sehingga mencapai efek anti-injeksi.
Oke, mari kita lihat kode bagian pemfilteran variabel terlebih dahulu:
'--------Bagian definisi------------------
Redupkan Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
'Sesuaikan string yang perlu difilter, dipisahkan dengan "maple"
Fy_In = "' maple; maple dan maple exec maple masukkan maple pilih maple hapus pembaruan maple maple count maple * maple% maple chr maple mid maple master maple truncate maple char maple menyatakan"
'----------------------------------
%>
<
Fy_Inf = membagi(Fy_In,"Maple")
'--------POST bagian------------------
Jika Meminta.Formulir<>Lalu
Untuk Setiap Fy_Post Dalam Permintaan.Formulir
Untuk Fy_Xh=0 Ke Ubound(Fy_Inf)
Jika Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>Lalu
'--------DAPATKAN bagian------------------
Jika Request.QueryString<>Lalu
Untuk Setiap Fy_Get Di Request.QueryString
Untuk Fy_Xh=0 Ke Ubound(Fy_Inf)
Jika Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>Maka
kode ini mendefinisikan pemfilteran variabel yang umum dimasukkan seperti "'", "dan", dll. Jika Anda merasa bahwa pemfilteran tidak cukup atau terlalu banyak, Anda dapat melakukannya sendiri Menambah atau mengurangi karakter. Jelasnya, selama data yang dikirimkan ke server melalui get atau post mengandung karakter yang disaring, maka hal tersebut akan dilarang oleh program. Hal ini menimbulkan masalah. Jika Anda menambahkan kode program setelah file koneksi database forum, selama konten postingan berisi karakter yang difilter, maka akan diblokir. Berdasarkan filter konten default, tampaknya hampir tidak mungkin untuk memposting jika kontennya dalam bahasa Inggris. Selain itu, beberapa karakter khusus (seperti tanda persen "%") terkadang digunakan saat menentukan gaya forum. Jika karakter khusus ini difilter, keseluruhan forum tidak akan berfungsi dengan baik. Mengenai masalah di atas, saya menggunakan dvbbs untuk mengujinya, dan hasilnya sesuai dengan yang saya harapkan.
Cara mengatasi masalah di atas adalah dengan mencegah injeksi pernyataan koneksi hanya pada file yang perlu difilter. Namun beban kerja ini relatif besar, dan umumnya webmaster tidak mengetahui file apa yang perlu difilter. Oleh karena itu, saran saya adalah menambahkan kode filtering ke conn.asp, kemudian membuat connl.asp yang tidak berisi kode filter, dan menghubungkan file-file yang pasti tidak memerlukan filter dan kode filter tersebut berdampak pada pengoperasian file ini ke conn1.asp, namun perlu diperhatikan bahwa isi dasar kedua file koneksi data harus konsisten. Selain itu, yang terbaik adalah tidak menggunakan karakter yang difilter dalam pengaturan gaya. Jika Anda benar-benar perlu menggunakannya, Anda dapat menghapus pemfilteran karakter ini di program anti-injeksi.
Hal di atas adalah tentang dampak program anti-injeksi terhadap pengoperasian situs, dan tidak menimbulkan kerugian apa pun. Faktanya, kerugian sebenarnya datang dari bagian perekaman data. Mari kita lihat bagian kode ini:
''--------Tulis ke database-------Header---- ----
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
Setel Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.buka Fy_dbstr
Fy_db.Execute("masukkan ke dalam SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) nilai('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"',' DAPATKAN','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.tutup
Tetapkan Fy_db = Tidak Ada
'--------Tulis ke database-------Ekor--------
Respon.Tulis "<Bahasa Skrip=JavaScript>alert('Fengwang SQL universal anti-injection system prompt↓ nnHarap jangan mencoba memasukkan karakter ilegal ke dalam parameter nnHTTP://WwW.WrSkY.CoM Versi sistem: V2.0 (ASP) versi sempurna');<Script>
Respon.Tulis "Operasi ilegal! Sistem membuat catatan berikut↓<br>"
Respon.Tulis "IP Operasi:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Respon.Tulis "Waktu pengoperasian:"&Sekarang&"<br>
respon.Tulis "Halaman operasi:"&Request.ServerVariables("URL")&"<br>"
Respon.Tulis "Metode pengiriman: GET<br>"
Response.Tulis "Kirim parameter:"&Fy_Get&"<br>"
Response.Tulis "Kirim data:"&Request.QueryString(Fy_Get)
Respon.Akhir
Akhiri Jika
Berikutnya
Berikutnya
Akhiri Jika
'----------------------------------
Fungsi kode ini adalah untuk mencatat informasi dan tindakan penyerang agar kita dapat mengambil tindakan penanggulangan yang diperlukan. Dapat dilihat dari kode bahwa program mencatat IP penyerang, alamat pengiriman, konten pengiriman, dll., tetapi jelas ada beberapa celah di sini:
1. Serangan yang sering terjadi tidak diproses. Dengan kata lain, tidak peduli bagaimana kita mengirimkan data legal, data tersebut akan dicatat oleh program, yang kemungkinan besar akan menyebabkan serangan DOS yang berbahaya. Saya melakukan percobaan tentang ini. Saya mengirimkan pernyataan berikut setelah URL file yang dilindungi: dan (pilih top l asc(mid (nama pengguna,l,l)) dari admin)>0, gunakan wizard kunci untuk merekam proses pengiriman, dan kemudian secara otomatis mengulangi penyerahan . Setelah beberapa waktu, ukuran database berubah secara signifikan (seperti yang ditunjukkan pada Gambar 1 dan 2). Seperti yang dapat Anda bayangkan, jika Anda menggunakan alat seperti Shuoxue untuk mengaktifkan pengiriman multi-thread, DOS pasti tidak akan menjadi masalah.
Gambar 1
Gambar 2
2. Panjang data record tidak terpotong. Inilah yang saya temukan selama pengujian terhadap program anti-injeksi yang mempengaruhi operasi forum. Seperti terlihat pada Gambar 3, jika konten postingan berisi karakter yang difilter, konten postingan akan terekam seluruhnya di database. Forum umum atau sistem artikel memiliki batasan panjang artikel yang diterbitkan, namun program anti-injeksi universal SQL tidak memberlakukan batasan apa pun terhadap hal ini. Jika penyerang mengirimkan konten yang terlalu panjang setelah URL file yang dilindungi, kemungkinan besar program akan mogok. Karena kerugiannya relatif tinggi, saya tidak mengujinya, tetapi konten yang saya kirimkan hingga 100K dicatat seperti biasa.
Gambar 3
3. Masalah konversi konten data dan ledakan database. Dilihat dari kodenya, program mencatat data yang dikirimkan secara ilegal langsung ke database tanpa konversi. Dengan kata lain, apa pun yang Anda kirimkan, selama berisi konten yang difilter, program akan mencatat semua konten yang Anda kirimkan. Masalah ini awalnya tidak serius, tetapi demi "keamanan", beberapa webmaster suka mengubah semua file mdb menjadi akhiran asp. Selain itu, hanya ada satu tabel di database program anti-injeksi, jadi kami bisa mendapatkan webshell dengan langsung menulis URL file yang dilindungi ke database. Selama proses pengujian, kami mengubah sqlin.mdb menjadi sqlin.asp, dan kemudian ditambahkan Setelah URL file yang dilindungi dimasukkan, pintu belakang ASP mikro Binglangzi dimasukkan. Setelah terhubung dengan klien Ice Fox, wedshll berhasil diperoleh.
Karena metode mendapatkan webshell ini memerlukan kepastian bahwa database pihak lain berjalan dalam format ASP dan mengetahui jalur datanya, kita harus menemukan cara untuk mendapatkan jalur database tersebut. Dalam keadaan normal, kami dapat langsung menebak jalur database, namun kenyataannya jalur ini dapat diekspos. Melihat keseluruhan program anti-injeksi, kami belum menemukan pernyataan perpustakaan tahan ledakan, jadi kami hanya perlu mengakses atau menggunakan secara langsung. metode %5C. Basis data diekspos. Jika kode program ditempatkan tepat setelah file koneksi basis data, karena file koneksi data umumnya berisi pernyataan tahan ledakan, kami tidak dapat mengekspos alamat basis data.
Yang disebutkan di atas adalah semua masalah dalam proses pencatatan data. Webmaster yang kompeten dapat memperbaiki sendiri celah yang relevan, seperti memblokir IP secara otomatis untuk pengiriman data berulang dalam jumlah besar. Faktanya, kita dapat sepenuhnya menghapus bagian perekaman data dari kode, yang tidak akan mempengaruhi pemfilteran variabel, dan bahkan jika informasi penyerang dicatat, itu tidak akan berguna. Jadi saya menyarankan yang terbaik adalah menghapus kode ini, sehingga semua kerentanan tidak ada lagi.
Oke sekian artikel kali ini. Terakhir, saya ingin mengingatkan Anda bahwa saat menggunakan program perlindungan keamanan, Anda juga harus memperhatikan masalah keamanan dari program itu sendiri.
Pengingat khusus: Program anti-injeksi 3.0 juga memiliki celah, dan celahnya lebih serius.