Injeksi SQL Server - berapa banyak kerusakan dalam 26 karakter?

21

Saya sedang menguji ketahanan terhadap serangan injeksi pada database SQL Server.

Semua nama tabel dalam db adalah huruf kecil, dan susunannya adalah case-sensitive, Latin1_General_CS_AS .

String yang dapat saya kirim dipaksa untuk huruf besar, dan panjangnya bisa maksimum 26 karakter. Jadi saya tidak dapat mengirim DROP TABLE karena nama tabel akan menjadi huruf besar dan dengan demikian pernyataan akan gagal karena pemeriksaan.

Jadi - apa kerusakan maksimum yang bisa saya lakukan dalam 26 karakter?

EDIT

Saya tahu semua tentang kueri parameterised dan sebagainya - mari kita bayangkan bahwa orang yang mengembangkan front end yang membangun kueri untuk dikirim tidak menggunakan params dalam kasus ini.

Saya juga tidak mencoba melakukan sesuatu yang jahat, ini adalah sistem yang dibangun oleh orang lain di organisasi yang sama.

Alan B
sumber
1
Apakah kita membayangkan atau apakah Anda benar-benar pengujian pena dan memiliki persyaratan yang melarang Anda untuk menghindari injeksi? Apakah Anda mencari cara untuk merusak keamanannya?
LowlyDBA
41
Mengapa ini bahkan merupakan pilihan agar pintu dibiarkan terbuka? Sepertinya Anda sudah menghabiskan lebih banyak waktu untuk merenungkan hal ini daripada menutup pintu. Saya merasakan ini sebagai latihan yang sia-sia - jika Anda menemukan 10 kerentanan, mereka akan berkata, kami akan pasang 10 kerentanan itu, dan tentu saja tidak akan ada yang ke-11. Di sinilah string "pembersihan" membuat kita. / facepalm
Aaron Bertrand
5
Ini adalah pertanyaan yang samar-samar dan arbitrer, dan itu bahkan tidak bisa diatasi secara teoritis. Ada fitur lain yang meringankan asli SQL Injection (izin, kotak pasir, firewall dll), dan Anda harus memperhitungkan semua hal itu untuk menjawab pertanyaan ini.
Evan Carroll
2
Apa yang menegakkan batas 26 karakter? Aplikasi?
Jonathan Fite
7
Hentikan. Hentikan saja. Jika kueri yang diparameterisasi merupakan opsi dari jarak jauh , gunakan itu . Jika orang lain tidak tahu cara menggunakannya, cari sumber yang layak dan minta mereka membacanya. Jika mereka tidak mendengarkan, beri tahu manajer atau penyelia bahwa mereka menghasilkan kerentanan keamanan yang kritis (Demo yang tidak merusak tidak akan merugikan.) Dan menolak untuk dididik.
jpmc26

Jawaban:

38

Mudah:

GRANT EXECUTE TO LowlyDBA

Atau, saya kira dalam hal ini akan

grant execute to lowlydba 

Pilih variasi Anda untuk ini.

Kemungkinan Anda dapat menguji ini sekarang terhadap sistem Anda saat ini, tetapi sejumlah perubahan kecil dalam database dari waktu ke waktu dapat membatalkan pengujian Anda. String karakter dapat berubah, seseorang dapat membuat prosedur tersimpan dengan huruf kecil yang memiliki potensi destruktif - apa pun. Anda tidak dapat mengatakan dengan keyakinan 100% bahwa tidak ada serangan 26 karakter destruktif yang bisa dibangun seseorang.

Saya sarankan Anda menemukan cara untuk membuat pengembang mengikuti praktik keamanan terbaik standar industri dasar , jika hanya untuk kepentingan Anda sendiri sebagai seseorang yang saya anggap setidaknya sebagian bertanggung jawab jika pelanggaran keamanan terjadi.

Edit:

Dan untuk kejahatan / kesenangan, Anda dapat mencoba mengaktifkan setiap bendera jejak. Ini akan menarik untuk diamati. Rasanya seperti posting blog Brent Ozar akan membuat ...

DBCC TRACEON(xxxx, -1)
LowlyDBA
sumber
1
Selain memungkinkan jejak bendera: mengubah berbagai pengaturan acak: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ mereka semua hanya akan memengaruhi sesi Anda sendiri.
Martin Smith
2
@MartinSmith thnx. Jika SEThanya memengaruhi pengaturan sesi, bagaimana pengaturan satabase dan server diubah ( ALTER DATABASE ...;?) DROP DATABASE ..;Akan menimbulkan lebih banyak kerusakan jika, jika berhasil;)
ypercubeᵀᴹ
1
Ubah database dan sp_configure sebagian besar untuk pengaturan tingkat DB dan Server. Meskipun Anda mungkin mencapai batas 26 karakter dengan ini. Juga pengaturan khusus ini di tingkat basis data hanya digunakan jika koneksi klien tidak mengaturnya. Dan secara default kebanyakan atau semua lakukan.
Martin Smith
7
Saya mirip dengan ucapan itu.
Brent Ozar
22

The SHUTDOWNperintah atau KILLCommand (memilih nomor acak lebih dari 50) keduanya mengambil secara signifikan kurang dari 26 karakter, meskipun account mengeksekusi query aplikasi mudah-mudahan tidak memiliki izin yang memadai untuk menjalankan ini.

Martin Smith
sumber
Biasanya akun tidak perlu drop table juga ...
Greg
3
@ Ya, ya. Meskipun Anda dapat menduga suatu lingkungan yang mempertimbangkan untuk mengizinkan injeksi SQL selama panjangnya pendek tidak mengikuti praktik terbaik keamanan dan akun mungkin tidak dikonfigurasi dengan izin minimal.
Martin Smith
14

