تعرف على LDAP Injection و كيفية استغلالها
السلام عليكم و رحمة الله و بركاته
اليوم سنتطرق لكم عن موضوع ممتع فيما يخص اختبار اختراق تطبيقات الويب, الا وهو تعرف على LDAP Injection و كيفية استغلالها.
في البداية دعونا نتعرف على هذا البروتوكول و ما هي مكوناته
ما هو LDAP ؟
بروتوكول LDAP أو ما يسمى Lightweight Directory Access Protocol هو أحد بروتوكولات الشبكات و الذي يستخدم بشكل رئيسي في عملية التحقق من هوية المستخدم بالإضافة إلى صلاحياته التي يمتلكها و طريقة الوصول إلى أي خدمات داخل الشبكة مثل الطابعات و الملفات المشتركة و غيرها.
لو افترضنا مثلا بوجود مؤسسة تحتوي داخلها على عدد من الأقسام و الدوائر مثل (المحاسبة, البرمجة, المخازن, ….. وغيرها).. فمن الطبيعي أن يكون لكل قسم أو دائرة من هذه الأقسام و الدوائر صلاحيات خاصة به ممكن أن تتشارك بعضها أو جميعها مع باقي الدوائر و الأقسام.. فمثلا لو أردنا إعطاء صلاحية الوصول للطابعات داخل المؤسسة الى قسم ما من هذه الأقسام فيمكننا إعطاء موظفي هذه القسم هذه الصلاحية دونما غيرهم من موظفي باقي الأقسام وهكذا, و هذا الحال ينطبق أيضا على المجلدات المشتركة (Shared Folders) بحيث يكون لكل قسم مجلداتهم الخاصة بهم و هكذا.
الأمور التي يمكن القيام بها في LDAP ؟
يمكن من خلال هذا البروتوكول القيام بالعديد من الأمور مثل :
- البحث العناصر الموجودة (مستخدمين, مصادر, مجموعات, …..الخ).
- المقارنة أو فحص فيما إذا كان عنصر معين فيه مدخل يحوي قيمة معينّة أم لا.
- إضافة عنصر جديد.
- حذف عنصر موجود مسبقا.
- تعديل عنصر موجود مسبقا.
من الخدمات أو الخوادم التي تتعامل مع هذا البروتوكول :
- Apache Directory Server
- Red Hat Directory Server
- OpenLDAP
- Novell eDirectory
- Active Directory Microsoft
استخدامات بروتوكول LDAP في تطبيقات الويب؟
يستخدم بروتوكول LDAP في تطبيقات الويب التي تتعامل مع نظام الدخول الموحد Single Sign-on (SSO) .بحيث يكون لهذه التطبيقات بيانات دخول واحدة.
ماهو Single Sign-on أو نظام الدخول الموحد؟
SSO هي خاصية للوصول المتعدد لمجموعة من التطبيقات التي لايوجد بينها علاقة (مستقلة عن بعضها) , و نقصد بعدم وجود علاقة بينها كأن يكون نظام البريد الإلكتروني هو Microsoft Exchange Server و أحد الأنظمة و لنقل مثلا نظام خدمات الموظفين مبرمج بتقنيات أوراكل و أنظمة أخرى مثل أنظمة ادارة المحتوى للمواقع الالكترونية مبرمج بتقنية ASP.NET أو PHP, فهذه التطبيقات يتم برمجتها بشكل مستقل و عند تطبيق ال SSO و دخول أي شخص مستفيد من هذه الخدمة (SSO) الى أي تطبيق من هذه التطبيقات فإنه يصبح شخص موثوق لدى باقي التطبيقات المصرح له بالدخول عليها بدون أن يتم طلب بيانات الدخول مرة أخرى.
و من الامثلة على ذلك الخدمات التي تقدمها شركة جوجل, فمثلا لو قمت بالدخول الى بريد الإلكتروني و كنت مشترك بخدمات مثل خدمة يوتيوب و خدمة اختصار الروابط و غيرها من الخدمات فإنه و بحاول انتقالك لاي من هذه الخدمات فلن يتم سؤالك مرة أخرى عن بيانات الدخول.
لغة إستعلام بروتوكول LDAP:
يستخدم بروتوكول LDAP لغة إستعلام بسيطة جدا, فمثلا لو أردنا أن نقوم بالإستعلام عن جميع العناصر الموجودة (مستخدم, مجموعة, طابعة و غيرها) و التي تحتوي على كلمة mohammad في حقل ال givenName و الذي يعتبر الإسم الأول فإننا نقوم بكتابة الجملة التالية :
(givenName=mohammad)
* ملاحظة : الاقواس يتم وضعها لتحديد بداية و نهاية جملة الإستعلام.
في المثال السابق كانت جملة الإستعلام تحتوي على شرط واحد الا وهو الإسم الأول, فماذا لو أردنا وضع أكثر من شرط؟
اذا أردنا أن نقوم بجملة إستعلام تستعلم بالإعتماد على أكثر من شرط فإننا نقوم بوضع كل شرط على حدى و بعد ذلك نقوم بوضع نوع الشرط قبل هذه الجمل بحث أن نوع الشرط يمكن أن يكون AND أو OR .ومثال على ذلك الآتي:
المثال الأول :
لو فرضنا بأننا نريد القيام بالاستعلام عن جميع العناصر التي قيمة الخاصية الخاصة بالإسم الأول هي mohammad و موجودة في amman فإننا نقوم بكتابة الجملة كالآتي :
(&(givenName=mohammad)(l=amman))
بحيث (l=amman) هو للبحث في الخاصية الخاصة بالمنطقة Location و ال (givenName=mohammad) هي للبحث في الإسم الأول و الإشارة & هي لتطبيق الشرطين معا (و), أي بمعنى آخر يجب ان يتم ارجاع جميع العناصر التي لها هاتين الخاصيتين معا.
المثال الثاني :
لو فرضنا بأننا نريد القيام بالبحث عن العناصر التي تكون قيمة الخاصية الخاصة بالإسم الاول هي كلمة mohammad أو انه موجود في منطقة amman فإننا نقوم بكتابة جملة الإستعلام التالية :
( | (givenName=mohammad)(l=amman))
بحيث (l=amman) هو للبحث في الخاصية الخاصة بالمنطقة Location و ال (givenName=mohammad) هي للبحث في الإسم الأول و الإشارة | هي لتطبيق على أي من الشرطين (أو), أي بمعنى آخر يجب ان يتم ارجاع جميع العناصر التي لها تنطبق عليها أحد هاذين الشرطين.
المثال الثالث :
لو فرضنا بأننا نريد القيام بالبحث عن العناصر التي اسمها الأول mohammad و موجودة اما في amman أو في irbid فاننا نقوم بتكوين جملة الإستعلام التالية :
( & (givenName=mohammad) ( | (l=amman)(l=irbid)))
المثال الرابع :
لو فرضنا بأن نريد البحث عن خاصية ما و لتكن الإسم الأول بحيث تكون هذه الخاصية تحتوي على نص معين او تبدأ بذلك النص أو تنتهي به فإننا نستخدم الحرف * (النجمة).
لاحظوا معي تحتوي و ليست مساوية لقيمة معينة يعني لو فرضنا بأن النص الذي نريد البحث عنه هو amm و انه يوجد العديد من العناصر و لنقل :
ali
ahmad
mohammad
mahmoud
ammani
salem
- فلو كتبنا *amm –< فهي تعني بأننا نريد البحث عن التي ينتهي ب amm .
- ولو كتبنا amm* — < فهي تعني باننا نريد البحث عن التي تبدأ ب amm .
- ولو كتبنا *amm* — < فهي تعني البحث عن التي تحتوي على amm.
- ولو كتبنا * لوحدها –< فهي تعني ارجاع جميع العناصر التي تحتوي على هذه الخاصية.
(givenName=*amm)
(givenName=amm*)
(givenName=*amm*)
(givenName=*)
و الآن و بعد أن تعرفنا على هذا البروتوكول و كيفية الإستعلام من خلاله و استخداماته, دعونا نتعرف كيفية إستغلال ثغرة ال LDAP Injection و كيفية.
لو فرضنا وجود نموذج تسجيل دخول في موقع و هذا النموذج يتحقق من بيانات الدخول للمستخدمين من خلال الفحص داخل ال LDAP فجملة الإستعلام ستكون كالآتي :
(&(USER=$Uname)(PASSWORD=$Pwd))
وهذه الجملة تعني التحقق من كل من اسم المستخدم و كلمة المرور الموجودة في LDAP , ففي هذه الحالة هنالك عدة طرق لفحص فيما اذا كان هذا النموذج مصاب أم لا:
الطريقة الأولى :
لو أدخلنا الرمز * داخل مربع اسم المستخدم أو كلمة المرور أو كلاهما معا بحيث تصبح جملة الاستعلام كالآتي:
(&(USER=myUserName)(PASSWORD=*))
أو
(&(USER=*)(PASSWORD=myPassword))
أو
(&(USER=*)(PASSWORD=*))
في جميع الحالات السابقة ستقوم جملة الاستعلام بإرجاع بيانات وذلك لان الشرط صحيح كما ذكر سابقا في بداية هذا المقال, و بالتالي فغننا سنتجاوز نموذج الدخول
الطريقة الثانية :
لو أدخلنا في مربع إسم المستخدم (UserName) القيمة التالية مثلا :
AHMAD)(USER=ALI))
و كنا متأكدين من أن المستخدمين AHMED و ALI موجودان في ال LDAP و لكننا لا نعلم ما قيمة كلمة المرور فإن جملة الإستعلام ستصبح كالآتي :
(&(USER= AHMAD)(USER=ALI)))(PASSWORD=*))
وبما أنه لا يوجد بين الجزء الأول من الجملة و هو
(&(USER= AHMAD)(USER=ALI)))
و الجزء الثاني و هو
(PASSWORD=*))
أي من الرمزين & أو | فهذا سيؤدي الى تنفيذ الجزء الأول من الجملة و تجاهل الجزء الثاني مما يؤدي الى أن الجملة ستعيد قيمة صحيحة و ذلك لأننا كنا نعلم بأن المستخدمين AHMAD و ALI موجودان مسبقا في LDAP …
أو يمكننا حقن مربع اسم المستخدم بالقيمة التالية فيما إذا كنا نعرف مسبقا اسم مستخدم من مستخدمي النظام بحيث تكون ناتج جملة الاستعلام صحيحة :
AHMAD)(&))
بالنسبة لحقن مربع كلمة المرور فهو نادر الحقن و ذلك لأنه يتم في غالب الامرعمل HASH لكلمة المرور قبل ارسالها الى LDAP ليتم فحصها بحيث تخاف نوع ال HASH المستخدمة من خادم الى آخر فمنها ما يستخدم MD5 و منها ما يستخدم SHA وهكذا….
كيفة حماية التطبيق من LDAP Injection؟
يمكن لأي مطور مواقع ويب يتعامل مع ال LDAP حماية التطبيق الخاص به من LDAP injection عن طريق عمل تحقق على مستوى الخادم لجميع المدخلات من المتصفحين للتطبيق بحيث لا يسمح سوى للأحرف و الارقام من الإدخال…
أتمنى أن تكونوا قد استفدتم من هذا المقال و سنقوم بعمل فيديو مع مثال عملي لفحص اختبار الاختراق التطبيقات التي توجد فيها هذه الثغرة في الفترة القادمة بإذن الله تعالى ….
Anonymouxminou
أيمن خلفاتني : من الجزائر, عمري 17سنة دخلت عالم الهككر سنة 2013 وحاليا ملك الساحة الالجزائرية ختراق الشاتات الفلاشيه ، ! ، ,لدي إهتمامات اخرى منها الرياضة ، ألعاب الفيديو ، والتصميم بحد ذاته .