SQL सर्वर इंजेक्शन - 26 वर्णों में कितना नुकसान?


21

मैं SQL सर्वर डेटाबेस पर इंजेक्शन हमलों के खिलाफ लचीलापन के लिए परीक्षण कर रहा हूँ।

Db में सभी टेबल के नाम लोअर केस हैं, और कोलाज केस-सेंसिटिव है, लैटिन 1_जनरल_सीएस_एएस

मैं जिस स्ट्रिंग में भेज सकता हूं वह अपरकेस के लिए मजबूर है, और लंबाई में अधिकतम 26 वर्ण हो सकते हैं। इसलिए मैं DROP टेबल में नहीं भेज सकता क्योंकि टेबल का नाम अपरकेस में होगा और इस तरह कॉलेशन के कारण स्टेटमेंट फेल हो जाएगा।

इसलिए - मैं 26 पात्रों में अधिकतम नुकसान क्या कर सकता हूं?

संपादित करें

मैं सभी प्रश्नों के बारे में जानता हूं और इसके आगे - आइए कल्पना करें कि जिस व्यक्ति ने फ्रंट एंड विकसित किया है, जो इस मामले में परमर्स का उपयोग नहीं करने के लिए क्वेरी बनाता है।

मैं कुछ भी नापाक करने की कोशिश नहीं कर रहा हूं, यह एक ही संगठन में किसी और द्वारा बनाई गई प्रणाली है।


1
क्या हम कल्पना कर रहे हैं या आप वास्तव में कलम परीक्षण कर रहे हैं और ऐसी आवश्यकताएं हैं जो आपको इंजेक्शन से बचने के लिए बाधित करती हैं? क्या आप उसकी सुरक्षा की कमी को दूर करने के लिए कोई रास्ता ढूंढ रहे हैं?
लोवल्डबा

41
यह एक विकल्प भी क्यों है कि दरवाजा खुला छोड़ दिया जाना है? ऐसा लगता है कि आपने पहले से ही इस पर विचार करने में अधिक समय बिताया है, क्योंकि इससे दरवाजा बंद करने में खर्च होगा। मैं इसे एक बेकार अभ्यास के रूप में समझता हूं - यदि आप 10 कमजोरियों के साथ आते हैं, तो वे कहेंगे, हम उन 10 कमजोरियों को प्लग करेंगे, और निश्चित रूप से 11 वीं नहीं होगी। यह वह जगह है जहां "सफाई" तार हमें मिला। / facepalm
हारून बर्ट्रेंड

5
यह पूरी तरह से अस्पष्ट और मनमाना सवाल है, और यह सैद्धांतिक रूप से भी संबोधित नहीं किया जा सकता है। SQL इंजेक्शन (अनुमतियाँ, सैंडबॉक्स, फ़ायरवॉल आदि) की अन्य देशी शमन सुविधाएँ, और इस प्रश्न का उत्तर देने के लिए आपको उन सभी चीज़ों का हिसाब देना होगा।
इवान कैरोल

2
26 वर्ण सीमा को लागू करने के लिए क्या है? आवेदन पत्र?
जोनाथन फाइट

7
इसे रोक। यह काम ना करें। यदि पैरामीटरकृत क्वेरीज़ दूरस्थ रूप से एक विकल्प हैं, तो उनका उपयोग करें । अगर कोई और नहीं जानता कि उनका उपयोग कैसे किया जाए, तो एक अच्छा संसाधन खोजें और उसे पढ़ें। यदि वे नहीं सुनते हैं, तो एक प्रबंधक या पर्यवेक्षक को सूचित करें कि वे महत्वपूर्ण सुरक्षा कमजोरियां पैदा कर रहे हैं (एक nondestructive डेमो को नुकसान नहीं होगा।) और शिक्षित होने से इनकार करते हैं।
jpmc26

जवाबों:


38

आसान:

GRANT EXECUTE TO LowlyDBA

या, मुझे लगता है कि इस मामले में यह होगा

grant execute to lowlydba 

इस पर अपनी विविधताएं चुनें।

सभी संभावना में आप अपने मौजूदा सिस्टम के खिलाफ अब यह परीक्षण करने में सक्षम हो सकते हैं, लेकिन समय के साथ डेटाबेस में किसी भी छोटे परिवर्तन से आपके परीक्षण को अमान्य किया जा सकता है। चरित्र स्ट्रिंग बदल सकता है, कोई कम केस संग्रहीत प्रक्रिया बना सकता है जिसमें विनाशकारी क्षमता है - कुछ भी। आप कभी भी 100% विश्वास के साथ नहीं कह सकते हैं कि कोई विध्वंसक 26 वर्णों का हमला नहीं है जिसका कोई निर्माण कर सकता है।

