SQL Injection
Last updated
Last updated
Materi ini disusun untuk dan sebagai bahan pembelajaran, tindakan ilegal dengan menggunakan SQL Injection yang dengan sengaja dilakukan untuk melakukan penyerangan terhadap layanan/sistem diluar pembelajaran adalah tanggung jawab pribadi, dan dapat dikenai sanksi pidana.
SQL Injection adalah salah satu teknik seringan yang populer saat ini, SQL Injection saat ini masuk ke dalam dimana masuk dalam kategori . SQL Injection adalah tipe serangan yang terjadi pada bagian server-side application yang menggunakan service dari Database.
SQL Injection terjadi karena sebuah aplikasi melakukan kesalahan implementasi pada logika program yang dibuat, sehingga penyerang dapat memanfaatkan celah tersebut untuk melakukan manipulasi dari query yang dilakukan ke database yang dimanfaatkan untuk melakukan ekstraksi/enumerasi database tersebut.
SQL adalah metode atau bahasa yang digunakan untuk berkomunikasi dengan sebuah database, dimana saat ini database memiliki banyak sekali DBMS (Database Management System) seperti MySQL, PostgreSQL, SQLite, dll. Pada kasus nyatanya tiap DBMS memiliki fundamental struktur yang berbeda, meskipun basic query dari tiap DBMS tetap sama. Hal mengakibatkan teknik penyerangan yang digunakan akan memiliki pendakatan yang berbeda - beda tergantung dari DBMS yang digunakan.
Dalam SQL Injection ada hal - hal basic yang perlu dipelajari dan dilakukan, namun akan memiliki pengaruh yang cukup krusial untuk membantu melakukan identify apakah sebuah aplikasi memiliki kerentanan tersebut.
Ketika sebuah aplikasi memiliki sebuah input, maka seorang penyerang dapat mencoba meng-inputkan karakter seperti '
(petik satu) atau "
(petik dua), jika sebuah aplikasi mengalami response yang cukup aneh atau mungkin saja error kemungkinan besar maka aplikasi tersebut memiliki kerentanan SQL Injection.
Namun kenapa hal tersebut bisa terjadi? berikut contoh implementasi sebuah kode yang memiliki kerentanan SQL Injection
Dari penerapan hal diatas, contoh misal input yang diberikan adalah sebagai berikut ini
Maka query SQL yang terbentuk adalah seperti berikut ini:
Dan tentu saja dengan hal tersebut maka dbms akan mencari ke database melalui query tersebut untuk mencocokkan data yang sesuai.
Namun apa jadinya jika diinput seperti berikut ini:
Maka query SQL yang terbentuk adalah seperti berikut ini:
Tentu saja query tersebut adalah query yang tidak valid dan akan menghasilkan error karena hasil dari query tersebut terdapat tanda petik '
(petik satu) yang tidak pernah ditutup.
Seperti yang kita tahu bahwa sama seperti bahasa pemrograman, SQL pun memiliki syntax untuk melakukan commenting, dimana comment adalah sebuah text yang tidak akan pernah dieksekusi, hal ini dapat dimanfaatkan untuk melakukan SQL Injection.
Contoh dari kasus sebelumnya adalah ketika user meng-inputkan tanda petik akan langsung error karena terdapat perintah query yang tidak lengkap atau sesuai. Namun apa yang akan terjadi jika melakukan input sebagai berikut ini
Maka query yang terbentuk adalah seperti berikut ini:
Jika dilihat maka semua query atau perintah setelah --
tidak akan pernah dieksekusi dan query yang kita jalankan akan tetap valid, namun jika dilihat disini mengurangi kondisi pengecekannya, dimana awalnya akan mengecek username dan password yang valid dari data di database, sekarang hanya akan mengecek username nya saja yang valid.
Tentu hal ini dapat dimanfaatkan jika kita mengetahui username yang valid yang ada pada database, dan penerapan pada kasusnya nyata memang seperti itu (*tidak terbatas pada username).
Seperti yang kita tahu OR adalah sebuah operator boolean yang memiliki sifat ketika salah satu kondisi bernilai true/benar maka semua hasilnya akan menjadi true/benar. Ketika sudah memiliki kontrol penuh pada titik eksploitasi SQL Injection tentu hal ini dapat dimanfaatkan.
Contoh ketika kita memili tabel seperti berikut ini:
1
rootkids
admin#123
2
hygge
secretpassw0rd
3
mirai
thetrulynaga
Lalu jika menggunakan contoh aplikasi sebelum - sebelumnya jika kita melakukan input seperti berikut:
Maka query yang terbentuk akan menjadi berikut ini:
Hal unik akan terjadi, karena DBMS akan memproses query tersebut dan mengembalikan semua data users yang ada di database, karena disitu terdapat kondisi 1=1 dimana kondisi tersebut akan selalu bernilai true/benar, yang artinya tidak peduli apapun usernamenya query tersebut akan selalu bernail benar dan akan selalu mengembalikan semua data.
Namun nyatanya secara default jika aplikasi hanya mengambil 1 data saja maka data yang terambil adalah data paling awal, artinya jika kasus aplikasinya adalah sebuah form login maka kita login sebagai user rootkids sesuai dengan urutan data di tabel tersebut.
Lalu bagaimana caranya ketika ingin masuk atau login atau menargetkan data yang lainnya? Nah, disinilah operator LIMIT dan OFFSET bisa digunakan.
Contoh, jika kita ingin menargetkan user dengan username mirai, maka kita dapat melakukan input sebagai berikut ini:
Maka query yang terbentuk akan menjadi seperti berikut ini:
Arti dari query tersebut adalah, kita ingin membatasi untuk mengambil 1 data saja (LIMIT) dan mengambil data diindex yang kedua (OFFSET), dimana data tersebut adalah data user dengan username mirai.
UNION adalah salah satu operator yang digunakan pada SQL query untuk menggabungkan hasil dari query SELECT sebelumnya.
Contoh ketika memiliki tabel seperti ini:
Tabel users
1
rootkids
admin#123
2
hygge
secretpassw0rd
3
mirai
thetrulynaga
Tabel products
1
Iphone 16
20000000
The best iphone series, idk just yapping
2
Indomie
5000
makanan anak kos tiap akhir bulan katanya
3
Keyboard
500000
yakali anak it gapunya keyboard yekan?
Jadi ketika sebuah aplikasi semisal menampilkan data - data products dan memiliki kerentanan SQL Injection maka hal tersebut dapat dimanfaatkan oleh penyerang untuk memanipulasinya dan mendapatkan data dari tabel lainnya.
Contoh query yang memanfaatkan UNION adalah sebagai berikut ini:
Yes, hal tersebut bisa menyebabkan terjadinya leaking terhadap isi dari data di tabel yang lainnya, namun yang perlu diingat aturan dari UNION adalah hasil dari gabungan 2 query tersebut harus memiliki jumlah kolom yang sama, jadi ketika hasilnya memiliki jumlah kolom yang berbeda maka akan terjadi error, contoh:
Query diatas akan terjadi error karena jumlah kolom diawal yang diambil adalah 3 kolom namun pada UNION selanjutnya hanya menampilkan 2 kolom, yang artinya terjadi perbedaan dan error. Lalu bagaimana? untuk solusinya bisa dilakukan seperti berikut
Kita bisa memberikan placeholder NULL disana untuk merepresentasikan kolom ke - 3 agar hasilnya tidak terjadi error.
Untuk penggunaan jika dalam SQL Injection mungkin bisa terlihat sebagai berikut ini:
Dari contoh diatas mungkin terlihat mudah karena kita bisa melihat berapa kolom yang akan ditampilkan, namun pada kasus nyatanya kita tidak pernah tahu jumlah kolomnya ketika tidak mengetahui query yang dijalankan, oleh karena itu ada teknik untuk bisa dilakukan untuk melakukan identify nya.
Manual Placeholder Seperti yang sudah kita tahu jika jumlah kolomnya berbeda maka akan terjadi error, oleh karena itu kita bisa mencoba - coba untuk menggunakan placeholder hingga tidak terjadi error, contohnya seperti ini
Intinya terus coba tambahkan placeholdernya hingga tidak terjadi error, jika masih error maka jumlah kolomnya masih belum sesuai, dan jika sudah tidak terjadi error maka itulah jumlah kolom yang valid sesuai dengan jumlah placeholdernya.
Menggunakan ORDER Operator Metode lain yang bisa digunakan adalah menggunakan ORDER Operator, dimana caranya hampir sama dengan sebelumnya, tapi dalam metode ini adalah ketika terjadi sebuah error maka kolomnya sudah tidak valid, contoh seperti ini:
Dalam metode ini jika ORDER BY diberi parameter angka maka angka tersebut akan merepresentasikan urutan kolom yang ada pada tabel tersebut, oleh karena itu jika angka yang diberikan sudah melebihi jumlah kolomnya maka akan terjadi error. Jadi, penanda ketika kolomnya sudah valid adalah ketika sebelum terjadi error, setelah tahu jumlah kolomnya bisa langsung menggunakan UNION sebelumnya.
Database enumeration adalah teknik dimana sebagai penyerang memanfaatkan kerentanan SQL Injection untuk lebih dalam melakukan ekstraksi semua data - data yang ada dalam database tersebut, sehingga seorang penyerang dapat melihat semua informasi seperti
Database yang tersedia
Tabel - tabel dari database
Kolom yang ada dalam tabel
Database yang sedang digunakan
User yang sedang digunakan
Versi database yang digunakan
dll
Melihat versi DBMS
Melihat database yang digunakan
Melihat user yang digunakan
Melihat semua database yang tersedia
Melihat semua tabel yang tersedia dari sebuah database
Melihat semua kolom yang tersedia dari sebuah tabel
Beberapa query - query diatas adalah cara - cara yang sangat relevan dan sering digunakan untuk melakukan enumerasi database dan sudah cukup untuk dipelajari saat ini, dan seperti yang kita tahu semua cara diatas dapat digunakan dengan kombinasi UNION pada sesi sebelumnya.
Error based SQL Injection adalah teknik dimana sebagai penyerang kita memanfaatkan error message dari hasil query SQL tersebut yang dikirimkan aplikasi sebagai titik celah untuk bisa dimanfaatkan bahkan untuk melakukan enumerasi database.
Error based terjadi ketika sebuah aplikasi mengembalikan response error dari hasil query SQL yang dijalankan, contoh error yang mungkin dihasilkan oleh sebuah aplikasi bisa seperti ini
Diatas adalah contoh ketika ada sebuah aplikasi mengembalikan hasil error ke sebuah response, dimana dengan hasil ini kita bisa manfaatkan untuk melakukan enumerasi.
Contoh sederhana kita bisa menjalankan query berikut ini:
Dan secara mengejutkan meskipun memang aplikasi mengembalikan error tapi kita bisa mendapatkan informasi dan melakukan enumerasi database, contoh diatas adalah kita melakukan enumerasi terhadap versi dari DBMS yang digunakan.
Blind SQL Injection adalah sebuah kondisi dimana kita tahu bahwa terdapat sebuah kerentanan SQL Injection didalam sebuah aplikasi namun kita tidak pernah tahu hasil dari query yang dijalankan secara eksplisit. Saat ini ada 2 sub metode yang digunakan dalam metode ini yaitu Boolan Based dan Time Based.
Dalam metode Blind ini sebenarnya pendekatannya akan lebih rumit dari beberapa cara penyerangan yang sudah dijelaskan sebelumnya. Karena Blind ini memiliki pendekatan yang unik dan harus dilakukan dengan cara melakukan teknik Bruteforce untuk bisa melakukan enumerasi databasenya.
Blind SQL Injection Boolean Based adalah metode dengan memanfaatkan aplikasi yang memiliki kerentanan SQL Injection yaitu dengan mengidentifikasi response dari aplikasi yang bersifat true dan false.
Contoh nyatanya adalah ketika memiliki sebuah aplikasi untuk melakukan Login, maka aplikasi tersebut sebenarnya akan memiliki 2 response yaitu true dan false, contohnya mungkin seperti ini:
Karena kita bisa mengidentifikasi kondisi tersebut, ini dapat dimanfaatkan untuk melakukan penyerangan Boolean Based.
Contoh query yang biasa digunakan adalah sebagai berikut (semisal melakukan enumerasi version):
Query diatas adalah cara untuk mengembalikan response boolean condition terhadap querynya, sehingga ketika karakter yang dibruteforce itu benar maka query yang dihasilkan akan bernilai true dan sebaliknya.
Kita breakdown terlebih dahulu:
BINARY : digunakan untuk mengconvert semua hasil karakter menjadi case sensitive
SUBSTRING(<text>, <position>, <length>) : digunakan untuk melakukan subquery untuk melakukan ekstraksi dan hanya mengambil 1 karakter (length) dan disini <position> akan terus berubah tergantung posisi karakter yang ingin dibruteforce
='<char>' : ini adalah bagian yang digunakan untuk melakukan bruteforce karakter, jadi disini karakternya akan terus berganti - ganti hingga mendapatkan kondisi true
Mungkin memang membingungkan, jadi untuk teknik perlu dilakukan practice dan pemahaman lebih lanjut untuk bisa lebih mudah mengerti, contoh jika diterapkan dalam automation script bisa seperti ini:
Untuk semua teorinya tetap sama dengan Boolean Based, namun untuk Time Based ini adalah kondisi dimana sebagai penyerang tidak dapat melihat response dalam bentuk text apapun, jadi untuk proses identifikasi tidak dapat menggunakan response dari aplikasi yang digunakan.
Oleh karena itu, metode yang paling tepat jika mengalami case tersebut adalah dengan memanfaatkan response time dari aplikasi tersebut, jadi intinya ini sama saja dengan Boolean Based, namun untuk kondisi true dan false nya kita alihkan untuk bisa memanipulasi response time dari aplikasi tersebut, metode yang sering digunakan adalah dengan menggunakan SLEEP function di SQL ketika karakter yang dibruteforce itu benar.
Query yang biasa digunakan adalah sebagai berikut:
Strukturnya hampir mirip dengan Boolean Based, namun disini menggunakan IF, dimana ketika kondisinya benar akan dilakukan SLEEP dan jika tidak maka diisi NULL atau abaikan saja, dari sini berarti kita tahu bahwa jika karakter yang dibruteforce itu benar maka akan ada delay dari response time aplikasi tersebut.
Dan berikut adalah implementasi ketika diterapkan menjadi automation script:
SQLMap termasuk sebuah heavy tool sehingga penggunaanya sangat dilarang untuk dilakukan pada target yang tidak diizinkan, karena dapat menyebabkan down server.
Dalam praktikum ini praktikan dilarang menggunakan SQLMap untuk mengerjakan soal - soal yang diberikan. Disini SQLMap ditujukan sebagai pembelajaran saja.
SQLMap adalah salah satu alat yang sering digunakan dalam penetration testing sebuah aplikasi untuk mengidentifikasi kerentanan SQL Injection, alat ini merupakan alat yang sangat powerfull karena fitur - fiturnya yang luas dan penggunaanya yang cukup mudah.
Pertama untuk bisa menggunakan SQLMap adalah dengan meng-install alat ini
Ketika sudah berhasil meng-install dapat dicek seperti berikut:
Jika sudah muncul seperti diatas maka sudah siap untuk digunakan.
Selanjutnya berikut adalah penjelasan mengenai penggunaan sederhana sqlmap untuk melakukan enumerasi database.
Diatas adalah contoh sederhana untuk memulai inisialisasi dan melakukan identifikasi sebuah aplikasi menggunakan sqlmap, dengan command diatas maka sqlmap akan menanyakan semua pertanyaan satu persatu sebagai flow penyerangannya, namun jika ingin langsung melakukan defaulting bisa dengan memberikan flag --batch
dicommand tersebut, contoh menjadi seperti berikut:
Lalu jika sudah mengetahui dbms apa yang digunakan dapat memberikan flag --dbms
Intinya disini adalah melakukan percobaan hingga sqlmap berhasil mengidentifikasi kerentanan apa yang ada pada aplikasi tersebut, jika sqlmap belum mendapatkan hasil identifikasi awalnya, maka proses enumerasi tidak dapat dilakukan, contoh jika sqlmap berhasil mengidentifikasi adalah sebagai berikut
Ketika sqlmap telah berhasil mengidentifikasi, maka semua proses enumerasi dapat dilakukan. Berikut adalah contoh command - command yang dapat digunakan untuk enumerasi (dapat disesuaikan kembali sesuai kebutuhan):
Untuk semua hal - hal diatas dapat dicoba dan dipelajari lebih lanjut secara mandiri, karena memang penggunaan sqlmap sangatlah luas dan akan terlalu panjang jika harus dijelaskan secara lengkap dan detail.
Untuk selanjutnya adalah mempelajari lebih lanjut untuk semua materi - materi yang telah ditulis, namun untuk semua core concept sudah dijelaskan dalam materi ini, namun tentu saja penerapan pada kasus nyatanya masih banyak hal yang perlu dipelajari lebih lanjut.
Oleh karena itu berikut adalah referensi materi pembelajaran yang dapat digunakan sebagai media belajar lainnya: