.:. SQL INJECTION .:.

adalah kelemahan yang terjadi ketika hacker mampu mengubah Structured Query Language (SQL) di dalam database dan merupakan salah satu kelemahan keamanan yang sangat mempengaruhi serta dapat membongkar semua informasi sensitif yang tersimpan dalam sebuah aplikasi database termasuk informasi yang berguna, seperti username, password, nama, alamat, nomor telepon dan rincian kartu kredit. Dengan mempengaruhi database, hacker dapat memanfaatkan sintax, kemampuan, kekuatan dan fleksibilitas dari SQL yang mendukung fungsi database dan fungsi sistem operasi yang hanya dilakukan dalam database.

MEKANISME SQL Injection

CARA KERJA SQL INJECTION :

SQL Injection bekerja dengan memasukkan atau menambahkan kode SQL ke dalam aplikasi atau user input parameter lalu diteruskan ke Back-end SQL Server untuk parsing dan eksekusi. Setiap prosedur yang membangun pernyataan SQL berpotensi untuk mudah diserang dengan bentuk injeksi utama SQL yang terdiri dari penyisipan langsung kode ke dalam parameter yang digabungkan dengan perintah SQL untuk dieksekusi. Serangan langsung dilakukan dengan menyuntikan kode ke dalam string yang ditujukan ke penyimpanan di dalam tabel atau sebagai metadata.

String yang tersimpan akhirnya digabungkan ke dalam perintah SQL dinamis untuk dieksekusi. Jika aplikasi web gagal untuk membersihkan paramater dengan benar maka akan dilewatkan ke pernyataan SQL yang dibuat secara dinamis sehingga memungkinkan untuk seorang penyerang dapat mengubah konstruksi SQL Back-end.

Ketika hacker dapat memodifikasi pernyataan SQL, maka akan dieksekusi dengan hak yang sama dengan aplikasi pengguna disaat menggunakan SQL Server untuk mengeksekusi perintah yang berinteraksi dengan sistem operasi maka proses akan berjalan dengan hak akses yang sama dengan komponen yang mengeksekusi perintah, misalnya Database Server, aplikasi server atau web server.





SQL INJECTION STEPS :

Mencari Celah Keamanan


  • Ancaman SQL Injection dilakukan pada URL yang mempunyai ID. Mekanisme ancaman dilakukan sebagai berikut : http://www.target.com/index.php?pageID=1&#8242.
  • Tambahkan tanda petik satu () di akhir id, sehingga menjadi : http://www.target.com/index.php?pageID=1&#8242 maka akan tampil pesan kesalahan seperti "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right..." yang menandakan website mempunyai potensi celah keamanan SQL Injection.
  • Tanda petik satu () pada akhir id digunakan untuk mengecek apakah variabel id di-filter atau tidak. Apabila variabel tersebut tidak di-filter, maka akan menampilkan pesan kesalahan yang menyatakan kesalahan pada SQL Query.
Menentukan jumlah kolom

Penentuan jumlah kolom perlu dilakukan untuk mengetahui kolom mana dari sebuah tabel yang bisa dimanfaatkan. Hal ini bertujuan agar dapat memasukkan perintah SQL Injection pada lokasi yang tepat. Sebab jika dimasukkan di tempat yang salah maka tidak akan memperoleh apapun. Untuk melakukan hal bersifat “trial and error” dimana perintah yang digunakan adalah ORDER BY. 


Mencari kolom yang vunerable

Selanjutnya adalah mencari kolom yang memiliki celah untuk dilakukan SQL Injection atau angka error.


Menentukan nama database

Pada dasarnya ini bukanlah sesuatu yang penting tapi akan lebih baik agar bisa dimanfaatkan untuk kepentingan lain.



METODE PENCEGAHAN SQL INJECTION : 

Salah satu metode pencegahan SQL Injection, yaitu Memvalidasi SQL Query menggunakan Regex dengan String Matching dengan 3 strategi Regex yang akan digunakan, yaitu :
  1. Regular Expression untuk identifikasi text blocks.
  2. Regular Expression untuk identifikasi statement breaks.
  3. Regular Expression untuk identifikasi SQL Statement.

Untuk Text Blocks dengan menghilangkan multi-row comment. Berikut adalah Pattern Regex untuk Text Blocks.

