क्या स्ट्रिंग में एक भी उद्धरण का उपयोग किए बिना स्ट्रिंग से बाहर निकलने और एसक्यूएल को इंजेक्ट करने का कोई तरीका है?


12

मैं एक oracle based एप्लिकेशन का परीक्षण कर रहा हूं और मुझे निम्नलिखित कोड मिला है:

प्रश्न = "कर्मचारियों से नाम का चयन करें जहां आईडी = '" + पीकेआईडी + ";"

यानी क्वेरी स्ट्रिंग में PKID मान के आसपास के उद्धरण हैं जो URL से सीधे प्राप्त किए जाते हैं।

जाहिर है, यह क्लासिक एसक्यूएल इंजेक्शन होने की प्रतीक्षा कर रहा है ... आवेदन को छोड़कर CA SiteMinder के पीछे है जो किसी भी URL को किसी भी रूप में (किसी भी रूप में) अनुप्रयोग से पारित होने से रोकता है।

क्या किसी एक उद्धरण का उपयोग किए बिना स्ट्रिंग से बाहर निकलने और एसक्यूएल को इंजेक्ट करने का कोई तरीका है?

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


1
क्या आपने बाइंड चर का उपयोग करने की कोशिश की है?
JHFB

@JHFB ने क्या कहा। बाइंडिंग चर मानक अभ्यास है।
फिल

जवाबों:


9

हां, पैरामीटर में उद्धरणों की आपूर्ति के बिना एक SQL इंजेक्शन हमला करना संभव है।

ऐसा करने का तरीका यह है कि संख्या और / या तारीखों को कैसे संसाधित किया जाता है। आप सत्र स्तर पर निर्दिष्ट कर सकते हैं कि किसी दिनांक या संख्या का प्रारूप क्या है। इस में फेरबदल करके आप किसी भी वर्ण के साथ इंजेक्शन लगा सकते हैं।

यूके और यूएस में डिफ़ॉल्ट रूप से, संख्याओं में हजारों विभाजक को इंगित करने के लिए एक कॉमा का उपयोग किया जाता है, और दशमलव बिंदु के लिए पूर्ण विराम। आप इन डिफ़ॉल्ट को निष्पादित करके बदल सकते हैं:

alter session set nls_numeric_characters = 'PZ';

इसका मतलब है कि "P" अब दशमलव बिंदु है और "Z" हजारों विभाजक है। इसलिए:

0P01

0.01 नंबर है। हालाँकि, यदि आप एक फ़ंक्शन P01 बनाते हैं, तो ऑब्जेक्ट संदर्भ नंबर रूपांतरण से पहले उठाया जाएगा। यह आपको डेटाबेस पर कार्य करने की अनुमति देता है, जो आपको बढ़ती हुई शक्तियाँ प्रदान करता है:

एक बुनियादी "आईडी द्वारा प्राप्त करें" फ़ंक्शन बनाएं:

create procedure get_obj ( i in number ) as
begin
  execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/

एक फ़ंक्शन P01 भी बनाएं जो कुछ अवांछनीय करता है (इस मामले में सिर्फ एक तालिका बना रहा है, लेकिन आपको यह विचार मिलता है):

create function p01 return number as
  pragma autonomous_transaction;
begin
  execute immediate 'create table t (x integer)';
  return 1;
end;
/

और हम जाने के लिए अच्छा कर रहे हैं:

alter session set nls_numeric_characters = 'PZ';

SELECT * FROM t;

SQL Error: ORA-00942: table or view does not exist

exec get_obj(p01);

anonymous block completed

SELECT * FROM t;

no rows selected

कहीं भी कोई उद्धरण नहीं है, लेकिन हम अभी भी "छिपे हुए" फ़ंक्शन P01 को निष्पादित करने और तालिका बनाने में कामयाब रहे हैं t!

हालांकि यह व्यवहार में करना मुश्किल हो सकता है (और कुछ आंतरिक ज्ञान / सहायता की आवश्यकता हो सकती है), इससे पता चलता है कि आप उद्धरण चिह्नों के बिना SQL को इंजेक्ट कर सकते हैं। अलर्ट nls_date_formatकरने से समान चीजों को करने की अनुमति मिल सकती है।

संख्याओं के लिए मूल निष्कर्ष डेविड लिचफील्ड द्वारा किए गए थे और आप यहां उनका पेपर पढ़ सकते हैं । आप टॉम काइट की चर्चा पा सकते हैं कि कैसे तारीखों का यहाँ शोषण किया जा सकता है ।


4

आप संभवतः उस डेटा प्रकार को अधिभारित कर सकते हैं जिसका आप उपयोग कर रहे हैं, जिससे वह कथन विफल हो जाता है। उसके बाद जो आता है वह संभावित रूप से चलाया जा सकता है।

हो सकता है कि इसे यूनिकोड बाइट सरणी के रूप में भेजने से यह ट्रिक हो जाए और आपको उस स्टेटमेंट से किसी दूसरे तक पहुंचा दिया जाए।

यदि कोई छेद खुला है, तो उसका दुरुपयोग किया जाएगा। और एक ही उद्धरण के साथ सभी तार को अवरुद्ध करना एक अच्छा विचार नहीं है क्योंकि अंतिम नाम "ओ ब्रायन" वाले लोग आपके ग्राहक (दूसरों के बीच) नहीं हो सकते हैं।


मुझे लगता है कि आप "छेद" का मतलब है और "पूरे" नहीं।
ypercube y

1

बाइंड चर का उपयोग करके देखें। आप इसे एक संख्या के रूप में घोषित कर सकते हैं और यह एक हानिकारक SQL इंजेक्शन को रोकना चाहिए।

ADDITION: बाइंड वैरिएबल भी प्रदर्शन और मापनीयता को बढ़ाते हैं क्योंकि क्वेरी प्लान को संकलित किया जाता है और पुनः उपयोग के लिए संग्रहीत किया जाता है। अपने तर्क को जोड़ने के लिए बस कुछ और। :)


1
वह इंजेक्शन को रोकने के तरीकों के बारे में नहीं पूछ रहा है बल्कि इसके दुरुपयोग के तरीकों के बारे में पूछ रहा है।
जेफ

1
@ जफ ओपी इस तरह के कोड का उपयोग नहीं करने के लिए कारण भी पूछता है। बाइंड वैरिएबल का उपयोग न करने से प्रदर्शन नष्ट हो जाता है इसलिए यह हमेशा उपयोग करने का एक अच्छा कारण है ।
विंसेंट मालाग्रेट

@ विंसेंट मल्ग्रेट: "बाइंड वेरिएबल्स का उपयोग न करना प्रदर्शन को नष्ट कर देता है" गलत है। यह सच है कि एक स्टेटमेंट को बाइंड वैरिएबल के उपयोग से बचा जा सकता है। यदि आप बाइंड चर का उपयोग नहीं करते हैं, तो भी साझा पूल बहुत सारे अनुकरणीय बयानों से भरा होगा। फिर भी यदि किसी व्यक्ति के शाब्दिक मूल्यों के बजाय बाइंड चर का उपयोग किया जाता है, तो योजना बनाने के लिए आशावादी को कम जानकारी होती है। ऐसी परिस्थितियां हैं जहां बाइंड चर (या शाब्दिक मूल्यों) के मूल्यों के आधार पर विभिन्न योजनाओं का चयन किया जाना चाहिए।
चमत्कार 173

@ चमत्कार 173 बेशक अपवाद होंगे, लेकिन ओपी द्वारा दिए गए प्राथमिक कुंजी के रूप में नहीं, कभी नहीं) के लिए
विन्सेन्ट मालाग्रेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.