Anda bisa membuat tabel yang kemudian Anda isi sampai akhir waktu atau ruang disk habis mana yang lebih dulu.

declare @S char(26);

set @S = 'create table t(c char(99))';
exec (@S);

set @S = 'insert t values('''')'
exec (@S);

set @S = 'insert t select c from t'
exec (@S);
exec (@S);
exec (@S);
exec (@S);
-- etc
Mikael Eriksson
sumber
19
@AlanB Nah, maka Anda akan membutuhkan sesuatu yang mencegah saya mengeksploitasi kelemahan lebih dari sekali.
Mikael Eriksson
1
tarnations ... while 1=1 insert t values('')is 30 ... create table x(i int)=> while 1=1 insert t select 0is 27
WernerCD
1
Bisakah Anda menggunakan ini untuk membangun perintah yang lebih panjang dari batas karakter, dan kemudian jalankan itu?
Lawtonfogle
1
@ MartinSmith Saya pikir saya hanya akan pergi seperti ini tetapi sekarang saya harus mencobanya :). Akan memberi tahu Anda jika saya mengetahuinya.
Mikael Eriksson
7
@WernerCD x:insert t select 0 GOTO xpersis 26 meskipun.
Martin Smith
4

Bergantung pada definisi kerusakan Anda, Anda dapat menjalankan ini: WAITFOR DELAY '23: 59 'Agar benar-benar jahat, Anda dapat menggunakan alat pengujian beban untuk menjalankannya dari 32.768 klien.

pengguna143642
sumber
1
Jika string diinjeksikan ke batch ad-hoc saya yang memegang kunci, itu dapat memberikan penolakan layanan yang layak sebagai panggilan tunggal tanpa harus menyebabkan kelaparan thread.
David Spillett
3

Variasi berdasarkan jawaban @ MikaelEriksson dan @ MartinSmith membalas komentar awal saya:

declare @S char(26);

set @S = 'create table x(i int)';
exec (@S);

Awalnya saya sudah mencoba membuat pernyataan WHILE, tetapi yang terbaik yang bisa saya lakukan adalah 27 karakter:

set @S = 'while 1=1 insert t select 0'; -- fails at 27 characters
exec (@S);

Tetapi Martin menunjukkan GOTO:

set @S = 'x:insert t select 0 GOTO x';
exec (@S);

GOTO ... akar semua kejahatan dan pembuat pernyataan penyisipan infinite-loop dalam 26 karakter.

Dengan mengatakan itu ... mungkin menguntungkan untuk tetap menggunakan CHAR (99) daripada int karena itu akan menggunakan lebih banyak ruang. Pilihan lain menggunakan nama yang lebih panjang dan akan menghancurkan batas 26 karakter ... atau menggunakan lebih sedikit ruang penyimpanan per baris.

Kode Uji Lengkap:

declare @S char(26);
set @S = 'drop table t;';
exec (@S);
GO

declare @S char(26);

set @S = 'create table t(c CHAR(99))';
exec (@S);

set @S = 'x:insert t select 0 GOTO x';
exec (@S);
GO
WernerCD
sumber
1
set @S = 'x:insert t;select 0;GOTO x';untuk kompatibilitas serangan injeksi Anda di masa depan;)
ypercubeᵀᴹ
@ ypercubeᵀᴹ Anda menambahkan dua ;s ... yang kedua baik-baik saja - menggantikan spasi dan berfungsi jika tidak diperlukan. Yang pertama memecah kueri - memisahkan pernyataan INSERT dari pernyataan SELECT.
WernerCD
Ah iya. Itulah yang terjadi ketika seseorang tidak menggunakan pemisah! Kami tidak tahu di mana setiap permintaan berakhir dan kapan permintaan berikutnya dimulai!
ypercubeᵀᴹ
1
@ David CD saya tahu. Itu lebih merupakan lelucon tentang prosedur depresiasi di SQL Server. Tampaknya untuk selamanya. Namun, praktik yang baik untuk menggunakan titik koma di antara pernyataan dan tidak hanya di mana diperlukan.
ypercubeᵀᴹ
2
@ lebih baik saya ragu bahwa itu akan pernah ditegakkan. Mungkin ada satu ton kode warisan yang perlu ditambah titik koma ditambah tanpa nilai bisnis tertentu untuk melakukannya. Dan itu mungkin tertanam dalam aplikasi yang sulit atau tidak mungkin untuk diperbarui.
Martin Smith
0
XP_CMDSHELL 'SHUTDOWN -PF'

Bergantung pada seberapa merusaknya Anda anggap sebagai power-down. :-)

Ini membutuhkan xp_cmdshell untuk diaktifkan di server, sesuatu yang tidak berlaku untuk beberapa versi terakhir dari SQL Server. Ini juga mensyaratkan bahwa akun layanan memiliki hak mematikan, yang mungkin atau mungkin tidak dimiliki.

Mengaktifkan xp_cmdshell mungkin melampaui batas 26 karakter Anda. Apakah Anda mengizinkan beberapa suntikan?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE
Greenstone Walker
sumber
1
EXEC hanya opsional jika ini adalah pernyataan pertama dalam kumpulan. Yang mungkin tidak akan terjadi di sini.
Martin Smith
@ Martin Smith, komentar yang bagus. EXEC menambahkan 5 karakter untuk setiap saluran panggilan prosedur, yang mendorong sebagian besar dari mereka lebih dari 26 karakter. Saya ingin tahu apakah BUAT ALIAS akan membantu di sini?
Greenstone Walker