Where you are.?

Sleek, Modern & Responsive

MENGENAL SQL INJECTION DAN CARA MENCEGAHNYA [Part 2]


Hallo.! Selamat Malam.. 😴

Apa Kabar Para Pemburu Ilmu.. Semoga sehat selalu

Yups Sesuai janji kemarin. Masih akan membahas tantang "MENGENAL SQL INJECTION DAN CARA MENCEGAHNYA" yang pastinya akan kita bahas sampai tuntas

Tanpa banyak intro yups cekidot. :V


BAGAIMANA CARA SERANGAN SQL INJECTION BEKERJA


Secara umum untuk melakukan serangan dengan teknik SQL Injection umumnya penyerang menjalankan dua tahapan proses yaitu [1]:

  • 1. Tahapan Riset.

Penyerang umumnya melakukan riset dengan mengirimkan berbagai macam nilai yang tidak diharapkan sebagai argumen input, kemudian dia mempelajari respon dari aplikasi, kemudian dia menentukan apakah target URL rentan atau tidak terhadap SQL Injection.

  • 2. Tahap Serangan.

Setelah melakukan riset mengenai kerentanan pada aplikasi, maka pada tahapan ini penyerang membuat payload tertentu sebagai nilai input dari argumen sehingga payload tersebut akan diinterpretasikan sebagai bagian dari perintah SQL ketimbang hanya data. Kemudian database melakukan eksekusi terhadap perintah yang telah dibuat oleh penyerang.

  • Berikut ini merupakan ilustrasi singkat mengenai bagaimana serangan SQL Injection bekerja.

Gambar 4 - Ilustrasi Serangan SQL Injection [2]



Serangan SQL Injection terjadi karena aplikasi web yang tidak melakukan validasi terhadap nilai yang diterima dari formulir isian pada web, cookie, parameter input, dan lainnya sebelum melewatkan nilai tersebut ke query SQL yang akan dieksekusi pada server database. Dengan demikian, hal ini memungkinkan penyerang untuk memanipulasi input sehingga data yang dikirimkan dapat diinterpretasikan sebagai kode/perintah SQL ketimbang sebagai data. Berikut merupakan contoh sederhana dari teknik serangan SQL Injection. SQL statement dinamis umumnya dikonstruksi pada saat eksekusi dilakukan, misalkan contoh berikut ditulis dalam bahasa pemrograman .NET dimana parameter input harus diisikan oleh pengguna



Query = "SELECT * FROM users WHERE username = ' " +request.getParameter("input")+ " ' " ;


Salah satu teknik yang umum dilakukan oleh penyerang adalah dengan melakukan manipulasi terhadap SQL statement, dimana penyerang berupaya memodifikasi SQL query statements dan menyisipkan "exploited statements" ke dalam database.


SELECT * FROM users WHERE loginName = '$user' AND loginPassword = '$password'


Lalu apa yang akan terjadi jika pengguna memasukan nilai berikut:


$user = ' OR '1' = '1 
$password = ' OR '1'= '1


Karena nilai 1=1 memiliki arti selalu menghasilkan nilai benar atau TRUE, maka query tersebut akan berhasil dieksekusi meskipun tidak ada username dan password yang valid yang dimasukan, dengan demikian penyerang berhasil mem-bypass mekanisme otentikasi. Versi lainnya dari serangan ini adalan dengan menyisipkan dua karakter dash secara berurutan (--) atau karakter # yang oleh database MySQL dianggap sebagai penanda bagian komentar sehingga baris perintah setelahnya akan diabaikan.


SELECT *
FROM Users
WHERE loginName = ' John ' - -
AND Password = anything
SELECT *
FROM Customers
WHERE AccNumber = 1 OR 1 = 1 #
AND Pin = anything


Dengan demikian penyerang dapat mem-bypass mekanisme otentikasi, karena perintah setelah (--) atau # yakni AND Pin = anything akan dianggap sebagai baris komentar oleh database

PENCEGAHAN TERHADAP SERANGAN SQL INJECTION


Berikut merupakan beberapa langkah pencegahan yang dapat dilakukan untuk mengatasi serangan SQL Injection, yaitu:

  • MENGGUNAKAN PARAMETERIZED SQL QUERY

Menggunakan parameterized query atau prepared statement merupakan salah satu teknik sederhana dan dapat dikatakan mudah untuk dilakukan.

