आक्रमण वास्तव में क्या करता है
इस हमले के बारे में एक सूक्ष्म लेकिन चतुर विवरण है जो अन्य उत्तरदाताओं से चूक गया। त्रुटि संदेश पर ध्यान दें Duplicate entry ':sjw:1:ukt:1' for key 'group_key'
के लिए . स्ट्रिंग :sjw:1:ukt:1
वास्तव में आपके MySQL सर्वर द्वारा मूल्यांकन की गई अभिव्यक्ति का परिणाम है। यदि आपका एप्लिकेशन MySQL त्रुटि स्ट्रिंग को ब्राउज़र में वापस भेजता है, तो त्रुटि संदेश डेटा लीक कर सकता है आपके डेटाबेस से।
इस तरह के हमले का उपयोग उन मामलों में किया जाता है जहां क्वेरी परिणाम अन्यथा ब्राउज़र (अंधा एसक्यूएल इंजेक्शन) पर वापस नहीं भेजा जाता है, या जब शास्त्रीय यूनियन चयन हमले को खींचने के लिए जटिल होता है। यह INSERT/UPDATE/DELETE प्रश्नों में भी काम करता है।
जैसा कि हैविली नोट करता है, मूल विशेष क्वेरी को किसी भी जानकारी को लीक नहीं करना चाहिए था, यह सिर्फ यह देखने के लिए एक परीक्षण था कि आपका आवेदन इस तरह के इंजेक्शन के लिए कमजोर है या नहीं।
हमला नहीं एमवीजी के सुझाव की तरह विफल, इस त्रुटि का कारण क्वेरी का उद्देश्य है।
इसका उपयोग कैसे किया जा सकता है इसका एक बेहतर उदाहरण:
> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
> 0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'
त्रुटि क्यों उठाई जाती है
MySQL में क्वेरी इस त्रुटि का कारण क्यों बनती है यह मेरे लिए कुछ हद तक एक रहस्य है। यह एक MySQL बग की तरह दिखता है, क्योंकि GROUP BY को डुप्लिकेट प्रविष्टियों को एकत्रित करके डील करना है। Hawili की क्वेरी का सरलीकरण, वास्तव में, त्रुटि का कारण नहीं बनता है!
व्यंजक FLOOR(RAND(0)*2)
यादृच्छिक बीज तर्क 0 के आधार पर क्रम में निम्नलिखित परिणाम देता है:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
...
चूंकि तीसरा मान दूसरे का डुप्लिकेट है, इसलिए यह त्रुटि फेंक दी जाती है। कम से कम 3 पंक्तियों वाली किसी भी FROM तालिका का उपयोग किया जा सकता है, लेकिन info_schema.tables एक सामान्य है। MySQL में त्रुटि को भड़काने के लिए COUNT(*) और GROUP BY भाग आवश्यक हैं:
> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'
यह त्रुटि PostgreSQL-समतुल्य क्वेरी में नहीं होती है:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
count | x
-------+---
83 | 0
90 | 1
(1 साल देर से उत्तर देने के लिए क्षमा करें, लेकिन मैं आज इस पर ठोकर खाई। यह प्रश्न मेरे लिए दिलचस्प है क्योंकि मुझे पता नहीं था कि MySQL से त्रुटि संदेशों के माध्यम से डेटा लीक करने के तरीके हैं)