मेरा सुझाव है कि आप डेवलपर को मूल उद्योग मानक सर्वोत्तम सुरक्षा प्रथाओं का पालन करने का एक तरीका खोज सकते हैं , यदि केवल आपके स्वयं के लिए ही, जैसा कि मैं जानता हूं कि कम से कम आंशिक रूप से जिम्मेदार सुरक्षा उल्लंघनों का होना चाहिए।

संपादित करें:

और दुर्भावना / मज़े के लिए, आप प्रत्येक ट्रेस ध्वज को सक्षम करने का प्रयास कर सकते हैं । यह देखना दिलचस्प होगा। ऐसा लगता है कि एक ब्लॉग पोस्ट ब्रेंट ओजर बना देगा ...

DBCC TRACEON(xxxx, -1)

1
ट्रेस ध्वज को सक्षम करने के अलावा: विभिन्न यादृच्छिक सेटिंग बदलकर: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercube y वे सभी केवल आपके अपने सत्र को प्रभावित करेंगे।
मार्टिन स्मिथ

2
@MartinSmith thnx यदि SETकेवल सत्र सेटिंग्स को प्रभावित करता है, तो सैटैब और सर्वर सेटिंग्स कैसे बदली जाती हैं ( ALTER DATABASE ...;?) DROP DATABASE ..;तब अधिक नुकसान पहुंचाता है, अगर यह सफल हुआ;)
ypercubeᵀᴹ

1
ऑल्टर डेटाबेस और sp_configure ज्यादातर DB और सर्वर स्तर सेटिंग्स के लिए। यद्यपि आप इन के साथ 26 वर्ण सीमा को मार सकते हैं। इसके अलावा डेटाबेस स्तर पर इन विशिष्ट सेटिंग्स का उपयोग केवल तभी किया जाता है जब क्लाइंट कनेक्शन उन्हें सेट नहीं करता है। और डिफ़ॉल्ट रूप से सबसे या सभी करते हैं।
मार्टिन स्मिथ

7
मैं उस टिप्पणी से मिलता-जुलता हूं।
ब्रेंट ओजर

22

SHUTDOWNआदेश या KILLहालांकि खाता आवेदन प्रश्नों को क्रियान्वित उम्मीद है कि इन चलाने के लिए पर्याप्त अनुमति नहीं है कमान (50 से अधिक एक यादृच्छिक संख्या लेने) दोनों 26 वर्ण तुलना में काफी कम लेते हैं,।


आमतौर पर खाते को ड्रॉप टेबल की जरूरत नहीं होती ...
ग्रेग

3
@ जी हां। यद्यपि आप एक ऐसे वातावरण को सुरक्षित कर सकते हैं जो SQL इंजेक्शन की अनुमति देने पर विचार कर रहा है, जब तक कि लंबाई कम न हो, सुरक्षा सर्वोत्तम प्रथाओं का पालन नहीं कर रहा है और खातों को न्यूनतम अनुमतियों के साथ अच्छी तरह से कॉन्फ़िगर नहीं किया जा सकता है।
मार्टिन स्मिथ

14

आप एक तालिका बना सकते हैं जिसे आप तब तक भरते हैं जब तक कि समय या डिस्क स्थान समाप्त नहीं हो जाता है जो भी पहले आता है।

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 खैर, फिर आपको किसी ऐसी चीज की आवश्यकता होगी जो मुझे एक से अधिक बार कमजोरी का फायदा उठाने से रोकती है।
मिकेल एरिकसन

1
tarnations ... while 1=1 insert t values('')30 है ... create table x(i int)=> while 1=1 insert t select 027 है
वर्नरसीडी

1
क्या आप इसका उपयोग वर्ण सीमा की तुलना में लंबी कमांड बनाने के लिए कर सकते हैं, और फिर उस पर अमल कर सकते हैं?
Lawtonfogle

1
@MartinSmith मुझे लगा कि मैं बस ऐसे ही छोड़ दूंगा लेकिन अब मुझे बस इसे आजमाना है :)। आपको बताएंगे कि क्या मैं इसका पता लगाता हूं।
मिकेल एरिकसन

7
@WernerCD x:insert t select 0 GOTO xवास्तव में 26 है।
मार्टिन स्मिथ

