Kamis, 17 Desember 2009

Trik Mencegah SQL Injection

Mungkin sebelum kita berbicara jauh tentang teknik mencegah Sql Injection ini, alangkah baiknya kita mencoba untuk sedikit mengetahui bagaimana seorang hacker melakukan tekhnik SQL Injection ini. Baik, kita langsung saja ya…

Tekhnik yang digunakan seorang Hacker dalam melakukan SQL Injection ini salah satunya adalah:

=> mencari target

Kita bisa menggunakan dork pada search engine, kali ini penulis mencoba menggunakan http://google.com sebagai search enginenya.

Ketik : inurl:news.php?id=

Misal kita mendapatkan salah satu website yang beralamat http://sitecontoh.com/news.php?id=19

=> Mencoba melakukan testing

Di website http://sitecontoh.com/news.php?id=19 kita coba menambahkan karakter “ ‘ “ (tanda kutip) dibelakang angka “19” tersebut menjadi: http://sitecontoh.com/news.php?id=19’ . Dikarenakan ada keluar error yang biasanya seperti ini : “ Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in ……..” kita bisa asumsikan kalau website tersebut vulnerable.


Dikarenakan saya akan lebih focus bagaimana mencegah SQL Injection, mungkin untuk penjelasan lebih lanjut tentang Tekhnik SQL Injection bisa dicari di google yang sudah banyak website yang menjelaskan tentang tekhnik ini lebih gamblang dan mungkin lebih lengkap dan jelas.


Ok, sebenarnya tekhnik diatas hanya salah satu dari berbagai tekhnik yang digunakan seorang hacker untuk mencoba “membobol” website. Tekhnik SQL Injection ini bisa dilakukan pada alamat website (URL) ataupun juga bisa dilakukan pada form-form login. Dengan memasukan query-query sql injection di dalamnya. Query tersebut banyak jenisnya, contoh:

' or 1=1 or ''='

' or 1=1--

' or 1=1#

' or 1=1/*

') or '1'='1--

') or ('1'='1--

" or 1=1--

or 1=1--


Dan masih banyak lagi yang lainnya yang bisa anda cari di google (google lagi, google lagi). ^_^


Nah setelah kita mengetahui tekhnik-tekhnik yang digunakan seorang hacker dalam melakukan SQL Injection (walaupun singkat), minimal kita bisa sedikit ada gambaran kenapa hal itu bisa terjadi. Mungkin menurut pemahaman saya yang Newbie ini, saya bisa mengambil kesimpulan kalau hal itu terjadi dikarenakan Peng-codean atau bisa dikatakan ada kesalahan dalam penulisan pemrograman. Lalu yang akan menjadi pertanyaan, salah dimananya ya..??? ^_^

Baik sekarang kita bahas, karena diatas ada pertanyaan dimana letak kesalahan tersebut..?? kita perhatikan pengkodean dibawah ini :


$match = false;
if (isset($_POST['submit'])) {
$nama = $_POST['nama'];
$pass = $_POST['pass'];
$sql = "SELECT nama, password FROM user WHERE
nama='$nama' AND password='$pass'";
$res = mysqli_query($db, $sql);
// jika res berhasil,dan row yang
// dikembalikan=1, set $match=true
if ($res && mysqli_query_rows($res) == 1) {
$match = true ;
mysqli_free_result($res);
}
if ($match === true) {
echo 'account match';
} else {
echo 'invalid account';
}
}


kode program diatas memang kelihatan melakukan verifikasi data, tetapi sebenarnya sangat rapuh,penyerang bisa menggnakan query-query seperti dibawah ini,untuk melakukan akses secara tidak sah


// mengisi field nama saja,# adalah komentar,
// yang akan mengabaikan baris setelahnya
admin'#

// mengisi nama field saja
// mengekstrak data kelokasi tertentu
'OR' 1=1 INTO DUMPFILE '/path/ke_lokasi/file.txt '#
'OR' 1=1 INTO OUTFILE '/path/ke_lokasi/file.txt '#


atau seperti ini:

(tekhnik serangan multiple SQL Injection)


// $id dari method GET/POST
$sql = "SELECT * FROM buku WHERE kode='{$id}’ “;
//mengahapus isi table
0; DELETE FROM user
// membuat account baru
0; GRANT ALL ON *.* TO 'xxx@%'


Dalam kasus ini,macig quote akan mengabaikan tanda titik koma,ini sangat membahayakan
jika menggunakan SQLite atau postgreSQL. Adapun solusi nya adalah menggunakan operator
casting untuk memastikan bahwa id harus integer.


//Simulasi nilai $_POST['id']
0; DELETE FROM user
$id = (int) myMacig($_POST['id']);


apabila anda ingin memeriksa apakah input mengandung karakter tertentu,gunakan fungsi strpos().

$nama = myMacig ($_POST ['id']);
// periksa apakah karakter ; terdapat
// di variabel $nama.
if (strpos($nama, ';' die (gunakan karakter yang tidak merugikan kantong anda… hehehe');


oia, ketika form login juga biasa masih banyak loh yang bisa di exploitasi. Seperti yang kita ketahui dan mungkin suatu hal yang jadi standarisasi bahwasanya username dan password harus berupa angka dan huruf. Kenapa..?? Karena karakter khusus. SQL Injection biasanya memberikan variasi tanda mulai dari “=” (Sama dengan), “%” (Persen), “;” (Titik Koma), “\’” (Petik satu), “”" (Petik Dua) dan lain sebagainya. Berarti perlu adanya validasi anti karakter khusus. Salah satunya dengan melakukan pengkodean seprti dibawah ini :

//Mengambil nilai - nilai dari form
$username = trim($_POST[”username”]);
$password = trim($_POST[”password”]);

//apakah bernilai huruf dan angka.
if (!ctype_alnum($username) OR !ctype_alnum($password))
{
echo “Jagalah Hati,,,,,”;
}
else
{
echo “Alhamdulillah”;

berikut dibawah ini beberapa contoh fungsi yang bisa mencegah SQL Injection:

1.mysql_escape_string

Contoh :


$string = "The Injec'tion ";

$filter = mysql_escape_string($item);

printf("Hasil Filter : %s\n", $Filter);

?>

Fungsi mysql_escape_string merubah "The Injec'tion" menjadi "The Injec\'tion"



2. mysql_real_escape_string

Contoh :

$kon = mysql_connect('localhost', 'mysql_user', 'mysql_password');

if (!$kon) {

die('Gak Konek: ' . mysql_error());

}

$string = "The Injec'tion's";

$filter = mysql_real_escape_string($string, $kon);

printf("Hasil Filter: %s\n", $filter);

?>

Fungsi mysql_real_escape_string merubah "The Injec'tion's" menjadi "The Injec\'tion\'s"



Mungkin cukup sekian dulu tutorial sederhana dari saya.
Mohon maaf apabila terdapat kekeliruan di dalamnya.
Saya cuma pengen mencoba untuk share tulisan aja.

Kritik dan saran sangat penulis harapkan. Terimakasih.....
sumber : si-sanca.do.am

Tidak ada komentar:

Posting Komentar

Setelah membaca artikel di atas.
Apa komentar anda ??