Incorrectly Handled EscapeCharacters
Jika Anda memasukkan karakter tunggal sebagai inputan ke dalam aplikasi,anda mungkin dapat terjadi beberapa kesalahan berikut,hasil tersebut terantung pada sejumlah factor lingkungan(seperti bahasa pemograman dan database yang di gunakan),perlindungan dan teknologi pertahanan diimplementasikan.
Alasan mengapa terjadi kesalahan pada karakter tunggal adalah karena karakter tungal kutipan telah ditafsikarkan sebagai tali pembatas.Database SQL melihat karakter tunggal kutipan sebagai karakter khusus(string delimiter).Karakter ini digunakan dalam serangan injeksi SQL untuk menghapus jejak penyerangan dalam pengembangan query sehingga penyerang kemudian dapat membangun query sendiri dan mengeksekusi.
Incorrectly Handled Types
Beberapa dari anda mungkin berpikir bahwa untuk menghindari diekspoitasi oleh injeksi SQL,salah satunya yaitu keluar atau memvalidasi input untuk menghapus karakter tunggal-kutipan akan cukup.Namun sebaliknya pengembangan aplikasi Web menjadi lebih berkembang lagi.
Karakter tunggal kutipan diinterpretasikan sebagai string pemisahan dan digunakan sebagai batas antara kode dan data.Ketika berhadapan dengan data numeric,tidak perlu untuk membungkus data-data dengan tanda kutip,jika tidak maka data numeric akan diperlakukan sebagai string.
MySQL menyediakan fungsi yang disebut load_file yang membaca file dan mengembalikan file sebagai string.Untuk menggunakan fungsi ini,file tersebut harus berada pada host server database dan nama path lengkap ke file harus disediakan sebagai masukan untuk dimasukan ke fungsi.
Incorrectly Handled Errors
Masalah yang paling umum terjadi ketika rinci kesalahan pesan internal seperti database adalah terjadi kesalahan kode yang ditampilkan.Pesan yang di tampilkan memberikan penyerang dapat mengetahui kelemahan dari situs tersebut.Verbose adalah pesan kesalahan database yang dapat di gunakan untuk mengekstrak informasi dari database tentang cara mengubah atau membangun
Application Vunerability
Cara paling cepat untuk mengetahui potensial apakah sebuah aplikasi dapat kita inject dengan SQL Injection adalah dengan melihat source code dari aplikasi tersebut. Terdapat dua method untuk menganalisa melihat kelemahan source code sehingga dapat kita inject : analisa static code dan alanisa dynamic code. Analisa dynamic code merupakan analisa dari kode yang kita lihat dari runtime program. Analisa manual static code mencakup analisa setiap baris demi baris dari kode untuk di identifikasi apakah terdapat kelemahan dalm kode tersebut sehingga dapat kita inject. Namun, jika aplikasi sudah terlalu besar dan terdapat banyak baris kode, tentu tidak lazim jika kita melihat satu per satu dari baris-baris kode tersebut. Sangat penting untuk memilih sebuah method untuk melihat sebuah source code.
Tainted data merupakan data yang telah diterima dari sebuah sumber yang tidak terpercaya (variabel internal juga dapat menjadi tercemar [tainted] jika data yang tidak terpercaya tersebut di copy ke variabel mereka). Kita dapat menjadikan sebuah data yang tidak terpercaya menjadi valid / trusted / terpercaya dengan menggunakan pemberian filter pada input atau juga pemberian fungsi-fungsi validasi. Data yang tidak terpercaya tersebut dapat menjadi masalah dalam sekuriti applikasi tersebut khususnya pada titik-titik lemah program, titik lemah ini dapat kita sebut dengan istilah sinks.
Dalam membuat sebuah kode untuk aplikasi kita harus memperhatikan dan melihat sinks ini meskipun hal tersebut dapat dikatakan cukup susah, sebab setiap bahasa pemrograman memiliki cara berbeda untuk membuat dan mengeksekusi statement SQL.
Umumnya SQL Injection menyerang sebuah aplikasi web. Hal ini mungkin terjadi jika sebuah developer tidak memvalidasi nilai dari sebuah sumber yang tidak terpercaya (misalnya sebuah method menerima data dari sebuah Web Form, cookies, input parameter, dan lain sebagainya) tidak divalidasi sebelum di lempar ke dalam sebuah query SQL yang akan dieksekuis di database server.
Contoh dari kode PHP :
$result = mysql_query(“SELECT * FROM table WHERE column = ‘$_GET[“param”]’”);
Contoh dari kode VB (ASP.NET) :
Dim cmd As String = “SELECT * FROM tbUser WHERE column = ‘” + Request.QueryString(“param”) + “’”
Kode tersebut rawan untuk di inject, sebab input dari user langsung di lempar ke dalam query tanpa di validasi terlebih dahulu. Seharusnya kita menginputkan terlebih dahulu hasil inputan dari sumber yang tidak terpercaya tersebut ke dalam sebuah variabel penampung terlebih dahulu, baru kita lempar ke dalam query SQL agar tidak dapat di inject.
Contoh dari kode PHP :
//ditampung dalam sebuah variabel
$parameter = $_GET(“param”);
// validasi terlebih dahulu inputnya
…………
// setelah validasi dimasukkan ke dalam Query SQL
$result = mysql_query(“SELECT * FROM table WHERE column =
‘$_GET[“param”]’”);
Contoh dari kode VB (ASP.NET) :
‘ ditampung dalam sebuah variabel
Dim check As String = Request.QueryString(“param”)
‘ validasi terlebih dahulu inputnya
………
‘ setelah validasi dimasukkan ke dalam Query SQL
Dim cmd As String = “SELECT * FROM tbUser WHERE column = ‘” + check + “’”
Setelah selesai kita tampung dalam sebuah variabel, kita dapat melakukan pengecekkan terhadap validasi tersebut, misalkan dengan mengecek berapa panjang variabel yang dilempar.
Contoh kode PHP :
$param = $_GET(“param”);
If (strlen($param) < $limit) {error_handler(“param exceeds max length!”)}
$result = mysql_query(“SELECT * FROM table WHERE field = ‘$param’”);
atau dapat kita gunakan kode
$param = mysql_real_escape_string($param);
$result = mysql_query(“SELECT * FROM table WHERE field = ‘$param’”);
Contoh kode VB (ASP.NET) :
If (Request.QueryString(“param”) Is Nothing
Response.Write(“ … “)
Else
Dim check As String = Request.QueryString(“param”)
If (check.Length < limit)
Response.Write(“ … “)
Else
Dim sqlQuery As String = “SELECT * FROM table WHERE
column = ‘” + check + “’”
‘ kode selanjutnya di bawah
………
End If
End If
Untuk dapat membuat sebuah kode yang efektif dan melihat semua potensi SQL Injection pada aplikasi kita, kita harus dapat melihat terlebih dahulu mana saja yang merupakan kebiasaan koding yang berbahaya, seperti tidak adanya validasi input. Sangat penting untuk validasi input dan mengetahui kebiasaan coding yang berbahaya untuk mengetahui kelemahan dari kode-kode yang dibuat (terutama dynamic code seperti dalam web).
//contoh sebuah dynamic execute sql string statement dalam PHP
mysql_query(“SELECT * FROM table WHERE field = ‘$_GET(“input”)’”);
//contoh sebuah dynamic execute sql string statement dalam C#
SqlCommand cmd = new SqlCommand(“SELECT * FROM table WHERE field = ’” + Request.getParameter(“input”) + “’”, oConn);
//contoh sebuah dynamic execute sql string statement dalam VB
Dim sqlCmd As SqlCommand(“SELECT * FROM table WHERE field = ‘” + Request.QueryString(“input”) + “’”, oConn)
Beberapa developer percaya, jika mereka tidak membuat dan mengeksekusi sebuah dynamic SQL statement dan hanya melempar data ke store procedure sebagai parameter, kode mereka tidak akan memiliki celah. Namun, statement ini tidak benar, store procedure sendiri masih memiliki celah untuk di inject. Contohnya :
-- contoh store procedure yang memiliki celah di SQL
CREATE PROC SP_StoreProcedure @input varchar(400)
AS
DECLARE @sqlCmd nvarchar(400)
SELECT @sqlCmd = field FROM table WHERE field = @input
SELECT @sqlCmd AS Hasil
GO
EXEC SP_StoreProcedure ‘input’
0 Response to "SQL injection part 2 & Incorrectly Handled EscapeCharacters"
Post a Comment