Sunday, December 11, 2011

Cara Lain Cegah SQL Injection

SQL Injection gak habis – habis. Setiap hari ada aja situs yang jadi korban. Entah emang karena adminnya gak ngerti atau apa saya gak tau. Padahal tutorial untuk bagaimana melakukan dan mencegahnya dah banyak banget beredar di internet.
Emang agak susah sih apalagi kalo yang model Blind SQL Injection dan beberapa variasi yang banyak banget. Sedangkan kita tahu, beberapa CMS terkenal pun sering jadi korban.

Sebagai contoh saya pengguna WordPress. Aman gak WordPress itu? Ya menurut saya sih oke – oke aja cuman bagaimana dengan pluginnya? Facebook pun banyak kasusnya yang ternyata kelemahannya berada pada Aplikasi – aplikasinya, mungkin game atau apapun itu.
Pada kesempatan kali ini saya hanya akan mencoba melakukan pencegahan dengan predefined atau PHP Superglobal $_SERVER['REQUEST_URI'] yang menangkap nilai pada URL.
Penasaran? Kita praktek aja. Ehmm, karena saya males buat contoh web yang vulnerable kita akan mencoba contoh script yang di buat oleh Om EVA-00 (kemana aja lo Bro?) yang juga sekalian dia menuliskan tutorial bagaimana melakukan Dasar SQL Injection.
Cara Lain Cegah SQL Injection
Setelah download, buka folder injector lalu ekstrak folder xyb_injector.sql.gz.
Buka phpMyAdmin dan buat database “inject” dan import database yang tadi telah kita ekstrak.
Cara Lain Cegah SQL Injection
Cara Lain Cegah SQL Injection
Dan hasilnya kayak gini nanti…
Cara Lain Cegah SQL Injection
Kembali ke folder injector, buka folder library dan edit file config.php. Masukkan username, password, host dari phpmyadmin dan nama database di dalamnya…
1
2
3
4
5
6
7
<?php
// This is an example of config.php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'inject';
?>
Selesai dan jalankan contoh webnya…
Cara Lain Cegah SQL Injection
Sampai sini kalian bebas belajar dah bagaimana dasar-dasar SQL Injection dan tutorialnya ada di dalam ebooknya.
Kita hanya stop sampai disini aja…
1
http://localhost/cobain/injector/index.php?id=-4+union+select+1,@@version,3,4,5--
Cara Lain Cegah SQL Injection
Sekarang buat file php baru dengan nama antisqli.php lalu masukkan script berikut.
1
2
3
4
5
6
7
8
9
<?php
if (strlen($_SERVER['REQUEST_URI']) > 255  || strpos($_SERVER['REQUEST_URI'], "concat") || strpos($_SERVER['REQUEST_URI'], "union") || strpos($_SERVER['REQUEST_URI'], "base64")) {
echo "Maaf Bro... Apa tuh? Mau Nakal Yah <img src="http://cruzenaldo.com/blog/wp-content/plugins/tango-smileys-extended/tango24/razz.png" alt="Razz" title="Razz" class="tse-smiley" width="24" height="24">";
@header("HTTP/1.1 414 Request-URI Too Long");
@header("Status: 414 Request-URI Too Long");
@header("Connection: Close");
@exit;
}
?>
Setelah itu kita melakukan include pada index.php di dalam folder injector tadi.
1
2
3
4
5
6
<?php
include 'library/config.php';
include 'library/opendb.php';
include 'antisqli.php';
 
?>
Di bagian paling atas tinggal tambahkan aja include ‘antisqli.php’;. Setelah itu buka link yang tadi kita sisipkan perintah SQL dan apa yang terjadi?
aaa
Keren kan? Oke kita lihat lagi antisqli.php – nya…
1
if (strlen($_SERVER['REQUEST_URI']) > 255  || strpos($_SERVER['REQUEST_URI'], "concat") || strpos($_SERVER['REQUEST_URI'], "union") || strpos($_SERVER['REQUEST_URI'], "base64"))
Jika variabel di URL lebih dari 255 atau (tanda || dibaca atau) ada kata “concat“, “union” dan “base64“.
1
2
3
4
5
echo "Maaf Bro... Apa tuh? Mau Nakal Yah <img src="http://cruzenaldo.com/blog/wp-content/plugins/tango-smileys-extended/tango24/razz.png" alt="Razz" title="Razz" class="tse-smiley" width="24" height="24">";
@header("HTTP/1.1 414 Request-URI Too Long");
@header("Status: 414 Request-URI Too Long");
@header("Connection: Close");
@exit;
Maka akan muncul pesan “Maaf Bro… Apa tuh? Mau Nakal Yah Razz” kemudian dilanjutkan dibawahnya.
Nah gak hanya cuman union / concat kan jika kita melakukan SQL Injection. Ada select, @@version dan lain – lain. Kan kalian yang lebih jago kalo soal beginian Grin Nantinya kalian tinggal tambahkan aja menjadi.
1
strpos($_SERVER['REQUEST_URI'], "concat")
Jangan lupa tanda || (atau). Oke sekian dulu tutorial dari saya, semoga berguna dan mohon maaf jika tutorial ini tergolong newbie banget dan sederhana. Ingat hal besar dimulai dari yang sederhana dulu. Ketemu lagi di tutorial berikutnya…

UPDATE

Pertama – tama makasih buat Om ketek untuk perbaikannya neh. Emang kemaren saya sempet lupain so pengembangan penting ini harus banget.
Kenapa? Coba, pertama kalo kita masukkan URL seperti ini
1
2
3
4
5
6
7
http://localhost/cobain/injector/index.php?id=-4+UniOn+select+1,@@version,3,4,5--
 
atau seperti ini
 
http://localhost/cobain/injector/index.php?id=-4+uNioN+select+1,@@version,3,4,5--
 
dan lain lain
Pasti bakalan gak berhasil karena masalahnya si strpos itu mencari dengan case sensitive alias huruf besar atau kecil dibedain… jadi union sama UniOn akan dibedakan.
Solusi pertama adalah menggunakan stripos (case insensitive)
1
if (strlen($_SERVER['REQUEST_URI']) > 255  || stripos($_SERVER['REQUEST_URI'], "concat") || stripos($_SERVER['REQUEST_URI'], "union") || stripos($_SERVER['REQUEST_URI'], "base64")) {
Atau menggunakan preg_match
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// kata2 kotor dan jorok... <img src="http://cruzenaldo.com/blog/wp-content/plugins/tango-smileys-extended/tango24/wink.png" alt="Wink" title="Wink" class="tse-smiley" width="24" height="24">
$berbahaya = array("union", "concat", "base64");
 
$gabungsemua = implode("|",$berbahaya);
if((strlen($_SERVER['REQUEST_URI']) > 255) || (preg_match("/".$gabungsemua."/i",$_SERVER['REQUEST_URI']))){
echo "Maaf Bro... Apa tuh? Mau Nakal Yah <img src="http://cruzenaldo.com/blog/wp-content/plugins/tango-smileys-extended/tango24/razz.png" alt="Razz" title="Razz" class="tse-smiley" width="24" height="24">";
@header("HTTP/1.1 414 Request-URI Too Long");
@header("Status: 414 Request-URI Too Long");
@header("Connection: Close");
@exit;
 
?>
Sekarang union,UNIon,unIoN dan variasi – variasi yang lain pasti gak akan berhasil…

No comments:

Post a Comment

Hosting Gratis

Web hosting

Archives

shareyourthinkall searchengine portalsite download