
phpMyAdmin 5.2.3 - उच्च - रिमोट - CSRF - /sql पर टोकन स्ट्रिप
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-csrf-sql
राइट-अप: https://abraxaslabs.tech/research/phpmyadmin-csrf-sql
वर्ग: CSRF पहुँच: रिमोट
phpMyAdmin 5.2.3 (टैग RELEASE_5_2_3, कमिट 962857e)। Common.php checkTokenRequestParam से पहले globals से PSR-7 अनुरोध बनाता है। बेमेल होने पर, Sanitize::removeRequestVars $_POST और $_GET को साफ़ करता है, लेकिन उस स्नैपशॉट को नहीं। फिर $sql_query को $request->getParsedBodyParam('sql_query') से कॉपी किया जाता है। AJAX POST टोकन बेमेल पर रद्द हो जाते हैं। गैर-AJAX POST जारी रहते हैं। SqlController स्ट्रिप्ड $_POST['sql_query'] को प्राथमिकता देता है और अन्यथा global रखता है।
phpMyAdmin सत्र कुकी वाला एक पीड़ित पर्याप्त है। index.php?route=/sql पर sql_query के साथ POST करें, बिना वैध टोकन के, और ajax_request के बिना। SELECT उस MySQL उपयोगकर्ता के रूप में चलता है। 5.2.3 में डिफ़ॉल्ट CookieSameSite=Strict कई क्रॉस-साइट ब्राउज़रों को अवरुद्ध करता है। Same-site, Lax, None, या HTTP-auth अभी भी इसे हिट करते हैं। यह किसी भी तरह से एक टूटा हुआ CSRF नियंत्रण है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | CSRF |
| पहुँच | रिमोट। डिफ़ॉल्ट CookieSameSite=Strict कई क्रॉस-साइट ब्राउज़रों को अवरुद्ध करता है। Same-site / Lax / None / HTTP-auth शेष हैं। |
| CWE | CWE-352 |
| CVSS | उच्च: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| उत्पाद | phpMyAdmin |
| प्रभावित | 5.2.3 टैग RELEASE_5_2_3 (962857e) |
| प्रमाणीकरण | पीड़ित phpMyAdmin सत्र कुकी (या HTTP auth)। कोई वैध CSRF टोकन नहीं। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:19240 |
कोई भी जो पीड़ित ब्राउज़र को ajax_request के बिना phpMyAdmin पर POST करने के लिए प्रेरित कर सकता है, वह उस MySQL उपयोगकर्ता के रूप में SQL चला सकता है।
| विशेषाधिकार | विधि / पथ | लैब-प्रमाणित या अनुमानित |
|---|---|---|
| पीड़ित MySQL खाते के रूप में हमलावर SQL चलाएँ (उस SQL बॉक्स की अखंडता + रेकॉन) | POST index.php?route=/sql sql_query=... db=... बिना token, बिना ajax_request | लैब-प्रमाणित। परिणाम बॉडी में PMA-CSRF-SQL-WITNESS था। सामान्य लॉग ने SELECT को appuser के रूप में दिखाया |
| AJAX पर उसी हैंडलर को रद्द करें | वही POST ajax_request=1 के साथ | लैब-प्रमाणित। Token mismatch। INSERT मार्कर पंक्ति अनुपस्थित। सामान्य लॉग ने वह INSERT नहीं चलाया |
उन हैंडलरों को छोड़ें जो केवल स्ट्रिप्ड $_POST पढ़ते हैं | POST /database/structure/drop-table बिना टोकन के | लैब-प्रमाणित। keepme अभी भी मौजूद |
export (SaveDir), partition DROP/TRUNCATE, account lock, /config/set, pmadb create पर वही अंतराल | कोई भी हैंडलर जो स्ट्रिप के बाद PSR-7 बॉडी पढ़ता है | अनुमानित। परीक्षण नहीं किया गया |
इस लैब पर बंद: अनप्रमाणित PMA (पहले कुकी लॉगिन आवश्यक), AJAX रूट (वे बेमेल पर बाहर निकल जाते हैं), बिना टोकन के drop-table, OS शेल। डिफ़ॉल्ट Strict SameSite का अर्थ है कि एक क्लासिक क्रॉस-साइट फ़ॉर्म अक्सर कुकी नहीं भेजेगा; शेष अभी भी same-site और Lax/None डिप्लॉय पर एक विफल CSRF जाँच है।
RELEASE_5_2_3 की आठ समानांतर स्रोत खोजें। Common.php checkTokenRequestParam() से पहले $request = createFromGlobals() बनाता है। बेमेल पर, Sanitize::removeRequestVars() केवल $_POST/$_GET साफ़ करता है। गैर-AJAX जारी रहता है। SqlController वैश्विक $sql_query का उपयोग करता है यदि $_POST खाली है। रूट GET|POST /sql।
गलत मोड़: AJAX /sql को बचा हुआ मानना (यह Token mismatch पर रद्द हो जाता है); drop-table को बचा हुआ मानना (वह हैंडलर केवल stripped $_POST पढ़ता है); default Strict SameSite को "CSRF बंद है" मानना (नियंत्रण अभी भी टूटा हुआ है; same-site / Lax / None शेष हैं)।
python3 phpmyadmin-csrf-sql-Abraxas-Labs.py
या
cd lab
./run.sh
केवल लूपबैक: http://127.0.0.1:19240। इमेज phpmyadmin:5.2.3 और mysql:8.0। Compose प्रोजेक्ट phpmyadmin-csrf-sql। PoC एक same-site लूपबैक POST है (Strict SameSite फिर भी कुकी भेजता है)। साक्षी PMA-CSRF-SQL-WITNESS।
SUCCESS phpmyadmin-csrf-sql sql-ran=yes ajax-abort=yes drop-held=yes PMA-CSRF-SQL-WITNESS
बेमेल होने पर, अनुरोध को खाली बॉडी से बदलें, या सभी POST को अस्वीकार करें, केवल AJAX ही नहीं। किसी पुराने अनुरोध से sql_query की प्रतिलिपि न बनाएं। लॉगआउट की तरह फेल-क्लोज़्ड रहें।
962857e)libraries/classes/Common.php अनुरोध स्नैपशॉटSanitize::removeRequestVars केवल $_POST/$_GET को साफ़ करता हैSqlController वैश्विक $sql_queryGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।