
phpMyAdmin 5.2.3 - उच्च - रिमोट - SQLi - ImportLdi TERMINATED BY शेष
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
राइट-अप: https://abraxaslabs.tech/research/phpmyadmin-importldi
वर्ग: SQLi पहुँच: रिमोट
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
ImportLdi.php POST के ldi_terminated और ldi_new_line से FIELDS/LINES TERMINATED BY के साथ LOAD DATA बनाता है। इन दोनों स्ट्रिंग्स को सिंगल-कोटेड SQL में जोड़ा जाता है। ldi_enclosed और ldi_escaped escapeString से होकर गुज़रते हैं। phpMyAdmin /import पर PMA_ENABLE_LDI सेट करता है ताकि MYSQLI_OPT_LOCAL_INFILE चालू रहे।
एक साइन-इन किया हुआ उपयोगकर्ता ldi_terminated में एक कोट के साथ format=ldi POST करता है। जारी किया गया LOAD DATA TERMINATED BY के अंदर रॉ POST को शामिल करता है। यह उपयोगकर्ता कनेक्शन में SQL इंजेक्शन है, कंट्रोल उपयोगकर्ता में नहीं।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | SQLi |
| पहुँच | रिमोट (प्रमाणित कुकी लॉगिन; टेबल इम्पोर्ट, फ़ॉर्मेट ldi) |
| CWE | CWE-89 |
| CVSS | मध्यम: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| उत्पाद | phpMyAdmin |
| प्रभावित | 5.2.3 टैग RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| प्रमाणीकरण | प्रमाणित कुकी लॉगिन। टेबल इम्पोर्ट, फ़ॉर्मेट ldi |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
एक साइन-इन किया हुआ phpMyAdmin उपयोगकर्ता जो टेबल इम्पोर्ट खोल सकता है, अपने MySQL कनेक्शन पर LOAD DATA ... TERMINATED BY में SQL इंजेक्ट कर सकता है।
| विशेषाधिकार | विधि / सिंक | रेकॉन / अखंडता / उपलब्धता | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
FIELDS TERMINATED BY लिटरल को तोड़ना | POST index.php?route=/import format=ldi ldi_terminated में एक कोट के साथ | PMA द्वारा बनाए गए स्टेटमेंट की अखंडता | लैब-प्रमाणित। HTML SQL बॉक्स: TERMINATED BY '',PMA-IMPORTLDI-WITNESS' |
ENCLOSED BY को इन-बैंड रखना | वही POST, ldi_enclosed में कोट | नेगेटिव कंट्रोल | लैब-प्रमाणित। ENCLOSED BY एस्केप किया गया है |
| उपयोगकर्ता कनेक्शन पर अतिरिक्त SQL (INTO OUTFILE / स्टैक्ड यदि अनुमति हो) | स्ट्रिंग बंद होने के बाद वही सिंक | उपयोगकर्ता कनेक्शन की अखंडता | अनुमानित। लैब टूटे हुए डेलिमीटर पर रुकती है। डिफ़ॉल्ट mysqli::query सिंगल-स्टेटमेंट है |
| MySQL-साइड फ़ाइल पढ़ना/लिखना | वही LOAD DATA यदि खाते के पास FILE या वेब सर्वर तक LOCAL INFILE है | उन फ़ाइलों की अखंडता जिन्हें mysqld छू सकता है | अनुमानित। यहाँ अनुदत्त नहीं। दावा नहीं किया गया |
इस लैब पर बंद: अनप्रमाणित पहुँच, कंट्रोल-उपयोगकर्ता / pmadb, OS include LFI, और FILE-गेटेड पढ़ना/लिखना। साइन-इन किए हुए उपयोगकर्ता के पास पहले से ही एक SQL बॉक्स है; यह बचा हुआ हिस्सा उस स्टेटमेंट के अंदर का अनएस्केप्ड डेलिमीटर है जो PMA उनके लिए बनाता है।
वही पिन: WebAuthn CustomServer leftover।
मैंने phpMyAdmin RELEASE_5_2_3 को पिन किया। जो इम्पोर्ट प्लगइन हाथ से LOAD DATA बनाते हैं, वे एक कोटिंग ऑडिट हैं। चार डेलिमीटर फ़ील्ड में से दो एस्केप किए गए थे। दो नहीं थे:
$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';
ldi_enclosed / ldi_escaped $dbi->escapeString को कॉल करते हैं। Common.php /import + format=ldi पर PMA_ENABLE_LDI सेट करता है। रूट्स GET|POST /import और GET|POST /table/import।
पहले से दर्ज गलत मोड़: FILE ग्रांट के बिना LFI का दावा करना; SQL बॉक्स को ही फाइंडिंग मान लेना (जो बचा है वह अनएस्केप्ड डेलीमीटर है जिसे PMA जोड़ता है); control-user / pmadb का दावा करना; एक रिवर्स शेल। नाटक।
python3 phpmyadmin-importldi-Abraxas-Labs.py
# or: cd lab && ./run.sh
केवल http://127.0.0.1:19290 को लक्षित करें। इमेज phpmyadmin:5.2.3 और mysql:8.0। Compose प्रोजेक्ट phpmyadmin-importldi। रन के बाद स्टैक टियर डाउन हो जाता है।
कुकी लॉगिन। format=ldi और ldi_terminated में एक कोट के साथ /import पर POST करें। जारी किया गया LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'। ldi_enclosedमें वही कोट एक escapedENCLOSED BYके रूप में संग्रहीत हुआ। 5.2.3 इमेज पर पिन किए गए सोर्स में अभी भी'.$ldi_terminated.'और$dbi->escapeString($ldi_enclosed)` है।
SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS
ldi_terminated और ldi_new_line पर escapeString, जैसे enclosed और escaped में होता है। skip_queries का Int-cast।
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।