Cara Mengatasi Bug SQL Injection Website PHP

Cara Memperbaiki Bug SQL Injection Pada Website PHP
Cara Memperbaiki Bug SQL Injection Pada Website PHP

Sebuah serangan SQL Injection adalah sebuah metode serangan yang dilakukan oleh hacker jahat dengan cara memasukkan/menginjeksi SQL Query/Perintah SQL melalui input data pada sebuah aplikasi. biasanya serangan ini terjadi pada bagian Kolom Pencarian/Search Box, Form ( Login, Daftar, dll ), Parameter, Header HTTP, dll.
Jika anda seorang admin/webmaster, maka hal ini adalah sesuatu yang serius bagi anda, apalagi sekarang lagi ngetop banget Serangan SQL Injection ini. Maka dari itu saya membuat sebuah tutorial untuk mengatasi serangan berbahaya semacam SQL Injection ini.

Contoh code yang vulnerable/rentan terhadap SQL Injection :
<?php
$id = $_GET['id'];
$db = mysql_connect('localhost', 'admin', '123456');
mysql_select_db("bug", $db);
$query = "SELECT * FROM pengguna WHERE id = '".$id."'";
$hasil = mysql_query($query);
echo $hasil;
?>

Dalam tutorial ini saya memberikan sebuah contoh kode PHP diatas yang ada bug SQL Injection nya & memperbaiki bug tersebut dengan beberapa cara di bawah ini.

1.) Gunakan Prepared Statement pada SQL Query anda.

Prepared Statement ini terdapat pada module PDO di MySQL ( Sudah ada diversi terbaru MySQL ), Prepared Statement Menurut w3school :
Prepared Statements and Bound Parameters. A prepared statement is a feature used to execute the same (or similar) SQL statements repeatedly with high efficiency. Prepared statements basically work like this: Prepare: An SQL statement template is created and sent to the database.
Berikut contoh code untuk memperbaiki bug SQL Injection pada code diatas.
<?php
$db_host = "localhost";
$db_name = "admin"; // database name
$db_user = "baru"; // datebase user
$db_pass = "123456"; // database password

$koneksi = "mysql:host=$db_host;dbname=$db_name";

try 
{
    $db = new PDO($koneksi, $db_user, $db_pass);   
}
catch (exception $e) 
{
    echo "error";
    exit();
}
$id = $_GET['id'];
$sql = "SELECT * FROM pengguna WHERE id = $id";
$stmt = $db->prepare($sql);
$stmt->execute();
$objek = $stmt->fetchObject();
echo $objek->nama;
?>


 2.) Gunakan filter pada code PHP anda.

Filter ini tentunya berguna untuk menyaring tipe input yang sedang dimasukkan oleh pengguna dan pastinya fitur Filter pada php ini juga bisa berguna untuk meminilisir serangan SQL Injection pada parameter/website anda. berikut contoh codenya:
<?php
$id = filter_var($_POST['id'], FILTER_VALIDATE_INT); // Filter ini berguna untuk mefilter tipe
//data integer
$nama = filter_var($_POST['nama'], FILTER_SANITIZE_STRING);//untuk tipe string
?>


3.) Gunakan .htaccess untuk memfilter Query HTTP pada web server anda.

Metode ini biasanya digunakan oleh plugin keamanan Wordpress, saya juga dulu make method ini dan lumayan ampuh untuk menangkal serangan SQL Injection dan sebagainya.

ServerSignature Off

Options -Indexes

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
RewriteRule ^(.*)$ - [F,L]
RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC]
RewriteRule . - [S=1]
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|) [NC,OR]

RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]

RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]

RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]

RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]

RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]

RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]

RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]

RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]

RewriteCond %{QUERY_STRING} ftp\: [NC,OR]

RewriteCond %{QUERY_STRING} http\: [NC,OR]

RewriteCond %{QUERY_STRING} https\: [NC,OR]

RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]

RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]

RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]

RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]

RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]

RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]

RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]

RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]

RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]

RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]

RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]

RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|) [NC,OR]

RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]

RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]

RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]

RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]

RewriteCond %{QUERY_STRING} (sp_executesql) [NC]

RewriteRule ^(.*)$ - [F,L]


4.) Pasang WAF ( Web Application Firewall ) Pada Web Server Anda.

WAF ( Web Application Firewall ) ini berperan sangat penting dalam melindungi Web Server anda, Karena WAF bertugas sebagai penjaga web anda dari berbagai serangan berbahaya ( SQL Injection, XSS, Spam, CSRF, dll ).
Berikut beberapa WAF yang dapat diandalkan untuk menjaga Web anda dari serangan Hacker Jahat :3 :
  1. Barracuda Networks Web Application Firewall
  2. CloudFlare ( CDN sekaligus WAF )
  3. Incapsula ( CDN sekaligus WAF )
  4. Dan masih banyak lagi.
Ok, mungkin hanya itu yang saat ini yang bisa saya opinikan, jika anda memiliki tambahan, koreksi dan pertanyaan anda bisa meninggalkannya melalui kolom komentar dibawah ini. Semoga Bermanfaat. : )

Previous
Next Post »

6 comments

Click here for comments
Reza Aditya
admin
June 2, 2016 at 9:05 PM ×

yoii gan, waktu itu web temen ane ada yang kena deface, tapi untungnya hacker a.k.a Security tester nya baik, bug SQL nya dipatch sama dia :v

Reply
avatar
June 2, 2016 at 9:09 PM ×

Codenya cukup rumit, bagi orang awam seperti ane mendingan minta dibenerin pada ahlinya saja, tapi nice artikel nih

Reply
avatar
June 2, 2016 at 9:16 PM ×

Artikelnya keren bro, sayang sekali ilmu ku belum sampai ke situ masih tahap pembelajaran

Reply
avatar
Afan Syarif
admin
June 2, 2016 at 9:35 PM ×

Ini nih yang dicari cari , thanks infonya gan.

Reply
avatar
Ryan C
admin
June 2, 2016 at 9:36 PM ×

kalau ga ada data yang diutak atik, bagus deh, gw turut seneng. :v

Reply
avatar
September 3, 2016 at 1:59 PM ×

gan, mau tanya nih. saya udah pake cara di atas..
begitu saya coba field username di isi : siska
dan password di isi : siska' OR 'x'='x
begitu di enter, bisa login. itu gimana yah cara atasinya ?
saya udah pake $mysqli->real_escape_string(trim($_POST['username']))
$mysqli->real_escape_string(trim($_POST['password']))

Reply
avatar
Thanks for your comment
z35W7z4v9z8w