3.4. Menguji SQL Injection – Time Delay

Ketika menguji apakah suatu aplikasi rentan terhadap SQL Injection, anda seringkali mendapati suatu kerentanan potensial sulit untuk dikonfirmasi. Ini dapat terjadi karena beragam alasan, tetapi utamanya karena aplikasi Web tidak menunjukkan kesalahan apapun atau dikarenakan anda tidak menerima data apapun juga.

Dalam situasi seperti ini, adalah sangat berguna untuk menyuntikkan jeda waktu database dan memeriksa apakah respon dari server juga mengalami jeda. Time Delay (jeda waktu) adalah teknik yang sangat powerful dikarenakan web server dapat  saja menyembunyikan kesalahan atau data, tetapi tidak dapat menghindari proses tunggu hingga database mengeluarkan hasil, dan karenanya anda dapat mengkonfirmasi berhasil atau tidaknya suatu SQL Injection.

Teknik ini umumnya berguna bagi skenario blind injection.

MS-SQL

Microsoft SQL servers memiliki perintah built-in untuk melakukan delay pada query :

WAITFOR DELAY ‘jam:menit:detik’

Sebagai contoh, reques berikut ini pada website korban melakukan delay selama 5 (lima) detik :

http://www.target.com/tampil.aspx?uid=45; waitfor delay '0:0:5';--

Jeda pada respon dari server menunjukkan bahwa kita sedang menyuntikkan kode SQL ke dalam database back-end.

MySQL

Database MySQL tidak memiliki perintah yang sama dengan WAITFOR DELAY.

Tapi, adalah mungkin untuk memerintahkan jeda menggunakan fungsi yang membutuhkan waktu lama untuk beroperasi. Fungsi BENCHMARK adalah pilihan yang bagus.

Fungsi BENCHMARK pada MySQL mengeksekusi suatu ekspresi sebanyak berkali-kali. Ia digunakan untuk mengevaluasi ekspresi kecepatan eksekusi MySQL. Jumlah waktu yang dibutuhkan oleh database bergantung pada beban kerja dari server dan penghitungan sumber daya. Tapi jeda yang terjadi dapat dilihat. Teknik ini dapat digunakan untuk mengidentifikasi kerentanan. Mari kita lihat contoh berikut ini :


mysql> SELECT BENCHMARK(10000000,ENCODE('hello','mom'));
+-----------------------------------------------+
| BENCHMARK(10000000,ENCODE('hello','mom'))     |
| 0      |
+-----------------------------------------------+
+-----------------------------------------------+
1 row in set (3.65 sec)

Tampilan diatas menunjukkan waktu 3,65 detik untuk mengeksekusi query, dan karenanya jika kita menyuntikkan kode ini ke dalam kerentanan SQL Injection, ia akan menjeda respon dari server. Jika kita ingin mendelay respon lebih jauh, kita hanya perlu menambah nilai iterasi. Berikut contohnya :

http://www.target.com/display.php?id=32; SELECT BENCHMARK(10000000,ENCODE('hello','mom'));--

Oracle

Pada Oracle PL/SQL, adalah mungkin untuk membuat jeda dengan menggunakan serangkaian instruksi berikut ini :

BEGIN
DBMS_LOCK.SLEEP(5);
END;

Fungsi DBMS_LOCK.SLEEP( ) menempatkan prosedur untuk “tertidur” dalam beberapa detik, sejumlah aturan diterapkan untuk fungsi ini. Yang paling pertama adalah bahwa fungsi ini tidak dapat langsung disuntikkan ke subquery, dikarenakan Oracle tidak mendukung stacked queri. Yang kedua, DBMS_LOCK hanya diperkenankan untuk digunakan oleh administrator.

Bersambung (rezaervani@gmail.com)