Basic SQL Injection beserta patchnya

sql injection merupakan teknik exploitasi yang sudah cukup lama namun masih ampuh hingga detik ini :P, kelemahan vulnerbility ini terletak pada sisi programmer. programmer salah dalam logika berfikir atau masih kurangnya pengetahuan tentang keamanan website, parahnya lagi klo ada programmer berfikir yang penting program jalan 😦 .

oke, disini saya akan menjelaskan basic saja untuk selanjutnya silakan anda explore sendiri.. :Dagar mudah dipahami silakan anda ikuti tulisan ini satu demi satu:

buat contoh form login, form di bawah ini mengidap vulnerbility sql injection. ini cuma contoh silakan sesuaikan dengan kondisi settingan anda sendiri.

<html>
<head><title>Home | Login</title></head>
<body>
<form  method="post" action="check.php">
<table>
<tr>
<td>Id:</td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" name="login" value="Login"></td>
</tr>
</table>
</form>
</body>
</html>

simpan dengan nama login.php

<?php session_start();

//variable untuk koneksi ke mesin database
$host="localhost";
$user="root";
$pass="toor";
$dbase="xmalang";

//variable dari method POST
$id=$_POST['id'];
//variable post password di hash
$password=md5($_POST['password']); 

//koneksi ke server database
$con=mysql_connect($host,$user,$pass) or die('Gagal koneksi ke server'); 

//aktifkan database
mysql_select_db($dbase, $con) or die('Gagal koneksi ke database');

//check database disini
$perintah=mysql_query("select * from anggota where id='$id' and password='$password'");
$jmlbaris=mysql_num_rows($perintah);


//keputusan dari hasil check
if ($jmlbaris>=1)
   {
    echo '<script type="text/javascript">alert("Berhasil masuk !!");</script>';
    echo '<table border="1">
          <tr>
            <th>id</th>
            <th>password</th>
          </tr><tr>';
    while($row=mysql_fetch_array($perintah))
      {
       echo "<td>". $row['id'] ."</td>";
       echo "<td>". $row['password'] ."</td>";
       echo "</tr>";
      }
   }
else
   {
    echo '<script type="text/javascript">document.location.href="login.php"</script>';
   }
?>

simpan dengan nama check.php

alur dari program diatas akan seperti ini:

start -> login.php --> check.php check=ok --> berhasil masuk !!(tampil tabel)
             |                     |
             +------------------ check=no 

pada saat ingin login anda harus melakukan autentikasi terlebih dahulu, akan disediakan formulir berisi id dan password. isi variable formulir tersebut akan di cocokan dengan data yang ada dalam database, jika data tersebut ada maka ok anda berhak masuk jika tidak anda cari tau sendiri jawabanya.. 😛

misalkan pada form login.php anda masukan id=admin dan password=admin

maka dalam query sql tertulis seperti ini(lihat di source check.php di bagian check database):

select * from anggota where id='admin' password='21232f297a57a5a743894a0e4a801fc3'; 

password akan selalu menjadi hash karena setiap password yang di post dari form login.php baik null/tidak akan di md5 terlebih dahulu, lihat lagi coding check.php jika bingung. apabila data cocok dengan data yang ada dalam database maka akan tampil dibawah ini, jika tidak akan kembali ke form login.php

+--------+----------------------------------+
| id     | password                         |
+--------+----------------------------------+
| admin  | 21232f297a57a5a743894a0e4a801fc3 |
+--------+----------------------------------+

sampai sini sudah paham mengenai konsep anda login ?? klo sudah lanjut ke tahap selanjutnya.

#exploitasi

anda sadar bahwa query sql seperti itu menimbulkan vulnerbility yang bisa di manfaatkan oleh attacker. oke kita buktikan coba anda masukan query seperti ini:

fokus pada id saja, tidak mungkin kita menginjeksi bagian password karena apapun yang dimasukan akan selalu di hash.

– jika tidak tau id

id: ‘ or true–
id: ‘ or 1=1

– jika sudah tau id

id: admin ‘–
id: admin ‘ or ‘a’=’
id: admin ‘ or ”=’

coba kita masukan id: admin’ or ”=’ dan password: kosongkansaja. maka dalam query tertulis:

select * from anggota where id='admin' or ''='' and password='d41d8cd98f00b204e9800998ecf8427e';

sudah bisa ditebak kita pasti bisa masuk, tanpa password yang sah sekalipun. hahaha seninya adalah karena logika OR tersebut. dalam logika or jika salah satu benar maka bernilai true.

satu contoh lagi, masukan id: admin ‘– password: asal2saja. dalam query menjadi:

select * from anggota where id='admin'--' and password='96910e4a55eac09f60bf51547d1b158a';

query diatas bagian password akan di anggap sebagai komentar, jadi yang akan di eksekusi hanya bagian id saja. klo id sudah didapatkan urusan password bukan kendala lagi bukan hhehehe.. dengan teknik sederhana diatas kita bisa saja masuk sebagai user siapapun maupun masuk sebagai administrator web.

#Patch atau tutup lubang kelemahan

untuk php versi 5.2 celah ini sudah di tutup karena string qoutes akan di escape(misal ‘ menjadi \’), settingan ada pada php.ini di bagian parameter magic_quotes_gpc = Off. jika anda ingin mempraktekanya dan kebetulan versi php anda versi 5 pastikan bahwa settingan magic_qoutes_gpc menjadi On.

gimana klo server kita virtual host, cuma numpang naro file website tanpa bisa kutak-katik settingan php. tenang banyak jalan menuju server wkkkkk.. kita buat fungsi sendiri aja yah itung2 ngasah logika.. ingat point kita adalah mencegah masuknya string-string berbahaya yag bisa menginjeksi query sql.

contoh: ‘, -, =, #

 
<?php
$id=$_POST['id'];

//get panjang string  
$n=strlen($id);

//pecah string menjadi array karakter.
$split=str_split($id);

for ($i=0;$i<=$n;$i++)
{
//pengechekan string yang dilarang.
if ($split[$i]== "'" or $split[$i]== "-" or $split[$i]== "=" or $split[$i]== "#")
{
echo "Dilarang sql injection !!!";
}
}
?>

script diatas adalah salah satu cara untuk ngeblok string2 yang dianggap berbahaya. atau mau mudahnya gunakan saja fungsi mysql_real_escape_string. fungsi ini akan berpengaruh terhadap karakter \x00,\n,\r,\,’,”,\x1a.

<?php
$id=mysql_real_escape_string($_POST['id]);
?>

fungsi script diatas menjadikan karakter yang tidak di perbolehkan menjadi escape.

contoh: misal kita input id: admin’ or ”=’ password: d41d8cd98f00b204e9800998ecf8427e

hasil query menjadi:

select * from anggota id='admin\' or \'\'\=\'' and password='d41d8cd98f00b204e9800998ecf8427e';

query tersebut tidak valid, maka tidak akan dieksekusi. nah sudah ada bayangan kan ?? saya harap gitu… klo blum maafkan saya karena saya tidak berhasil menulis dengan baik karena memang sudah lama tidak menulis artikel lagi hehehehe…

semoga dengan artikel sederhana ini bisa membuka pikiran anda untuk lebih serius lagi dalam menggapi masalah keamanan web. apalagi website itu umum siapa saja bisa mengaksesnya.. dan kemungkinan serangan akan selalu ada.

good luck !!

[GXRG] learning by doing not just for sharing

Advertisements
This entry was posted in Networking. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s