
SonicWall SMA1000 श्रृंखला उपकरणों में SQL कमांड में उपयोग किए जाने वाले विशेष तत्वों का अनुचित निष्प्रभावीकरण (“SQL इंजेक्शन”) एक दूरस्थ प्रमाणित हमलावर को केवल-पठन व्यवस्थापक विशेषाधिकारों के साथ प्राथमिक व्यवस्थापक तक विशेषाधिकार बढ़ाने की अनुमति देता है।
SonicWall SMA 8200v प्रबंधन कंसोल (पोर्ट 8443) में एक पोस्ट-प्रमाणीकरण ब्लाइंड SQL इंजेक्शन भेद्यता किसी भी प्रमाणित व्यवस्थापक — जिसमें कम-विशेषाधिकार वाले केवल-पठन खाते भी शामिल हैं — को उपकरण कॉन्फ़िगरेशन फ़ाइल से प्राथमिक व्यवस्थापक का SHA-512 पासवर्ड हैश निकालने की अनुमति देती है। चूंकि SonicWall प्रबंधन कंसोल व्यवस्थापक और ऑपरेटिंग सिस्टम रूट खाते दोनों के लिए समान क्रेडेंशियल का उपयोग करता है, इस हैश को क्रैक करने से उपकरण तक पूर्ण रूट-स्तरीय पहुंच प्राप्त होती है।
वर्गीकरण: विशेषाधिकार वृद्धि (कम-विशेषाधिकार व्यवस्थापक से रूट) CVSS 3.1: 7.2 (उच्च) — AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H हमले की जटिलता: कम (स्वचालित PoC ~60-90 मिनट में निष्कर्षण पूरा करता है) पूर्वापेक्षाएँ: कोई भी मान्य प्रबंधन कंसोल क्रेडेंशियल (केवल-पठन खातों सहित)
| घटक | विवरण |
|---|---|
| प्लेटफ़ॉर्म | SonicWall SMA 8200v (वर्चुअल उपकरण) |
| फर्मवेयर | 12.5.0-02283 (पुष्टि); संभवतः सभी 12.x |
| सेवा | प्रबंधन कंसोल — Jetty + Struts 2 (पोर्ट 8443) |
| एंडपॉइंट | POST /activeUsers.action |
| भेद्य पैरामीटर | realmFilter, communityFilter (क्रॉस-पैरामीटर) |
| मूल कारण वर्ग | com.aventail.mgmt.sql.Sql.safeParam() |
| डेटाबेस | MariaDB 10.11.14, उपयोगकर्ता DbAdmin (ALL PRIVILEGES + FILE) |
| लक्ष्य फ़ाइल | /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml |
प्रबंधन कंसोल सक्रिय उपयोगकर्ता डैशबोर्ड के लिए SQL क्वेरीज़ com.aventail.mgmt.sql.Sql वर्ग में सहायक विधि safeParam() का उपयोग करके बनाता है। यह विधि एकल-उद्धरण (') और दोहरे-उद्धरण (") को दोगुना करके बचाती है, लेकिन यह बैकस्लैश वर्णों (\) को नहीं बचाती है।
MySQL/MariaDB में, बैकस्लैश स्ट्रिंग लिटरल के अंदर डिफ़ॉल्ट एस्केप वर्ण है। अनुक्रम \' डेटाबेस को स्ट्रिंग टर्मिनेटर के बजाय एकल-उद्धरण को शाब्दिक वर्ण के रूप में व्याख्या करने का कारण बनता है। इसका मतलब है कि पैरामीटर मान के अंत में एक बैकस्लैश एप्लिकेशन द्वारा जोड़े गए समापन उद्धरण को बच जाएगा, जिससे SQL स्ट्रिंग लिटरल आसन्न सिंटैक्स में विस्तारित हो जाएगा।
स्वच्छता अंतराल:```
Input: test
safeParam output: test\ (backslash NOT escaped)
In SQL: ... rt.name='test') AND (ct.name='...'
^^ backslash escapes the closing quote
The closing `'` after `test\` is consumed as a literal quote character within the string, so the SQL string literal extends across the `) AND (ct.name='` boundary and into the next parameter's value, where attacker-controlled SQL can be injected.
### 3.2 इंजेक्शन मैकेनिक्स: क्रॉस-पैरामीटर तकनीक
`activeUsers.action` एंडपॉइंट कई फ़िल्टर पैरामीटर स्वीकार करता है जिन्हें एक ही SQL WHERE क्लॉज़ में इंटरपोलेट किया जाता है। प्रासंगिक पैरामीटर `realmFilter` और `communityFilter` हैं, जो लगभग निम्नलिखित संरचना वाले क्वेरी में दिखाई देते हैं:```sql
SELECT ... FROM ...
WHERE ...
AND (rt.name='<realmFilter>')
AND (ct.name='<communityFilter>')
...
हमला पैरामीटर सेटअप:
| पैरामीटर | मान | उद्देश्य |
|---|---|---|
realmFilter | test\ | पीछे का बैकस्लैश समापन उद्धरण से बच निकलता है, स्ट्रिंग लिटरल को AND सीमा के पार विस्तारित करता है |
communityFilter | )) OR (SELECT IF(<condition>,SLEEP(N),0))-- x | खुले कोष्ठक बंद करता है, सशर्त SLEEP इंजेक्ट करता है, शेष भाग को कमेंट कर देता है |
इंटरपोलेशन के बाद परिणामी SQL:```sql WHERE ... AND (rt.name='test') AND (ct.name=' )) OR (SELECT IF(,SLEEP(N),0))-- x')
इसे तोड़ते हुए:
1. `rt.name='test\')` — `\` `'` को एस्केप करता है, इसलिए स्ट्रिंग यहाँ बंद नहीं होती
2. `AND (ct.name='` — स्ट्रिंग वैल्यू का हिस्सा बन जाता है (शाब्दिक टेक्स्ट)
3. स्ट्रिंग अंततः अगले `'` पर बंद होती है (`communityFilter` की शुरुआत से)
4. `))` — WHERE क्लॉज़ संरचना के दो खुले पैरेंथेसिस बंद करता है
5. `OR (SELECT IF(...))` — ब्लाइंड SQLi कंडीशन इंजेक्ट करता है
6. `-- x` — बाकी SQL (`')` और अन्य क्लॉज़) को कमेंट कर देता है
### 3.3 टाइम-बेस्ड ब्लाइंड एक्सट्रैक्शन
चूँकि एप्लिकेशन का Struts 2 एरर हैंडलिंग SQL एक्सेप्शन को सुचारू रूप से पकड़ लेता है (क्वेरी सफल हो या विफल, हमेशा समान पेज कंटेंट के साथ HTTP 200 लौटाता है), एरर-बेस्ड और UNION-बेस्ड एक्सट्रैक्शन विधियाँ व्यवहार्य नहीं हैं। इंजेक्शन का शोषण टाइम-बेस्ड ब्लाइंड तकनीक का उपयोग करके किया जाता है:
- **TRUE कंडीशन:** `IF(<condition>, SLEEP(N), 0)` — रिस्पॉन्स में SLEEP अवधि को रिज़ल्ट सेट की पंक्ति संख्या से गुणा करके देरी होती है
- **FALSE कंडीशन:** कोई SLEEP नहीं — रिस्पॉन्स ~200-500ms में लौटता है
SLEEP फ़ंक्शन WHERE क्लॉज़ मूल्यांकन में प्रति-पंक्ति निष्पादित होता है। 30-300+ पंक्तियों वाली एक सामान्य मॉनिटरिंग टेबल के साथ, एक छोटा SLEEP मान (जैसे, 0.3s) भी स्पष्ट रूप से पहचाने जाने योग्य देरी उत्पन्न करता है (TRUE के लिए 10-100s बनाम FALSE के लिए <1s)।
लक्ष्य डेटा का प्रत्येक कैरेक्टर ASCII रेंज पर बाइनरी सर्च के माध्यम से निकाला जाता है:```sql
ORD(SUBSTRING((<extraction_expr>), <position>, 1)) > <midpoint>
इसके लिए प्रति कैरेक्टर अधिकतम 7 अनुरोधों की आवश्यकता होती है (log2(128) = 7), जिससे 98-कैरेक्टर SHA-512 हैश के लिए कुल ~686 अनुरोध प्राप्त होते हैं।
PRIVILEGE ESCALATION CHAIN
============================================================================
[1] Authenticate Low-privilege admin (e.g., "readonly") | authenticates to management console on port 8443 | using "Local Authentication" realm v [2] SQL Injection Cross-parameter blind SQLi via activeUsers.action | realmFilter backslash + communityFilter payload | Condition: IF(, SLEEP(N), 0) v [3] LOAD_FILE() MariaDB DbAdmin user has FILE privilege | secure_file_priv=NULL does NOT block reads | avconfig.xml is group-readable (mode 664) v [4] Locate Hash LOCATE('consoleMode', file) anchors to admin section | LOCATE('', file, anchor) finds hash element | SUBSTRING + SUBSTRING_INDEX extracts hash value v [5] Extract Hash Binary search extracts hash char-by-char | ~98 chars * ~7 requests = ~686 requests | Output: $6$$ (SHA-512 crypt) v [6] Crack Hash hashcat -m 1800 / john --format=sha512crypt | Admin password = Root SSH password (by design) v [7] Full Compromise SSH as root, management console as admin Complete appliance takeover
### 4.2 चरण 1: प्रमाणीकरण
SMA प्रबंधन कंसोल दो प्रमाणीकरण क्षेत्रों (realms) का समर्थन करता है:
| Realm ID | प्रदर्शन नाम | उपयोगकर्ता |
|----------|-------------|-------|
| *(खाली)* | प्रबंधन कंसोल | केवल प्राथमिक व्यवस्थापक खाता |
| `AMCAuthRealm` / `Local Authentication` | स्थानीय प्रमाणीकरण | द्वितीयक व्यवस्थापक खाते (readonly, custom) |
हमले के लिए केवल प्रबंधन कंसोल पहुंच वाले **किसी भी** खाते के लिए एक वैध क्रेडेंशियल की आवश्यकता होती है। "readonly" खाता — जो केवल निगरानी-पहुंच के लिए बनाया गया है और इसमें कॉन्फ़िगरेशन बदलने की कोई क्षमता नहीं है — पर्याप्त है।
प्रमाणीकरण J2EE FORM-आधारित प्रमाणीकरण के माध्यम से किया जाता है:
1. `GET /console.action` — लॉगिन पृष्ठ प्राप्त करता है, छिपे हुए फ़ॉर्म फ़ील्ड से CSRF टोकन निकालता है
2. `POST /j_security_check` — `csrfToken`, `j_username`, `j_password`, और `realmId` सबमिट करता है
3. सफलता पर HTTP 303 रीडायरेक्ट, `JSESSIONID` कुकी स्थापित होती है
### 4.3 चरण 2: SQL इंजेक्शन