Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL इंजेक्शन - अद्यतन/हटाने के लिए चयन क्वेरी का उपयोग करें

सीधे सवाल का जवाब देने से पहले, यह ध्यान देने योग्य है कि भले ही एक हमलावर क्या कर सकता है पढ़ें वह डेटा जो उसे नहीं करना चाहिए, वह है आमतौर पर अभी भी वास्तव में बुरा है। उस पर विचार करें 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 के पीडीओ कनेक्टर सहित (हालांकि समर्थन सुरक्षा बढ़ाने के लिए अक्षम किया जा सकता है )।

<एच3>2. उपयोगकर्ता द्वारा परिभाषित कार्यों का शोषण करना

फ़ंक्शन को 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 को निर्दिष्ट डेटा आयात/निर्यात निर्देशिका के अलावा कहीं और लिखने से रोकता है और इस तरह इस हमले को लगभग पूरी तरह से नपुंसक बना देता है ... जब तक कि सर्वर के मालिक ने जानबूझकर इसे अक्षम नहीं किया हो। सौभाग्य से, कोई भी कभी भी इस तरह की सुरक्षा सुविधा को पूरी तरह से अक्षम नहीं करेगा क्योंकि यह स्पष्ट रूप से होगा - ओह रुको कोई बात नहीं
<एच3>4. sys_exec()को कॉल करना lib_mysqludf_sys . से कार्य करें मनमानी शेल कमांड चलाने के लिए

एक MySQL एक्सटेंशन है जिसे lib_mysqludf_sys . कहा जाता है वह - अपने सितारों से देखते हुए GitHub पर और एक त्वरित स्टैक ओवरफ़्लो खोज - कम से कम कुछ सौ उपयोगकर्ता हैं। यह sys_exec . नामक एक फ़ंक्शन जोड़ता है जो शेल कमांड चलाता है। जैसा कि #2 में बताया गया है, फ़ंक्शंस को SELECT . के भीतर से कॉल किया जा सकता है; निहितार्थ स्पष्ट रूप से स्पष्ट हैं। स्रोत से उद्धृत करने के लिए , यह फ़ंक्शन "सुरक्षा के लिए खतरा हो सकता है"

शमन में

अधिकांश सिस्टम में यह एक्सटेंशन इंस्टॉल नहीं होता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql का उपयोग करके लोकलहोस्ट डेटाबेस कैसे बनाएं?

  2. QUERY पैकेट भेजते समय त्रुटि

  3. तालिका में पंक्तियों के बीच औसत समय अंतर कैसे प्राप्त करें?

  4. MySQL/PHP का उपयोग करके किसी फ़ील्ड में अभी () का उपयोग करके वर्तमान दिनांक/समय डालें

  5. आप प्रत्येक क्वेरी पर पुन:कनेक्ट किए बिना PHP में MySQL से कुशलतापूर्वक कैसे कनेक्ट होते हैं?