Belajar Menghindari SQL Injection Melalui Simulasi

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Belajar Menghindari SQL Injection
Belajar Menghindari SQL Injection (Ilustrasi: Rio Astamal)

TeknoCerdas.com – Salam cerdas untuk kita semua. Belajar Menghindari SQL Injection melalui Simulasi adalah materi yang Saya sampaikan pada komunitas PHP Indonesia pada acara PHP-ID Online Learning ke #52. Acara tersebut diselenggarakan secara online dan live pada Facebook PHP Indonesia.

Sebuah serangan SQL Injection yang sukses dapat membaca informasi sensitif dari database seperti password, kartu kredit, info personal atau lainnya. Jika role yang didapat sesuai bahkan dapat mengubah data atau mengeksekusi perintah administrator.

Catatan Penting: Informasi yang disajikan pada tulisan ini adalah untuk pengetahuan semata. Segala bentuk tindakan yang diakibatkan dari informasi pada tulisan ini bukanlah tanggung jawab penulis. Gunakan https://abwh.rioastamal.net/ untuk menguji kemampuan secara legal.

Baca Juga
Cara Mendeteksi Email Penipuan (Phishing) Lewat Header

Apa itu SQL Injection?

SQL Injection adalah teknik penyerangan yang memasukkan atau “menginjeksi” perintah ke sebuah query SQL yang dijalankan oleh aplikasi target.

Seberapa bahaya serangan ini? Menurut OWASP (The Open Web Application Security Project) Top 10 pada tahun 2010, 2013 dan 2017 SQL Injection menempati urutan pertama sebagai celah keamanan yang paling banyak ditemukan dan berbahaya.

Berikut ini adalah contoh SQL Injection sederhana. Diasumsikan ada sebuah URL berikut.

http://example.com/products/?category=X

SQL Query dari halaman diatas normalnya adalah berikut.

SELECT * FROM `products` WHERE `catid`=‘X’ LIMIT 0,10

Karena input dari category tidak disanitasi maka terdapat celah SQL injection. Sehingga penyerang dapat memasukkan query lain yang tidak dimaksudkan untuk dijalankan.

http://example.com/products/?categori='%20OR%201=1%23

Akan menghasilkan SQL query.

SELECT * FROM `products` WHERE `catid`=‘‘ OR 1=1 #LIMIT 0,10

Injeksi yang dimasukan adalah ' OR 1=1 # sehingga selalu menghasilkan nilai true dan semua produk akan ditampilkan.

Sepintas memang tidak berbahaya namun itu karena queyr injeksi yang dimasukkan tidak menggali data. Untuk belajar lebih efektif maka simulasi adalah langkah yang tepat.

Belajar Melalui Simulasi

Simulasi adalah salah satu cara belajar yang efektif karena menggunakan pendekatan studi kasus dari masalah nyata. Pembelajar akan dituntut untuk berfikir kreatif untuk memecahkan masalah yang ada.

Pada kasus ini Saya menggunakan pendekatan simulasi dimana pembelajar melakukan hacking pada sebuah website yang terdapat celah keamanan.

Simulasi misi yang digunakan adalah menggunakan https://abwh.rioastamal.net/ Realistic Mission 6. Pembelajar harus mengambil data-data personal dari website yang disediakan dengan melakukan SQL Injection.

Berikut ini adalah video rekaman acara meetup PHP-ID OL #52.

Cara Mencegah SQL Injection

Pertama – Jangan pernah percaya input dari user. Cara paling efektif untuk mencegah SQL Injection adalah dengan selalu melakukan sanitasi atau escaping dari inputan yang berasal dari user.

// Jika mengharap inputan berupa angka saja
$catId = (int)($someData); // atau
$catId = filter_var($someData, FILTER_VALIDATE_INT);

// Jika mengharap inputan alphanumeric
if (preg_match(‘/[^0-9A-Za-z]/‘, $someData) {
  exit(1);
}

// Jika mengharap semua karakter maka escape atau quote
$someData = $pdo->quote($someData);

Kedua – Selalu gunakan prepared statement. Gunakan selalu PDO atau driver yang mendukung prepared statement.

$catId = $_GET[‘cat’] ?? 0;

$query = ‘SELECT * FROM products WHERE categoryId = :id’;



$stmt = $pdo->prepare($query);

$stmt->execute([‘:id’ => $catId]);

Ketiga – Gunakan framework. Framework umumnya menyediakan pustaka ORM yang otomatis melakukan sanitasi dan hal-hal yang diperlukan untuk menghindari SQL Injection.

// Laravel

$products = Product::where(‘CatId’, $catId)
                   ->take(10)
                   ->get();

Keempat – Code review secara berkala. Cara paling efektif sebenarnya adalah pencegahan yaitu dengan melakukan kode review secara berkala. Karena developer bisa melakukan kesalahan entah karena diburu waktu atau terlup sehingga aspek security menjadi terabaikan.

Akan lebih baik lagi jika dilakukan internal penetration testing sendiri untuk mengetahui celah keamanan yang ada. Penambahkan tools penetration testing seperti SQLmap pada CI/CD adalah langkah yang bagus.