Pattern = ‘(‘’|[^’]*’
 

Selanjutnya adalah Regex untuk Statement Break. Pada tahap ini mengecek adanya semicolon (;) pada Query dengan membutuhkan ekspresi untuk
menemukan SQL Statements. Kata-kata yang perlu dicari dalam Query ini antara lain ALTER, CREATE, DELETE, DROP, EXEC, EXECUTE, INSERT, INSERT INTO, MERGE, SELECT, UPDATE, UNION atau UNIAL ALL.
 

Sehingga Pattern yang kita butuhkan sebagai berikut :

\b(ALTER|CREATE|DELETE|DROP|EXEC(UTE){
0,1}|INSERT(
+INTO){0,1}|MERGE|SELECT|UPDATE|UNION(
+ALL){0,1})\b


Selanjutnya membuat Algoritma untuk Validator-nya dengan membuat Kelas
StatementTypes yang atributnya berupa Statement dalam SQL. Berikut adalah Kelas StatementTypes.


Public Enum StatementTypes
None = 0
Procedure = 0
Alter = 1
Create = 2
Delete = 4
Drop = 8
Execute = 16
Insert = 32
[Select] = 64
Update = 128
Union = 256
Batch = 512
Merge = 1024 Or Delete Or Insert Or
[Select] Or Update
End Enum


Kemudian Berikut adalah algoritama untuk Validator yang akan menggunakan Kelas StatementTypes juga.

Public Class CommandTextValidator
Public Shared Sub
ValidateStatement(ByVal commandText As
String, ByVal authorizedStatements As
StatementTypes)
'Construct Regular Expression To
Find Text Blocks, Statement Breaks &
SQL Statement Headers
Dim regExText As String =
"('(''|[^'])*')|(;)|(\b(ALTER|CREATE|D
ELETE|DROP|EXEC(UTE){0,1}|INSERT( +INT
O){0,1}|MERGE|SELECT|UPDATE|UNION( +AL
L){0,1})\b)"
'Remove Authorized Options
If (authorizedStatements And
StatementTypes.Batch) =
StatementTypes.Batch Then regExText =
regExText.Replace("(;)", String.Empty)
If (authorizedStatements And
StatementTypes.Alter) =
StatementTypes.Alter Then regExText =
regExText.Replace("ALTER",
String.Empty)
If (authorizedStatements And
StatementTypes.Create) =


StatementTypes.Create Then regExText =
regExText.Replace("CREATE",
String.Empty)
If (authorizedStatements And
StatementTypes.Delete) =
StatementTypes.Delete Then regExText =
regExText.Replace("DELETE",
String.Empty)
If (authorizedStatements And
StatementTypes.Delete) =
StatementTypes.Delete Then regExText =
regExText.Replace("DELETETREE",
String.Empty)
If (authorizedStatements And
StatementTypes.Drop) =
StatementTypes.Drop Then regExText =
regExText.Replace("DROP",
String.Empty)
If (authorizedStatements And
StatementTypes.Execute) =
StatementTypes.Execute Then regExText
= regExText.Replace("EXEC(UTE){0,1}",
String.Empty)
If (authorizedStatements And
StatementTypes.Insert) =
StatementTypes.Insert Then regExText =
regExText.Replace("INSERT( +INTO){0,1}
", String.Empty)
If (authorizedStatements And
StatementTypes.Merge) =
StatementTypes.Merge Then regExText =
regExText.Replace("MERGE",
String.Empty)
If (authorizedStatements And
StatementTypes.Select) =
StatementTypes.Select Then regExText =
regExText.Replace("SELECT",
String.Empty)
If (authorizedStatements And
StatementTypes.Union) =
StatementTypes.Union Then regExText =
regExText.Replace("UNION",
String.Empty)
If (authorizedStatements And
StatementTypes.Update) =
StatementTypes.Update Then regExText =
regExText.Replace("UPDATE",
String.Empty) 


'Remove extra separators

Dim regExOptions As RegexOptions =
regExOptions.IgnoreCase Or
regExOptions.Multiline
regExText = Regex.Replace(regExText,
"\(\|", "(", regExOptions)
regExText = Regex.Replace(regExText,
"\|{2,}", "|", regExOptions)
regExText = Regex.Replace(regExText,
"\|\)", ")", regExOptions)


'Check for errors

Dim patternMatchList As
MatchCollection =
Regex.Matches(testText, regExText,
regExOptions)
For patternIndex As Integer =
patternMatchList.Count - 1 To 0 Step -
1


Dim value As String =
patternMatchList.Item(patternIndex).Va
lue.Trim
If
String.IsNullOrWhiteSpace(value) Then
'Continue - Not an error.
ElseIf value.StartsWith("'")
AndAlso value.EndsWith("'") Then
'Continue - Text Block
ElseIf value.Trim = ";" Then
Throw New
System.UnauthorizedAccessException("Ba
tch statements not authorized:" &
vbCrLf & commandText)
Else
Throw New
System.UnauthorizedAccessException(val
ue.Substring(0, 1).ToUpper &
value.Substring(1).ToLower & "
statements not authorized:" & vbCrLf &
commandText)
End If
Next
End Sub
End Class


Penggunaan String Matching dengan Regex mampu mencegah SQL Injection untuk masuk ke dalam sistem aplikasi yang berhubungan dengan SQL Database, namun dengan adanya validasi tetap akan muncul masalah baru dimana setiap query harus divalidasi sehingga tentunya akan menambah waktu proses dalam mengirim perintah sehingga perlu adanya algoritma yang mangkus untuk validator ini.

Comments