
ماسح ضوئي آلي لتكوينات CORS الخاطئة يختبر حقن رأس Origin، وانعكاس حرف البدل، وتسرب بيانات الاعتماد عبر تطبيقات الويب وواجهات برمجة التطبيقات.
CORS هي آلية تعتمد على رؤوس HTTP تسمح للخادم بتحديد أي أصول أخرى (نطاق، مخطط، أو منفذ) غير أصله يُسمح للمتصفح بتحميل الموارد منها. تعمل عن طريق إضافة رؤوس HTTP جديدة تسمح للخوادم بوصف الأصول المسموح لها بقراءة تلك المعلومات من متصفح الويب.
يعتمد CORS أيضًا على آلية يقوم من خلالها المتصفح بإجراء طلب "استباقي" إلى الخادم الذي يستضيف المورد عبر الأصل، للتحقق من أن الخادم سيسمح بالطلب الفعلي. في هذا الطلب الاستباقي، يرسل المتصفح رؤوسًا تشير إلى طريقة HTTP والرؤوس التي سيتم استخدامها في الطلب الفعلي.
المشكلة الأمنية الأكثر شيوعًا وإشكالية عند تنفيذ CORS هي الفشل في التحقق/إدراج الطالبين في القائمة البيضاء. غالبًا ما نرى قيمة Access-Control-Allow-Origin مضبوطة على '*'.
لسوء الحظ، هذا هو الإعداد الافتراضي، وبالتالي يسمح لأي نطاق على الويب بالوصول إلى موارد هذا الموقع.
وفقًا لمعيار التحقق من أمان التطبيقات (ASVS) الخاص بـ OWASP، ينص الشرط 14.5.3 على:
Verify that the Cross-Origin Resource Sharing (CORS) Access-Control-Allow-Origin header uses a strict allow list of trusted domains and subdomains to match against and does not support the "null" origin.
يعمل corsair_scan عن طريق إعادة إرسال طلب (أو قائمة من الطلبات) يتم استلامها كمعامل، ثم حقن قيمة في رأس Origin. اعتمادًا على محتوى رأس Access-Control-Allow-Origin في الرد على هذا الطلب، يمكننا تأكيد ما إذا كان تكوين CORS صحيحًا أم لا. هناك ثلاثة سيناريوهات تشير إلى أن CORS قد تم تكوينه بشكل خاطئ:
إذا تم اكتشاف أن CORS قد تم تكوينه بشكل خاطئ، فإننا نتحقق مما إذا كان الرد يحتوي على الرأس Access-Control-Allow-Credentials، مما يعني أن الخادم يسمح بتضمين بيانات الاعتماد في الطلبات عبر الأصل.
غالبًا ما تستخدم تكوينات CORS أحرف البدل، على سبيل المثال قبول أي شيء تحت * example.com *. وهذا يعني أن النطاق domain.com.evil.com سيتم قبوله لأنه يطابق التعبير النمطي المحدد. ولمحاولة مكافحة ذلك، يختبر corsair_scan أربعة سيناريوهات:
تم تطوير هذا المشروع باستخدام Python 3.9، ولكن يجب أن يعمل مع أي إصدار من Python 3.x. أفضل طريقة لتثبيته هي باستخدام pip.
pip3 install corsair_scan --user
يمكن استخدام Corsair كوحدة Python أو كواجهة سطر أوامر (CLI).
الطريقة التي تقوم بفحص CORS هي corsair_scan. إليك تعريفها:
تستقبل قائمة من الطلبات ومعلمة لتمكين/تعطيل فحص الشهادة في الطلب.
المدخلات:
المخرجات:
import corsair_scan.corsair_scan as corsair
url_data = {}
data = []
verb = 'GET'
url = 'https://example.com/'
params = 'user=user1&password=1234'
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-GB,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1',
'Origin': 'https://example.com',
'Host': 'example.com'}
url_data['verb'] = verb
url_data['url'] = url
url_data['params'] = params
url_data['headers'] = headers
data.append(url_data)
print (corsair.corsair_scan(data, verify=True))
الرد:
{'report': [{'fake_origin': {'Access-Control-Allow-Origin': 'https://scarymonster.com',
'Origin': 'https://scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'post-domain': {'Access-Control-Allow-Origin': 'https://example.com.scarymonster.com',
'Origin': 'https://example.com.scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'pre-domain': {'Access-Control-Allow-Origin': 'https://scarymonsterexample.com',
'Origin': ' https://scarymonsterexample.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'sub-domain': {'Access-Control-Allow-Origin': 'https://scarymonster.example.com',
'Origin': 'https://scarymonster.example.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'url': 'https://example.com/',
'verb': 'GET'}],
'summary': {'error': [], 'misconfigured': [{'credentials': True,
'misconfigured_test': ['fake_origin',
'sub-domain',
'pre-domain',
'post-domain'],
'status_code': 200,
'url': 'https://domain.com',
'verb': 'GET'}]}}
كجزء من تثبيت حزمة pip، يتم تثبيت واجهة سطر الأوامر. صيغة التنفيذ هي كالتالي:
corsair FILE [-nv/--noverify][-r/--report]
تحتاج واجهة سطر الأوامر إلى ملف JSON يحتوي على قائمة من الطلبات لإجراء الفحص. يتم توفير ملف مثال كجزء من الاختبارات:
[{
"verb": "GET",
"url": "https://example.com/",
"params": "user=user1&password=1234",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-GB,en;q=0.5",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Origin": "https://example.com",
"Host": "example.com"
}
}]
هناك أيضًا معاملين اختياريين:

تم تطوير Corsair_scan بواسطة فريق هندسة الأمن في Santander UK وهم: