Cara Sederhana Mencegah Serangan SQL Injection Get Parameter ID dengan Web Server Apache di GNU/Linux


Assalamualaikum Wr.Wb...
dengan diberikan nikmat dan rezeki dari Allah SWT, saya Mr.GagalTotal666 akan
berbagi kepada anda yaitu tentang cara sederhana mencegah serangan
SQL Injection Get Parameter ID dengan web server Apache di GNU/Linux.

sedikit penjelasan SQL Injection

SQL injection adalah suatu jenis aksi hacking pada keamanan komputer
di mana seorang penyerang atau attacker bisa mendapatkan akses
ke basis data di dalam sistem dengan memanfaatkan sebuah celah
keamanan yang terjadi dalam lapisan basis data sebuah
aplikasi yang tidak diproteksi dengan baik.

Cara yang digunakan oleh penyerang atau attacker sebenarnya
sangat sederhana, yaitu attacker berusaha memasukkan
query yang tidak valid ke melalui field input string
ataupun melalui URL. Mengingat sederhananya teknik ini
ada beberapa programmer yang terkadang mengabaikannya.

Contoh sederhana cara kerja SQL Injection

Pada umumnya sintak SQL yang sering dipakai pada proses developer
atau pembuatan sebuah aplikasi adalah sintak yang termasuk dalam
kategori perintah DML(Data Manipualtion Language)
yakni INSERT, UPDATE dan DELETE.

Contoh misalnya sebuah web dengan URL seperti ini :

$ http://127.0.0.1/latihan-crud/edit.php?id=8


perintah untuk menampilkan record SQL dari skema URL seperti di atas
biasanya adalah contoh seperti ini

$ "SELECT * FROM namatable WHERE id='$id'";

contoh penulisan sintak PHP akan menjadi seperti ini :

$sql = "SELECT * FROM mahasiswa WHERE id='$id'";


pada proses eksekusi normal sintak tersebut, database server akan memberikan
balikan hasil sesuai yang parameter yang dikirimkan. Namun bila
memodifikasi parameter yang dikirim melalu url dengan sebuah karakter
khusus yaitu single quote ( ‘ )

contoh seperti ini

$ http://127.0.0.1/latihan-crud/edit.php?id=8'
$ http://127.0.0.1/latihan-crud/edit.php?id=8%27

maka SQL query tersebut tidak akan bisa di eksekusi dan database server
akan memberikan balikan berupa pesan error sintak SQL, contoh seperti ini

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''8''' at line 1

atau juga

#1064 - You have an error in your SQL syntax;
check the manual that corresponds to yourMySQL server version for the right syntax to use near ''' at line 1


Dan hal ini lah yang mejadi celah sebuah situs dan dengan mudah di eksploitasi
dengan metode SQL Injection. Apa lagi jika dengan menggunakan
tools SQL ijection seperti SQLMap, BlindSQL dan lain-lain...
yang mempermudah kerjaan si attacker.

contoh poc pada SQLMap, seperti ini

$ sqlmap -u "http://127.0.0.1/latihan-crud/edit.php?id=8" --dbs
Parameter: id (GET)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=8' AND (SELECT 7571 FROM(SELECT COUNT(*),CONCAT(0x716b627871,(SELECT (ELT(7571=7571,1))),0x7170787871,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'EMoC'='EMoC
    Type: AND/OR time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind
    Payload: id=8' AND SLEEP(5) AND 'kYrE'='kYrE
    Type: UNION query
    Title: Generic UNION query (NULL) - 5 columns
    Payload: id=-8192' UNION ALL SELECT CONCAT(0x716b627871,0x544570576f56634257434c6e516c575976496150554d584450747a587a46694845414c4a6d65584d,0x7170787871),NULL,NULL,NULL,NULL-- JynT


oke langsung saja cara mengamankan dari serangan SQL Injection

ada beberapa cara yang bisa dilakukan untuk mengatasi serangan SQL injection,
kita bisa membuat script anti SQL injection dengan memanfaatkan fungsi bawan
dari PHP dan MySQL yaitu mysql_real_escape atau mysql_real_escape_string
kalau dengan PHP 5 ke atas contoh PHP 7 mysqli_real_escape_string.

cara penggunaanya adalah sebagai berikut :

$id = mysqli_real_escape_string($koneksi,$_GET['id']);


maka akan tidak ada pesan sintak SQL lagi jika sudah di patch
contoh seperti ini


dan jika si attacker menginject lagi maka tidak bisa
contoh dengan SQLMAP


oke mungkin itu saja mengenai cara sederhana
mencegah serangan SQL Injection kalau ada kesalahan
dan kekurangan nya mohon berikan masukan nya ya ^_^

Video tutorial


ada sedikit tambahan sebenarnya masih sama
namun ini peletakan code/script jika anda
ingin men select suatu qeury di php native Mysql
jika ingin where data tersebut,
alangkah baik nya suatu variabel yang ingin di where
di kasih Mysqli_real_escape_string, contoh seperti ini
jika tidak di kasih real_escape_string

function getUserIpAddr(){
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        //ip from share internet
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        //ip pass from proxy
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

    // konfigurasi database
    $host       =   "localhost";
    $user       =   "local";
    $password   =   "local123";
    $database   =   "local";

$ip_stat   = getUserIpAddr();
$koneksi = mysqli_connect($host, $user, $password, $database);
$query = "SELECT * From voting where ip_address = '$ip_stat'";
$hasil = mysqli_query($koneksi, $query);
$cek = mysqli_num_rows($hasil);


dan jika di poc sqlmap nya menggunakan WAF,
jika anda ingin poc SQLi sqlmap WAF lain bisa lihat [disini]
contoh

sqlmap -u https://target.com/voting/check_vote.php --headers="X-Forwarded-For:1*" -p X-Forwarded-For --level=5 --risk=3 --tamper="space2comment,between,randomcase" --technique="BEUST" --no-cast --random-agent --dbs



jadi untuk patch nya kita tambahkan
Mysqli_real_escape_string di variabel baru kemudian panggil
di select query nya, contoh sebagai berikut

function getUserIpAddr(){
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        //ip from share internet
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        //ip pass from proxy
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

    // konfigurasi database
    $host       =   "localhost";
    $user       =   "local";
    $password   =   "local123";
    $database   =   "local";

$ip_stat   = getUserIpAddr();
$koneksi = mysqli_connect($host, $user, $password, $database);
$ip_stat = mysqli_real_escape_string($koneksi, $ip_stat);
$query = "SELECT * From voting where ip_address = '$ip_stat'";
$hasil = mysqli_query($koneksi, $query);
$cek = mysqli_num_rows($hasil);

nah jika sudah begitu, maka attacker tidak bisa
menginjection DB kalian, contoh


nah mudah bukan ?, oke mungkin itu saja mengenai cara mengatasi nya ya
sekian dan semoga bermanfaat...

Wasalamualaikum Wr.Wb...

Post a Comment

0 Comments