MetaXploit

Beberapa Cara Menutup Bug SQL Injection

Cara Patch Bug SQLi - SQL Injection (SQLi) adalah jenis serangan dimana perintah SQL disuntikkan ke input data atau semacamnya untuk memengaruhi perintah SQL yang telah ditetapkan. Serangan ini digunakan atacker untuk mendapatkan akses langsung ke database. Dan dengan demikian sang attacker bisa membaca data sensitif, hingga memodifikasi database (masukkan, perbarui, hapus). Celah Sqli ini bisa dibilang celah aplikasi web tertua, paling umum, tapi sangat berbahaya.

patch sqli
Patch SQL Injection

Sebagian besar aplikasi dan situs web modern menggunakan bentuk konten yang dinamis. Konten tersebut bisa dalam bentuk artikel, buku tamu, gallery, detail produk, halaman login, dll. Dengan demikian dalam scriptingnya pasti melibatkan database sebagai penyimpan data konten dinamis tadi.

Contoh script yang vuln terhadap SQLi:
<?php 
// (nama host, username mysql, password, nama table)
$conn = mysqli_connect("localhost","root","","sqli");
 if ($conn->connect_errno) {
    echo die("Failed to connect to MySQL: " . $conn->connect_error);
}
$id = $_GET['id']; 
$stmt = mysqli_query($conn, "SELECT * FROM user where id ='$id' "); 
    while($row = mysqli_fetch_array($stmt)){
?>
Pada source code diatas jelas terlihat tidak adanya filtering terhadap karakter seperti ('), ("), (-) sehingga bisa disisipi dengan perintah SQLi. Lalu bagaimana cara menutup bug tersebut? Mudah saja, kali ini saya akan memberi beberapa cara untuk patch bug SQLi tersebut.

Menggunakan fungsi is_numeric()
if(!is_numeric($id)) { 
echo "Patched."; 
exit;
}
Keterangan: jika nilai $id bukan merupakan angka (numeric) maka akan tampil "Patched."

Menggunakan fungsi mysqli_real_escape_string().
$id = mysqli_real_escape_string($conn,$_GET['$id']);
Fungsi tersebut berguna untuk memberi backslash di beberapa script yang akan ditampilkan di halaman, namun saat menyimpan menuju database, kode akan tetap normal tanpa ada backslash.

Patch SQLi dengan Prepared Statement
<?php 
// (nama host, username mysql, password, nama table)
$conn = mysqli_connect("localhost","root","","sqli");
 if ($conn->connect_errno) {
    echo die("Failed to connect to MySQL: " . $conn->connect_error);
}
// Prepare
$stmt = $conn->prepare("SELECT * FROM user where id = ? ")
// Bind
$stmt->bind_param("s", $_GET['id']);
// Execute
$stmt->execute();
$hasil = $stmt->get_result();
    while($row = mysqli_fetch_array($hasil)){
?>
Proses pembuatan prepared statements membutuhkan 3 langkah yaitu Prepared, Bind, dan Execute. Pada proses prepared, kita mempersiapkan query yang akan dijalankan, tetapi tanpa mengisi 'data'. Bagian dimana 'data' berada digantikan dengan tanda tanya (?) sebagai tanda bahwa bagian ini akan diisi dengan variable data.

Proses selanjutnya adalah BIND, merupakan proses kedua setelah query dilakukan, dimana nantinya akan ada sebuah proses pengiriman data yang sebelumnya telah di tandai dalam sebuah proses prepare pada query yang menggunakan tanda (?). Hal yang harus diperhatikan adalah data type yang kita kirim sebagai variable, sebagai contoh diatas saya isi dengan (s) yang berarti tipe data berupa string, (i) untuk integer, (d) untuk double, dan (b) untuk boolean.

Langkah berikutnya adalah mengeksekusi prepared query yang telah kita buat.

Dan cara yang sangat saya rekomendasikan untuk patch bug sqli adalah cara ketiga yaitu dengan menggunakan Prepared Statement. Sekian pembahasan tentang mencegah bug sqli kali ini. Terimakasih
Share This :
MetaXploit

Adalah seorang web designer yang suka mempelajari hal-hal yang baru seputar blog, template, coding dan Bisnis Online. Untuk mempelajari hal baru, membutuhkan kesabaran dan ketelitian dalam mempelajarinya.