1.
Pendahuluan
2. Sekilas tentang SQLi pada Form Login
3. Contoh Serangan
4. Penanggulangan Sederhana :)
5. Ucapan Terima Kasih
#1. Pendahuluan
SQL Injection merupakan salah teknik eksploitasi web yang cukup lama, namun
hingga saat
ini teknik tersebut masih cukup mumpuni dan efektif untuk dilakukan. Buktinya
saat ini masih
ada saja (dan banyak) website yang mengidap penyakit vuln terhadap serangan SQL
Injection.
Inti dari penyebab bug ini yaitu terletak pada si pembuat web (web programmer),
anggap saja
ada kesalahan logika berpikir atau ketidaktahuaannya dalam membuat website yang
aman. :)
Saya tekankan sekali lagi, masalah bug ini terletak pada diri programmer web.
Jadi, sehandal
apapun sistem operasi atau web server yang digunakan akan menjadi percuma manakala
si programmer
memiliki kekeliruan logika ketika membangun sebuah web, khususnya SQL
Injection.
#2. Sekilas tentang SQLi pada Form Login
Seperti yang kita ketahui, Form Login adalah Form untuk melakukan Login,
halahhh :D. From
Login menjadi gerbang atau pintu yang akan membedakan dan memilah-milah
pengunjung satu dengan
yang lainnya, apakah dia hanya sebagai pengunjung biasa, user biasa
(pengupdate), atau sebagai
administrator, atau user dengan kategori lainnya.
Yang umum kita ketahui, dan ini yang saya ketahui dari cara berpikir
programmer, secara
sederhana, autentikasi pada Form Login mempunyai teknik sebagai berikut:
Pertama, ada sebuah form untuk memasukkan username dan password. Misalnya
seperti berikut:
Misal, nama filenya adalah login.html
----------- 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:
+---------+----------+----------------------------------+
| id_user | username | password |
+---------+----------+----------------------------------+
| 1| admin | 21232f297a57a5a743894a0e4a801fc3 |
| | | |
+---------+----------+----------------------------------+
"21232f297a57a5a743894a0e4a801fc3" adalah bentuk md5 dari
"admin".
Sehingga, secara sederhana, proses perjalanan dengan input username = 'admin'
dan
password = 'admin' adalah sebagai berikut, u = username, p = password:
+---------------------+
|u : admin, p : admin |
+----------+----------+
|
+----------+----------+
|u : admin, p : admin |
+----------+----------+
|
+----------+------------------------------------+
|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 sederhana dalam
tulisan ini. :D
#3. Contoh Serangan
Untuk melakukan teknik serangan SQL Injection, saya pikir kita minimal tahu
fungsi atau tata
cara pemanggilan atau perintah-perintah SQL (SQL Command). Dan saya pikir,
semua database memiliki
perintah SQL yang relative sama, :D. 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. :D
#4. Penanggulangan Sederhana
Coba ingat-ingat lagi pada bagian kedua tadi. Saya sudah wanti-wanti agar Anda
mengingat suatu
hal terkait proses autentikasi username dan password :D. Ingat, setiap password
akan dihash menjadi
md5 baru kemudian dicocokkan.
Nah, mari kita berpikir kritis sejenak. Kenapa perintah SQL untuk mencocokkan
username dan password
seperti itu? Kemudian kenapa hanya password yang dihash md5? Haha, tentu saya
tidak akan membuat orang
susah dengan meng-hash username menjadi md5... :p. Tapi, coba lihat perintah
SQL berikut:
SELECT * FROM users WHERE username='admin' AND
password='21232f297a57a5a743894a0e4a801fc3'
Ada yang kepikiran gag? Setiap password, apa saja, akan dihash dan menjadi 32
karakter biasa.
Ya! Selalu 32 Karakter!!! Artinya, perintah SQL yang dimasukkan sebagai tidak
akan diterjemahkan sebagai
perintah SQL, tapi akan menjadi 32 karakter yang acak. :D
Sekarang, bagaimana jika perintah SQL tersebut saya ganti begini?
SELECT * FROM users WHERE password='21232f297a57a5a743894a0e4a801fc3' AND
username='admin'
Maka, jika ada orang yang mencoba "admin'--", paling tidak akan
seperti ini:
SELECT * FROM users WHERE password='di_sini_pasti_karakter_md5' AND
username='admin'--'
Artinya, perintah SQL apapun tidak akan bisa dimasukkan karena 'password' harus
sesuai dengan password
yang ada dalam tabel :D.
thanks for artikel : http://informatika-cyber.blogspot.com/2012/03/indonesian-simple-technique-for-sqli.html
2. Sekilas tentang SQLi pada Form Login
3. Contoh Serangan
4. Penanggulangan Sederhana :)
5. Ucapan Terima Kasih
#1. Pendahuluan
SQL Injection merupakan salah teknik eksploitasi web yang cukup lama, namun hingga saat
ini teknik tersebut masih cukup mumpuni dan efektif untuk dilakukan. Buktinya saat ini masih
ada saja (dan banyak) website yang mengidap penyakit vuln terhadap serangan SQL Injection.
Inti dari penyebab bug ini yaitu terletak pada si pembuat web (web programmer), anggap saja
ada kesalahan logika berpikir atau ketidaktahuaannya dalam membuat website yang aman. :)
Saya tekankan sekali lagi, masalah bug ini terletak pada diri programmer web. Jadi, sehandal
apapun sistem operasi atau web server yang digunakan akan menjadi percuma manakala si programmer
memiliki kekeliruan logika ketika membangun sebuah web, khususnya SQL Injection.
#2. Sekilas tentang SQLi pada Form Login
Seperti yang kita ketahui, Form Login adalah Form untuk melakukan Login, halahhh :D. From
Login menjadi gerbang atau pintu yang akan membedakan dan memilah-milah pengunjung satu dengan
yang lainnya, apakah dia hanya sebagai pengunjung biasa, user biasa (pengupdate), atau sebagai
administrator, atau user dengan kategori lainnya.
Yang umum kita ketahui, dan ini yang saya ketahui dari cara berpikir programmer, secara
sederhana, autentikasi pada Form Login mempunyai teknik sebagai berikut:
Pertama, ada sebuah form untuk memasukkan username dan password. Misalnya seperti berikut:
Misal, nama filenya adalah login.html
----------- 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:
+---------+----------+----------------------------------+
| id_user | username | password |
+---------+----------+----------------------------------+
| 1| admin | 21232f297a57a5a743894a0e4a801fc3 |
| | | |
+---------+----------+----------------------------------+
"21232f297a57a5a743894a0e4a801fc3" adalah bentuk md5 dari "admin".
Sehingga, secara sederhana, proses perjalanan dengan input username = 'admin' dan
password = 'admin' adalah sebagai berikut, u = username, p = password:
+---------------------+
|u : admin, p : admin |
+----------+----------+
|
+----------+----------+
|u : admin, p : admin |
+----------+----------+
|
+----------+------------------------------------+
|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 sederhana dalam tulisan ini. :D
#3. Contoh Serangan
Untuk melakukan teknik serangan SQL Injection, saya pikir kita minimal tahu fungsi atau tata
cara pemanggilan atau perintah-perintah SQL (SQL Command). Dan saya pikir, semua database memiliki
perintah SQL yang relative sama, :D. 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. :D
#4. Penanggulangan Sederhana
Coba ingat-ingat lagi pada bagian kedua tadi. Saya sudah wanti-wanti agar Anda mengingat suatu
hal terkait proses autentikasi username dan password :D. Ingat, setiap password akan dihash menjadi
md5 baru kemudian dicocokkan.
Nah, mari kita berpikir kritis sejenak. Kenapa perintah SQL untuk mencocokkan username dan password
seperti itu? Kemudian kenapa hanya password yang dihash md5? Haha, tentu saya tidak akan membuat orang
susah dengan meng-hash username menjadi md5... :p. Tapi, coba lihat perintah SQL berikut:
SELECT * FROM users WHERE username='admin' AND password='21232f297a57a5a743894a0e4a801fc3'
Ada yang kepikiran gag? Setiap password, apa saja, akan dihash dan menjadi 32 karakter biasa.
Ya! Selalu 32 Karakter!!! Artinya, perintah SQL yang dimasukkan sebagai tidak akan diterjemahkan sebagai
perintah SQL, tapi akan menjadi 32 karakter yang acak. :D
Sekarang, bagaimana jika perintah SQL tersebut saya ganti begini?
SELECT * FROM users WHERE password='21232f297a57a5a743894a0e4a801fc3' AND username='admin'
Maka, jika ada orang yang mencoba "admin'--", paling tidak akan seperti ini:
SELECT * FROM users WHERE password='di_sini_pasti_karakter_md5' AND username='admin'--'
Artinya, perintah SQL apapun tidak akan bisa dimasukkan karena 'password' harus sesuai dengan password
yang ada dalam tabel :D.
0 komentar:
Posting Komentar