4

क्षति की आपकी परिभाषा के आधार पर, आप इसे चला सकते हैं: WAITFOR DELAY '23: 59 'वास्तव में बुराई होने के लिए, आप 32,768 ग्राहकों से चलाने के लिए लोड-परीक्षण उपकरण का उपयोग कर सकते हैं।



1
यदि स्ट्रिंग को एड-हॉक बैच में इंजेक्ट किया जाता है, जो ताले रखता है, तो यह थ्रेड भुखमरी का कारण बनने के लिए एक कॉल के रूप में सेवा का व्यवहार्य इनकार प्रदान कर सकता है।
डेविड स्पिललेट

3

@ MikaelEriksson के उत्तर और @ मार्टिनस्मिथ के मेरे प्रारंभिक टिप्पणी के उत्तर पर आधारित विविधता:

declare @S char(26);

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

शुरू में मैंने एक WHILE स्टेटमेंट करने की कोशिश की थी, लेकिन सबसे अच्छा मैं कर सकता था 27 कैरेक्टर:

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

लेकिन मार्टिन ने बताया कि GOTO:

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

गोटो ... 26 अक्षरों में एक अनंत-लूप डालने वाले बयान के सभी बुराई और निर्माता की जड़।

इसके साथ ही कहा ... यह int के बजाय CHAR (99) के साथ रहना फायदेमंद हो सकता है क्योंकि यह अधिक स्थान का उपयोग करेगा। अन्य विकल्प या तो लंबे नामों का उपयोग करते हैं और 26 वर्ण सीमा को तोड़ देंगे ... या प्रति पंक्ति कम संग्रहण स्थान का उपयोग करेंगे।

पूर्ण परीक्षण कोड:

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';अपने इंजेक्शन हमले के भविष्य की अनुकूलता के लिए;)
ypercube

@ ypercube y आपने दो ;एस जोड़े ... दूसरा एक ठीक है - एक जगह की जगह है और यदि आवश्यक नहीं है तो कार्यात्मक है। पहले वाला क्वेरी तोड़ता है - INSERT स्टेटमेंट को SELECT स्टेटमेंट से अलग करता है।
वर्नरसीडी

आह येस। ऐसा तब होता है जब कोई विभाजक का उपयोग नहीं करता है! हमें नहीं पता कि प्रत्येक प्रश्न कहाँ समाप्त होता है और अगला कब शुरू होता है!
ypercube y

1
@WarnerCD मुझे पता है। यह SQL सर्वर में मूल्यह्रास प्रक्रिया पर अधिक मज़ाक था। यह हमेशा के लिए लगता है। फिर भी, बयानों के बीच अर्धविराम का उपयोग करना अच्छा है और न केवल जहां यह आवश्यक है।
ypercube y

2
@ मुझे संदेह है कि इसे कभी लागू किया जाएगा। संभवतः विरासत कोड का एक टन है जो ऐसा करने के लिए कोई विशेष व्यावसायिक मूल्य के साथ लापता अर्ध कॉलोनों की आवश्यकता होगी। और यह मुश्किल या अद्यतन करने के लिए संभव नहीं अनुप्रयोगों में एम्बेडेड हो सकता है।
मार्टिन स्मिथ

0
XP_CMDSHELL 'SHUTDOWN -PF'

इस बात पर निर्भर करता है कि आप कितना नुकसानदायक मानते हैं। :-)

इसके लिए सर्वर पर xp_cmdshell को सक्षम करने की आवश्यकता होती है, ऐसा कुछ जो SQL सर्वर के पिछले कुछ संस्करण के मामले में नहीं है। इसके लिए यह भी आवश्यक है कि सेवा खाते के पास शटडाउन अधिकार हो, जो उसके पास हो या न हो।

Xp_cmdshell को सक्षम करना संभवतः आपकी 26 वर्ण सीमा के बाहर जाता है। क्या आप कई इंजेक्शन लगाने की अनुमति देंगे?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXEC केवल वैकल्पिक है अगर यह बैच में पहला बयान है। यहाँ शायद ऐसा नहीं होगा।
मार्टिन स्मिथ

@ मर्टिन स्मिथ, अच्छी टिप्पणी। EXEC प्रत्येक प्रक्रिया कॉल लाइन में 5 वर्ण जोड़ता है, जो 26 वर्णों में से अधिकांश को धकेलता है। मुझे आश्चर्य है कि अगर सृजन यहाँ मदद करेगा?
ग्रीनस्टोन वाकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.