
MySQL Community Server 26.7.0 - उच्च - JSON Duality DEFINER SQLi - NO_BACKSLASH_ESCAPES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-jdv-definer-sqli
वर्ग: SQLi पहुँच: Remote
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
JSON Duality DML JSON स्ट्रिंग मानों को \escape_string_for_mysql` (केवल बैकस्लैश) के साथ जोड़ता है, और फिर व्यू DEFINER sctx में स्विच करने के बाद इन्वाकर \sql_mode` के तहत \parse_sql` निष्पादित करता है। \SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'`कमांड`'`को SQL लिटरल को समाप्त करने के लिए उपयोग किया जाता है। एक JSON स्ट्रिंग जिसमें`'`होता है, एक सबक्वेरी या SET-लिस्ट को DEFINER के रूप में इंजेक्ट कर सकता है। लैब: व्यू पर केवल DML संचालन वाले इन्वाकर द्वारा`secret.s`को प्रक्षेपित`name`` कॉलम में पढ़ा जाता है।
डिफ़ॉल्ट CREATE VIEW DEFINER है। X Plugin पहले से ही उस मोड पर शाखा बनाता है। JDV ऐसा नहीं करता। यह फीचर-गेटेड है: इसे एक JSON Duality View की आवश्यकता होती है।
| आईडी | अभी तक कोई CVE नहीं |
| वर्ग | SQLi (DEFINER; RCE नहीं) |
| पहुँच | Remote (प्रमाणित SQL; JSON Duality View पर DML की आवश्यकता है) |
| CWE | CWE-89 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| उत्पाद | MySQL Community Server mysqld |
| प्रभावित | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| प्रमाणीकरण | प्रमाणित; JSON Duality View पर INSERT या UPDATE |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। प्रक्षेपित $.name में गवाह। |
एक \SQL SECURITY DEFINER` JSON Duality Viewपर DML संचालन नियंत्रित करें।`SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'`चलाएं। एक स्ट्रिंग फ़ील्ड को UPDATE करें (जिसका JSON मान`'`धारण करता है, etag SELECT से प्राप्त करें)। उत्पन्न`_utf8mb4 '...'`लिटरल समाप्त हो जाता है। बयान का शेष भाग DEFINER के रूप में निष्पादित होता है। लैब`secret.s.note`को प्रक्षेपित`name`कॉलम में चुनता है।`secret.s`पर प्रत्यक्ष`SELECT`` 1142 (अनुमति अस्वीकृत) देता है।
उस sql_mode के बिना, समान JSON एक लिटरल नाम के रूप में संग्रहीत होता है। उद्धरण चिह्न डेटा ही रहता है।
समान 26.7.0 खोज। डिफ़ॉल्ट डेमन का अप्रकाशित Crit/High रिपोर्ट खाली था। JSON Duality DML अभी भी मानों को जोड़ता है।
sbuf.append("_utf8mb4 '");
escape_string_for_mysql(&my_charset_utf8mb4_bin, ...);
sbuf.append(1, '\'');
\create_sctx_guard` \run_substmt` से पहले \view_sctx` स्थापित करता है। इन्वाकर \sql_mode` वही है जो \parse_sql` देखता है।
गलत दिशाएँ: व्यू नाम और \AS` के बीच \SQL SECURITY DEFINER` 1064 (त्रुटि) देता है (डिफ़ॉल्ट पहले से ही DEFINER है)। वर्तमान पंक्ति के समान \name` को छोड़ दिया जाता है (`is_equal`); किसी अन्य मान के खिलाफ इंजेक्ट करें। Etag की आवश्यकता है।
cd lab
./run.sh
इमेज \mysql:26.7.0`। प्रकाशित \127.0.0.1:18640`। व्यू \app.dv` DEFINER \root`@`%` के साथ \app.t` पर। गुप्त जानकारी \secret.s` में है। पीड़ित के पास व्यू पर केवल SELECT/INSERT/UPDATE अनुमति है।
SUCCESS mysql-jdv-definer-sqli victim-secret=denied nbe-inject=yes view-has-witness=yes default-mode-inject=no dump=26.7.0 image=mysql:26.7.0 MYSQL-JDV-DEFINER-SQLI-WITNESS
JDV DML स्ट्रिंग्स को उसी \NO_BACKSLASH_ESCAPES` शाखा के साथ एस्केप करें जिसे X Plugin पहले से ही रखता है (`escape_sql_quote` बनाम \escape_string_for_mysql`)। उत्पन्न INSERT/UPDATE को पैरामीटराइज़ करें। DEFINER sctx के तहत संयोजित मानों को \parse_sql` न करें।
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)append_json_dom / create_sctx_guard