Saya sedang menguji aplikasi berbasis oracle dan saya telah menemukan kode berikut:
Kueri = "PILIH nama DARI karyawan DI MANA id = '" + PKID + "';"
yaitu string kueri berisi tanda kutip di sekitar nilai PKID yang diperoleh langsung dari URL.
Jelas, ini adalah injeksi SQL klasik yang menunggu untuk terjadi ... kecuali aplikasi di belakang CA SiteMinder yang memblokir URL apa pun dengan kutipan tunggal (dalam bentuk apa pun) agar tidak diteruskan ke aplikasi.
Apakah ada cara untuk keluar dari string dan menyuntikkan SQL tanpa menggunakan kutipan tunggal?
Sunting: Maaf, saya seharusnya lebih jelas - Saya mengerti bagaimana seharusnya ditulis, tetapi saya harus meyakinkan orang bahwa ini adalah masalah yang dapat dieksploitasi. Saat ini karena berada di belakang siteminder yang memblokir tanda kutip tunggal sehingga akan menjadi perbaikan prioritas rendah.
sumber
Jawaban:
Ya, adalah mungkin untuk melakukan serangan injeksi SQL tanpa memberikan tanda kutip pada parameter.
Cara untuk melakukan ini adalah dengan eksploit untuk dilakukan dengan bagaimana angka dan / atau tanggal diproses. Anda dapat menentukan di tingkat sesi apa format tanggal atau angka. Dengan memanipulasi ini, Anda kemudian dapat menyuntikkan dengan karakter apa pun.
Secara default di Inggris dan AS, koma digunakan untuk menunjukkan pemisah ribuan dalam angka, dan berhenti penuh untuk titik desimal. Anda dapat mengubah default ini dengan menjalankan:
Ini berarti bahwa "P" sekarang adalah titik desimal dan "Z" adalah pemisah ribuan. Begitu:
Apakah angka 0,01. Namun, jika Anda membuat fungsi P01, referensi objek akan diambil sebelum konversi angka. Ini memungkinkan Anda untuk menjalankan fungsi-fungsi pada basis data yang memberi Anda peningkatan kekuatan, sebagai berikut:
Buat fungsi dasar "dapatkan oleh id":
Juga buat fungsi P01 yang melakukan sesuatu yang tidak diinginkan (dalam hal ini hanya membuat tabel, tetapi Anda mendapatkan ide):
Dan kami siap untuk:
Tidak ada kutipan di mana pun, tetapi kami masih berhasil menjalankan fungsi "tersembunyi" P01 dan membuat tabel
t
!Walaupun ini mungkin sulit dilakukan dalam praktek (dan mungkin memerlukan pengetahuan / bantuan internal), ini menunjukkan bahwa Anda dapat menyuntikkan SQL tanpa harus memiliki tanda kutip. Mengubah
nls_date_format
dapat memungkinkan hal serupa dilakukan.Temuan asli untuk angka adalah oleh David Litchfield dan Anda dapat membaca makalahnya di sini . Anda dapat menemukan diskusi Tom Kyte tentang bagaimana kencan dapat dieksploitasi di sini .
sumber
Anda mungkin bisa membebani tipe data yang Anda gunakan, menyebabkan pernyataan itu gagal. Lalu apa yang terjadi setelahnya berpotensi dijalankan.
Mungkin mengirimkannya sebagai array byte Unicode akan melakukan trik dan membuat Anda keluar dari pernyataan itu ke yang lain.
Jika ada lubang terbuka, itu akan disalahgunakan. Dan memblokir semua string dengan satu kutipan bukanlah ide yang baik karena orang dengan nama belakang "O'Brian" tidak dapat menjadi pelanggan Anda (antara lain).
sumber
Coba gunakan variabel bind. Anda dapat mendeklarasikannya sebagai angka dan yang seharusnya mencegah injeksi SQL yang merusak.
TAMBAHAN: variabel mengikat juga meningkatkan kinerja dan skalabilitas karena rencana kueri dikompilasi dan disimpan untuk digunakan kembali. Hanya sesuatu yang lain untuk ditambahkan ke argumen Anda. :)
sumber