सीधे सवाल का जवाब देने से पहले, यह ध्यान देने योग्य है कि भले ही एक हमलावर क्या कर सकता है पढ़ें वह डेटा जो उसे नहीं करना चाहिए, वह है आमतौर पर अभी भी वास्तव में बुरा है। उस पर विचार करें JOIN
. का उपयोग करके एस और SELECT
सिस्टम टेबल से आईएनजी (जैसे mysql.innodb_table_stats
), एक हमलावर जो SELECT
. से शुरू होता है इंजेक्शन और आपके डेटाबेस का कोई अन्य ज्ञान नहीं अपने स्कीमा को मैप कर सकते हैं और फिर MySQL में आपके पास मौजूद संपूर्ण डेटा को एक्सफ़िल्टर कर सकते हैं। अधिकांश डेटाबेस और एप्लिकेशन के लिए, जो पहले से एक भयावह सुरक्षा छेद का प्रतिनिधित्व करता है।
लेकिन सीधे सवाल का जवाब देने के लिए:कुछ तरीके हैं जिनसे मुझे पता है कि किस इंजेक्शन द्वारा एक MySQL SELECT
में डेटा को संशोधित करने के लिए इस्तेमाल किया जा सकता है। सौभाग्य से, उन सभी को यथोचित की आवश्यकता होती है असामान्य परिस्थितियां संभव हैं। नीचे दिए गए सभी उदाहरण इंजेक्शन प्रश्न से इंजेक्शन योग्य क्वेरी के उदाहरण के सापेक्ष दिए गए हैं:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
<एच3>1. "स्टैक्ड" या "बैच्ड" क्वेरीज़।
इंजेक्शन लगाने के बाद सिर्फ एक पूरा अन्य स्टेटमेंट डालने की क्लासिक इंजेक्शन तकनीक। जैसा कि यहां एक अन्य उत्तर
में सुझाया गया है , आप $_GET['q']
. सेट कर सकते हैं करने के लिए 1; DELETE FROM users; --
ताकि क्वेरी दो स्टेटमेंट बनाती है जो लगातार निष्पादित होते हैं, जिनमें से दूसरा users
में सब कुछ हटा देता है टेबल।
शमन में
अधिकांश MySQL कनेक्टर - विशेष रूप से PHP के (बहिष्कृत) mysql_*
. सहित और (गैर-पदावनत) mysqli_*
फ़ंक्शंस - स्टैक्ड या बैच किए गए प्रश्नों का बिल्कुल भी समर्थन नहीं करते हैं, इसलिए इस तरह का हमला सिर्फ सादा काम नहीं करता है। हालांकि, कुछ करते हैं - विशेष रूप से PHP के पीडीओ कनेक्टर सहित (हालांकि समर्थन सुरक्षा बढ़ाने के लिए अक्षम किया जा सकता है
)।
फ़ंक्शन को SELECT
. से कॉल किया जा सकता है , और डेटा बदल सकते हैं। यदि डेटाबेस में डेटा-परिवर्तन करने वाला फ़ंक्शन बनाया गया है, तो आप SELECT
. बना सकते हैं इसे कॉल करें, उदाहरण के लिए 0 OR SOME_FUNCTION_NAME()
. पास करके $_GET['q']
. के मान के रूप में ।
शमन में
अधिकांश डेटाबेस में कोई उपयोगकर्ता-परिभाषित कार्य नहीं होते हैं - डेटा-परिवर्तन करने वालों को तो छोड़ दें - और इसलिए इस तरह के शोषण को करने का कोई अवसर नहीं देते हैं।
<एच3>3. फाइलों में लिखना
जैसा कि मुहैमिन ज़ुल्फ़ाकर के (कुछ हद तक अनुमानित रूप से नामित) पेपर उन्नत MySQL शोषण
, आप INTO OUTFILE
. का उपयोग कर सकते हैं या INTO DUMPFILE
एक MySQL पर क्लॉज परिणाम को फ़ाइल में डंप करने के लिए चुनते हैं। चूंकि, UNION
. का उपयोग करके , कोई भी मनमाना परिणाम SELECT
. हो सकता है ed, यह उपयोगकर्ता द्वारा mysqld
running चलाने वाले किसी भी स्थान पर मनमाना सामग्री के साथ नई फ़ाइलें लिखने की अनुमति देता है पहुँच सकते हैं। अनुमानतः इसका उपयोग न केवल MySQL डेटाबेस में डेटा को संशोधित करने के लिए किया जा सकता है, बल्कि उस सर्वर तक शेल एक्सेस प्राप्त करने के लिए किया जा सकता है, जिस पर यह चल रहा है - उदाहरण के लिए, वेबूट को PHP स्क्रिप्ट लिखकर और फिर उससे अनुरोध करना, यदि MySQL सर्वर एक PHP सर्वर के साथ सह-होस्ट किया जाता है।
शमन में
बहुत सारे कारक इस अन्यथा प्रभावशाली-लगने वाले हमले की व्यावहारिक शोषण क्षमता को कम करते हैं:
- MySQL कभी नहीं आपको
INTO OUTFILE
. का उपयोग करने दें याINTO DUMPFILE
किसी मौजूदा फ़ाइल को अधिलेखित करने के लिए, न ही उस फ़ोल्डर को लिखने के लिए जो मौजूद नहीं है। यह.ssh
. बनाने जैसे हमलों को रोकता हैmysql
. में निजी कुंजी वाला फ़ोल्डर उपयोगकर्ता की होम निर्देशिका और फिर SSHing याmysqld
. को अधिलेखित करना एक दुर्भावनापूर्ण संस्करण के साथ बाइनरी स्वयं और सर्वर के पुनरारंभ होने की प्रतीक्षा कर रहा है। - कोई भी आधा अच्छा इंस्टॉलेशन पैकेज एक विशेष उपयोगकर्ता (आमतौर पर
mysql
नाम दिया गया है) स्थापित करेगा। ) चलाने के लिएmysqld
, और उस उपयोगकर्ता को केवल बहुत सीमित अनुमतियां दें। इस प्रकार, यह फ़ाइल सिस्टम पर अधिकांश स्थानों पर लिखने में सक्षम नहीं होना चाहिए - और निश्चित रूप से वेब एप्लिकेशन के वेबूट को लिखने जैसे काम करने में सक्षम नहीं होना चाहिए। - MySQL के आधुनिक इंस्टॉलेशन
--secure-file-priv
डिफ़ॉल्ट रूप से सेट, MySQL को निर्दिष्ट डेटा आयात/निर्यात निर्देशिका के अलावा कहीं और लिखने से रोकता है और इस तरह इस हमले को लगभग पूरी तरह से नपुंसक बना देता है ... जब तक कि सर्वर के मालिक ने जानबूझकर इसे अक्षम नहीं किया हो। सौभाग्य से, कोई भी कभी भी इस तरह की सुरक्षा सुविधा को पूरी तरह से अक्षम नहीं करेगा क्योंकि यह स्पष्ट रूप से होगा - ओह रुको कोई बात नहीं ।
sys_exec()
को कॉल करना lib_mysqludf_sys
. से कार्य करें मनमानी शेल कमांड चलाने के लिए
एक MySQL एक्सटेंशन है जिसे lib_mysqludf_sys
. कहा जाता है वह - अपने सितारों से देखते हुए GitHub पर
और एक त्वरित स्टैक ओवरफ़्लो खोज
- कम से कम कुछ सौ उपयोगकर्ता हैं। यह sys_exec
. नामक एक फ़ंक्शन जोड़ता है जो शेल कमांड चलाता है। जैसा कि #2 में बताया गया है, फ़ंक्शंस को SELECT
. के भीतर से कॉल किया जा सकता है; निहितार्थ स्पष्ट रूप से स्पष्ट हैं। स्रोत
से उद्धृत करने के लिए , यह फ़ंक्शन "सुरक्षा के लिए खतरा हो सकता है" ।
शमन में
अधिकांश सिस्टम में यह एक्सटेंशन इंस्टॉल नहीं होता है।