Teknik Lanjutan Suntikan SQL dan NoSQLi
Teliti senario suntikan SQL dan NoSQL yang lebih kompleks serta pelajari corak pengekodan pertahanan lanjutan untuk menanganinya dengan berkesan.
Teknik Lanjutan Suntikan SQL dan NoSQLi ialah pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang merangkumi sejumlah 4 pelajaran.
Mendalami SQLi
Anda telah mempelajari suntikan SQL (SQLi) asas, iaitu input pengguna secara langsung memanipulasi pertanyaan pangkalan data. Walau bagaimanapun, penyerang menggunakan kaedah yang lebih halus dan kompleks untuk memintas pertahanan.
Dalam pelajaran ini, kita akan meneroka teknik SQLi 'lanjutan' ini, seperti suntikan buta dan suntikan peringkat kedua, kemudian beralih kepada kerentanan suntikan NoSQL. Paling penting, kita akan membincangkan cara mempertahankan diri daripadanya dengan berkesan!
Apakah Suntikan SQL Buta?
Suntikan SQL Buta (SQLi Buta) berlaku apabila aplikasi terdedah kepada SQLi, tetapi respons HTTP-nya tidak memaparkan hasil pertanyaan SQL atau sebarang mesej ralat secara langsung.
Sebaliknya, penyerang perlu membuat kesimpulan tentang maklumat dengan memerhatikan tingkah laku aplikasi atau masa respons. Terdapat dua jenis utama SQLi Buta:
- SQLi Buta berasaskan Boolean: Penyerang memerhatikan perubahan pada kandungan halaman (contohnya, mesej tertentu muncul atau hilang) berdasarkan syarat benar/palsu bagi pernyataan yang disuntik.
- SQLi Buta berasaskan Masa: Penyerang membuat kesimpulan tentang data dengan memerhatikan kelewatan dalam masa respons pelayan yang dicetuskan oleh fungsi pangkalan data yang disuntik.
Demo SQLi Buta Berasaskan Masa
Penyerang boleh menggunakan fungsi pangkalan data yang melambatkan pelaksanaan, seperti SLEEP() (MySQL) atau PG_SLEEP() (PostgreSQL), untuk membuat kesimpulan tentang data. Jika syarat yang disuntik adalah benar, kelewatan berlaku; jika palsu, kelewatan tidak berlaku.
Contohnya, pertanyaan yang *terdedah* mungkin dieksploitasi untuk memeriksa sama ada huruf pertama kata laluan ialah 'a':
SELECT * FROM users WHERE username = 'admin' AND IF(SUBSTRING(password, 1, 1) = 'a', SLEEP(5), 0);Pendekatan yang selamat sentiasa menggunakan pertanyaan berparameter, dengan menganggap semua input pengguna sebagai data, bukan kod. Cuba jalankan contoh yang selamat:
import sqlite3
import time
def get_user_data_secure(username):
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
password TEXT NOT NULL
)
''')
cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", ('admin', 'securepassword'))
conn.commit()
# Secure query using parameterized statement
query = "SELECT username FROM users WHERE username = ?"
start_time = time.time()
cursor.execute(query, (username,))
result = cursor.fetchone()
end_time = time.time()
print(f"Query for '{username}' took {end_time - start_time:.4f} seconds.")
if result:
print(f"Found user: {result[0]}")
else:
print("User not found or query failed.")
conn.close()
if __name__ == "__main__":
print("--- Secure Query Example ---")
get_user_data_secure("admin")
get_user_data_secure("nonexistent")Melindungi daripada SQLi Buta
Pertahanan terbaik terhadap SQLi buta adalah sama seperti untuk SQLi biasa: pertanyaan berparameter atau pernyataan tersedia. Kaedah ini memastikan kod SQL diasingkan sepenuhnya daripada input pengguna.
Dengan menganggap semua data yang diberikan pengguna sebagai nilai harfiah, penyerang tidak dapat menyuntik perintah berniat jahat, sama ada output kelihatan atau tidak.
- Sentiasa sahkan dan bersihkan input pengguna dengan teliti.
- Gunakan Tembok Api Aplikasi Web (WAF) untuk menapis permintaan berniat jahat.
- Pantau corak akses pangkalan data untuk mengesan keabnormalan atau masa pertanyaan yang luar biasa panjang.
Suntikan SQL Peringkat Kedua
Suntikan SQL Peringkat Kedua berlaku apabila input berniat jahat mula-mula disimpan dalam pangkalan data (atau storan berterusan yang lain), kemudian diambil semula dan digunakan dalam pertanyaan lain tanpa pembersihan semula yang betul.
Jenis suntikan ini selalunya lebih sukar dikesan semasa ujian awal kerana interaksi pertama dengan input itu mungkin kelihatan tidak berbahaya. Kerentanan hanya muncul apabila data yang disimpan digunakan dalam konteks yang berbeza atau pada masa yang kemudian.
Bayangkan ia seperti bom tindakan tertunda – fius dinyalakan sekarang, tetapi letupan berlaku kemudian!
Senario SQLi Peringkat Kedua
Pertimbangkan senario apabila seorang pengguna mendaftar dengan nama pengguna seperti 'admin'--. Apabila nama pengguna ini mula-mula disimpan, ia mungkin dikendalikan dengan selamat.
Walau bagaimanapun, kemudian, panel pentadbir mengambil butiran pengguna menggunakan pertanyaan yang dibina dengan menggabungkan nama pengguna yang disimpan:
SELECT email FROM users WHERE username = ' . $username_from_db . ';Jika $username_from_db (yang kini mengandungi 'admin'--) tidak dibersihkan semula sebelum digunakan dalam pertanyaan kedua ini, komen (--) boleh memendekkan pertanyaan. Ini mungkin membolehkan penyerang memintas syarat atau mendedahkan data sensitif, kerana pertanyaan itu akhirnya menjadi SELECT email FROM users WHERE username = 'admin'.
Pengenalan kepada Suntikan NoSQL
Pangkalan data NoSQL, seperti MongoDB, Cassandra dan Redis, tidak menggunakan bahasa pertanyaan SQL tradisional. Walau bagaimanapun, pangkalan data ini masih terdedah kepada serangan suntikan jika input pengguna tidak dikendalikan dengan betul.
Penyerang memanipulasi struktur data (contohnya, JSON, BSON, XML) yang digunakan dalam pertanyaan NoSQL untuk:
- Memintas pengesahan dan mendapatkan akses tanpa kebenaran.
- Mengakses atau mengubah suai data tanpa kebenaran.
- Melakukan serangan penafian perkhidmatan dengan membina pertanyaan yang kompleks.
Teknik khusus sangat bergantung pada jenis pangkalan data NoSQL dan bahasa pertanyaan atau API uniknya.
Suntikan Operator MongoDB
Teknik suntikan NoSQL yang lazim dalam MongoDB melibatkan manipulasi operator pertanyaan. Pertanyaan MongoDB sering menggunakan objek seperti JSON dengan operator khas (contohnya, $eq untuk sama dengan, $gt untuk lebih besar daripada, $ne untuk tidak sama dengan).
Jika bahagian belakang membina pertanyaan MongoDB secara langsung daripada input pengguna tanpa pengesahan, penyerang boleh menyuntik operator ini. Contohnya, menyuntik {"password": {"$ne": null}} ke dalam medan kata laluan boleh memintas pengesahan dengan memadankan mana-mana kata laluan yang bukan nol, bukannya kata laluan tertentu.
Ini membolehkan mereka mencari rekod yang sepadan dengan syarat selain kesamaan tepat.
Contoh NoSQLi (MongoDB)
Pertimbangkan fungsi log masuk yang menerima nama pengguna dan kata laluan. Jika kata laluan digunakan secara langsung dalam pertanyaan MongoDB tanpa pembersihan, penyerang boleh memintasnya.
Berikut ialah contoh Python selamat yang *disimulasikan*, yang menunjukkan cara pengendalian yang betul mencegah suntikan walaupun penyerang cuba menghantar rentetan yang direka seperti '{" $ne": None}'.
def simulate_mongodb_login(username, password):
# Simulate a collection in memory
users_db = [
{"username": "admin", "password": "secure_password123"},
{"username": "guest", "password": "guestpass"}
]
print(f"Attempting login for '{username}' with password '{password}'")
# --- VULNERABLE CONCEPT ---
# If 'password' was parsed as a JSON object directly into the query:
# Attacker input: password = {"$ne": None}
# This would become: {"username": "admin", "password": {"$ne": None}}
# which means "password not equal to None" and matches any non-null password.
# --- SECURE APPROACH ---
# Always treat user input as a literal string unless explicitly parsed and validated.
# This ensures 'password' is treated as a literal string, preventing operator injection.
for user in users_db:
if user["username"] == username and user["password"] == password:
print(f"Login SUCCESS for {username} (secure). ")
return True
print(f"Login FAILED for {username} (secure).")
return False
if __name__ == "__main__":
print("--- NoSQLi Secure Login Example ---")
simulate_mongodb_login("admin", "secure_password123") # Correct password
simulate_mongodb_login("admin", "wrong_password") # Incorrect password
# Simulate attempted bypass with a crafted password string:
simulate_mongodb_login("admin", '{"$ne": None}') # Still fails due to secure handlingMencegah Suntikan NoSQL
Pertahanan utama terhadap suntikan NoSQL ialah pengesahan dan sanitasi input yang teliti. Memandangkan pangkalan data NoSQL mempunyai bahasa pertanyaan yang pelbagai, pertahanan khususnya mungkin berbeza, tetapi prinsip terasnya tetap sama:
- Senarai dibenarkan: Benarkan hanya aksara, corak atau jenis data khusus yang diketahui selamat. Tolak apa-apa yang tidak sepadan.
- Penaipan kukuh: Pastikan nombor yang dijangka benar-benar nombor, rentetan benar-benar rentetan dan nilai boolean benar-benar boolean.
- API pemacu: Sentiasa gunakan API terbina dalam pemacu pangkalan data NoSQL untuk membina pertanyaan. API ini direka untuk mencegah suntikan dengan menganggap input pengguna sebagai data, bukan kod.
- Elakkan penggabungan: Jangan sekali-kali menggabungkan input pengguna secara langsung ke dalam rentetan pertanyaan atau struktur JSON tanpa pelarian atau pemparameteran yang betul.
- Keistimewaan minimum: Pengguna pangkalan data hanya patut mempunyai kebenaran minimum yang diperlukan.
Semakan Pantas: Jenis Suntikan
Uji pemahaman Anda tentang teknik suntikan lanjutan.
Imbas Kembali & Langkah Seterusnya
Kami telah meneroka teknik suntikan SQL dan NoSQL lanjutan yang melangkaui manipulasi langsung yang mudah:
- Suntikan SQL buta (berasaskan masa dan berasaskan boolean) membuat kesimpulan tentang data tanpa output pangkalan data secara langsung.
- Suntikan SQL peringkat kedua melibatkan penyimpanan input berniat jahat yang dilaksanakan dalam pertanyaan berasingan pada kemudian masa.
- Suntikan NoSQL menyasarkan struktur pertanyaan NoSQL (contohnya, operator MongoDB) untuk memanipulasi operasi pangkalan data.
Pertahanan terbaik kekal sebagai pengesahan input yang kukuh, pertanyaan berparameter untuk SQL dan penggunaan API pemacu yang selamat untuk NoSQL. Sentiasa anggap semua input sebagai berniat jahat dan sahkan semuanya!
Pelajari Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Teknik Lanjutan Suntikan SQL dan NoSQLi” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang, termasuk “Teknik Lanjutan Suntikan SQL dan NoSQLi”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Teknik Lanjutan Suntikan SQL dan NoSQLi”?
Teliti senario suntikan SQL dan NoSQL yang lebih kompleks serta pelajari corak pengekodan pertahanan lanjutan untuk menanganinya dengan berkesan. Anda berlatih Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Teknik Lanjutan Suntikan SQL dan NoSQLi” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang ini?
Ya. Setiap pelajaran Pengekodan Selamat dan OWASP Top 10 untuk Bahagian Belakang menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Teknik Lanjutan Suntikan SQL dan NoSQLi
- Strategi Pengesahan Input Menyeluruh
- Dasar Keselamatan Kandungan (CSP) untuk Bahagian Belakang
- Mencegah Suntikan Arahan dan LDAP