Penggunaan parameterized query ditujukan agar database dapat membedakan mana yang merupakan SQL statement dan mana yang merupakan data yang diinputkan oleh pengguna. Melalui cara ini, penyerang tidak bisa mengubah isi query, walaupun telah memasukkan kode SQL saat melakukan input. Berikut merupakan contoh penggunaan prepare statement pada bahasa pemrograman PHP.


SELECT *
$name  = $_REQUEST['name'];
$email = $_REQUEST['email'];
$params = array($name, $email);
 
$SQL = "INSERT into tbname(Name, Email) VALUES (?,?)";


Melalui mekanisme ini, data yang dikirimkan oleh pengguna akan menggantikan parameter yang berada di dalam tanda kurung "(?)", sebagai parameter data yang diinputkan oleh pengguna.

  • LAKUKAN PENGECEKAN POLA (PATTERN CHECK) : VALIDASI INPUT DATA DENGAN MENGGUNAKAN REGULAR EXPRESSION

Secara umum terdapat dua hal yang dapat dilakukan untuk melakukan validasi input, yakni

  • a. Melakukan Whitelist.

Hanya menerima input data yang memang benar-benar diketahui baik. Beberapa hal yang perlu menjadi pertimbangan melalui cara ini antara lain nilai yang diizinkan, tipe data, ukuran data, data range, konten dari data.

  • b. Melakukan Blacklisting.

Hanya menolak input data yang memang benar-benar diketahui tidak baik. Hal yang dapat dilakukan pada teknik ini yakni menolak input yang mengandung konten berbahaya. Misalkan seperti contoh berikut:


function filter_param($text,$html=true){
        $e_s=array('\\','\'','"');
		$d_s=array('','','');
		$text = preg_replace( "']*>.*?'si", '', $text );
        $text = preg_replace( '/]*>([^<]+)<\/a>/is', '\2 (\1)', $text );
        $text = preg_replace( '//', '', $text );
        $text = preg_replace( '/{.+?}/', '', $text );
        $text = preg_replace( '/ /', ' ', $text );
        $text = preg_replace( '/&/', '', $text );
		$text = str_replace( $e_s, $d_s, $text );
        $text = strip_tags( $text );
        $text = preg_replace("/\r\n\r\n\r\n+/", " ", $text);
        $text = $html ? htmlspecialchars( $text ) : $text;
        return $text;
}



Memberikan batasan hak akses untuk membatasi kerusakan yang terjadi akibat SQL injection. Jangan sesekali Anda login ke database menggunakan akses admin sebagai root. Namun, Anda dapat menggunakan akses istimewa yang telah ditentukan untuk membatasi ruang lingkup sistem.

  • Melakukan ESCAPE Untuk $_POST Dan $_GET.

Untuk $_POST contoh berikut:


if($_SERVER["REQUEST_METHOD"] == "POST")
	{

                $cust = $id;
		$name = mysqli_real_escape_string($conn, htmlspecialchars($_POST['name']));
		$isikom = mysqli_real_escape_string($conn, htmlspecialchars($_POST['isikom']));
		
		$sql ="INSERT INTO kordinasi (id_kom, nama, isi) VALUES 
		('$cust','$name', '$isikom')";



Dengan escape semua special karakter untuk $_POST tersebut dan mengunakan filter htmlspecialchars akan membantu kita untuk mencegah terjadinya serangan SQL INJECTION

Untuk paraneter $_GET contoh berikut:


$id = (int) $_GET['id'];



Integer

Mengunakan fungsi (int) cukup mengurangi risiko serangan SQL INJECTION. karena yang kita ketahui pada umumnya (int) hanya menerima data Integer

  • Demikian beberapa cara pencegahan yang bisa Anda lakukan agar terhindar dari serangan SQL injection.

Selain itu, pastikan juga bahwa aplikasi web yang Anda bangun telah lulus SQL injection vulnerability test.

Semoga artikel diatas bermanfaat bagi dan dapat membantu Anda untuk lebih meningkatkan keamanan aplikasi anda dari serangan SQL Injection.




Penulis


0xTrue



Facebook Share Facebook

Komentar


  • (SELECT (CASE WHEN (


  • (SELECT (CASE WHEN (


  • (SELECT (CASE WHEN (


  • (SELECT (CASE WHEN (


  • (SELECT (CHR(113)||C


  • (SELECT (CHR(113)||C


  • (SELECT 1475 FROM(SE


  • (SELECT 4225 FROM(SE


  • (SELECT CHAR(113)+CH


  • (SELECT CHAR(113)+CH




DomaiNesia

Visit: 1081 © 2020 All Rights Reserved. 0xTrue-Dev
Made with Indonesia.