
phpMyAdmin 5.2.3 - उच्च - रिमोट - शेष - isSuperUser जाँच छोड़ी गई
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-issuperuser
राइट-अप: https://abraxaslabs.tech/research/phpmyadmin-issuperuser
वर्ग: विशेषाधिकार अवशेष पहुँच: रिमोट
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
DatabaseInterface::isSuperUser() कोई SUPER / SYSTEM_USER जाँच नहीं है। यह SELECT 1 FROM mysql.user LIMIT 1 है। कोई भी खाता जो mysql.user पढ़ सकता है, शेष सत्र के लिए सुपरयूज़र के रूप में कैश हो जाता है। $cfg['AllowUserDropDatabase'] डिफ़ॉल्ट रूप से false है। DestroyController, SqlController, ImportController, और databases पेज सभी उस फ़्लैग के आसपास isSuperUser शॉर्टकट का उपयोग करते हैं।
यह phpMyAdmin नीति बायपास है, नया MySQL विशेषाधिकार नहीं। mysql.user पर SELECT और DROP, और SUPER नहीं, PMA के माध्यम से Drop करने के लिए पर्याप्त है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष |
| पहुँच | रिमोट (MySQL खाते के रूप में प्रमाणित कुकी लॉगिन) |
| CWE | CWE-863 |
| CVSS | मध्यम: 6.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| उत्पाद | phpMyAdmin |
| प्रभावित | 5.2.3 टैग RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| प्रमाणीकरण | MySQL खाते के रूप में प्रमाणित कुकी लॉगिन |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
एक साइन-इन MySQL खाता जो mysql.user पढ़ सकता है (सामान्य बैकअप/मॉनिटर SELECT) और साथ में DROP, बिना SUPER के, phpMyAdmin सुपरयूज़र के रूप में माना जाता है।
| विशेषाधिकार | विधि / सिंक | रेकॉन / अखंडता / उपलब्धता | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
$cfg['AllowUserDropDatabase']=false को बायपास करें और databases पेज पर Drop देखें | GET index.php?route=/server/databases | Drop UI का रेकॉन | लैब-प्रमाणित। selectuser के लिए bulkActionDropButton / selected_dbs[] मौजूद; plaindrop के लिए अनुपस्थित |
| PMA destroy हैंडलर के माध्यम से डेटाबेस Drop करें | POST index.php?route=/server/databases/destroy selected_dbs[]=dropme ajax_request=true | उस डेटाबेस की अखंडता / उपलब्धता | लैब-प्रमाणित। JSON success:true, "1 database has been dropped successfully." dropme चला गया |
SQL बॉक्स से DROP DATABASE चलाएँ | POST index.php?route=/sql sql_query=DROP DATABASE \dropme_sql`` | उस डेटाबेस की अखंडता / उपलब्धता | लैब-प्रमाणित। डेटाबेस चला गया। नकारात्मक खाते को "DROP DATABASE statements are disabled." मिलता है |
isSuperUser() पर निर्भर अन्य PMA स्क्रीन अनलॉक करें | Privileges, replication, status, user groups, engines, binlog, variables | उन स्क्रीन का रेकॉन / अखंडता | कॉल साइट्स से अनुमानित। परीक्षण नहीं किया गया |
mysql.user पढ़ें | MySQL SELECT जिसे PMA SUPER ऑरेकल के रूप में उपयोग करता है | उस कैटलॉग का रेकॉन जिसे PMA गलती से SUPER समझता है | लैब-प्रमाणित। वही अनुदान है जिसे अवशेष गलती से SUPER समझता है |
इस लैब पर बंद: वास्तविक MySQL SUPER (SHOW GRANTS USAGE + table DROP + mysql.user पर SELECT ही रहता है)। FILE, GRANT OPTION, shutdown, और ALL PRIVILEGES प्रदान नहीं किए गए हैं। DROP वाला खाता जिसके पास mysql.user पर SELECT नहीं है, वह भी PMA के माध्यम से drop नहीं कर सकता। यह नया MySQL विशेषाधिकार नहीं है और RCE नहीं है।
वही पिन: WebAuthn CustomServer अवशेष।
I pinned phpMyAdmin RELEASE_5_2_3. Privilege gates that talk like SUPER should look like SUPER. This one looks like a catalog SELECT:
$result = $this->tryQuery('SELECT 1 FROM mysql.user LIMIT 1');
$isSuperUser = false;
if ($result) {
$isSuperUser = (bool) $result->numRows();
}
SessionCache::set('is_superuser', $isSuperUser);
AllowUserDropDatabase के आसपास इस फ़्लैग को लेने वाले गेट (डिफ़ॉल्ट false):
Controllers/Server/DatabasesController.php is_drop_allowedControllers/Server/Databases/DestroyController.php (AJAX destroy)Controllers/Sql/SqlController.php / Sql::hasNoRightsToDropDatabaseControllers/Import/ImportController.phpControllers/Database/OperationsController.phpपहले से दर्ज गलत मोड़: असली MySQL SUPER का दावा करना; केवल-DROP वाले अकाउंट को बग मानना (वह अकाउंट नेगेटिव कंट्रोल है); इसे बढ़ाकर RCE बताना; एक रिवर्स शेल। नाटक।
python3 phpmyadmin-issuperuser-Abraxas-Labs.py
# or: cd lab && ./run.sh
केवल http://127.0.0.1:19270 को लक्षित करें। इमेज phpmyadmin:5.2.3 और mysql:8.0। Compose प्रोजेक्ट phpmyadmin-issuperuser। $cfg['AllowUserDropDatabase']=false। रन के बाद स्टैक टियर डाउन हो जाता है।
selectuser के पास mysql.user पर SELECT और dropme / dropme_sql पर DROP है, SUPER नहीं। plaindrop के पास केवल nodropme पर DROP है। Databases पेज selectuser के लिए Drop दिखाता है। POST /server/databases/destroy dropme को ड्रॉप करता है। DROP DATABASE dropme_sql के साथ POST /sql भी चलता है। plaindrop को फिर भी destroy से Error JSON मिला और /sql से "DROP DATABASE statements are disabled" मिला।
SUCCESS phpmyadmin-issuperuser drop-ui=yes destroy=ok sql-drop=ok grants-no-super=yes mysql.user-select=yes neg-drop-ui=no neg-destroy=denied PMA-ISSUPERUSER-WITNESS
INFORMATION_SCHEMA या SHOW GRANTS के माध्यम से वास्तविक SUPER / SYSTEM_USER का परीक्षण करें। UI के लिए एक अलग "can read mysql.user" फ़्लैग रखें जिसे वास्तव में उस कैटलॉग की आवश्यकता होती है। कैटलॉग SELECT को सुपरयूज़र के रूप में कैश न करें।
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।