الدپ (LDAP) مخفف Lightweight Directory Access Protocol است. این سرویس وظیفه ذخیرهسازی اطلاعات و مدیریت کاربران، هاستها و دیگر منابع موجود در شبکه را بر عهده دارد. حمله تزریق LDAP یک حمله سمت سرور است که همانند دیگر حملات تزریق (نظیر SQL Injection) به دلیل بررسی نکردن ورودیها در زمان برنامهنویسی و دخالت دادن مستقیم ورودیها در پرسوجوها به وجود میآید. این حمله به حملهکننده اجازه میدهد دادههای LDAP را مشاهده، حذف یا ویرایش کند.
الدپ میتواند در وباپلیکیشنها برای ورود، احراز هویت، بررسی سطوح دسترسی و حتی جستوجو اطلاعات دیگر کاربران یک سازمان استفاده شود. برای این کار وباپلیکیشنها با اتصال به الدپ و اجرای پرسوجوهای خود از الدپ خروجی میگیرند. برای مثال برای احراز هویت یک کاربر میتوان پرسوجویی نظیر عبارت زیر نوشت:
find("cn=John & userPassword=mypass")
در ادامه به بررسی مثالهایی از حملات تزریق LDAP خواهیم پرداخت:
فرض کنید یک وباپلیکیشن میخواهد با دریافت نام یک کاربر محتویات پروفایل او را نمایش دهد برای این کار پرسوجویی مشابه پرسوجوی زیر نیاز است:
searchfilter="(cn=" + user + ")"
کاربر با ارسال یک درخواست GET به آدرسی مشابه آدرس زیر متغیر user را برای وباپلیکیشن ارسال میکند:
http://www.example.com/ldapsearch?user=John
حال اگر به جای «John»، «*» را به عنوان محتویات متغیر user ارسال کنیم پرسوجو به صورت زیر در خواهد آمد:
searchfilter="(cn=*)"
واضح است که پرسوجوی بالا تمامی کاربران موجود در سیستم را لیست خواهد کرد. بنابراین اگر وباپلیکیشن مورد نظر ما در این مثال به تزریق الدپ آسیبپذیر باشد حملهکننده میتواند به راحتی همه یا قسمتی از کاربران سیستم را به دست آورد. برای تست جعبهسیاه در چنین سناریوهایی میتوان از کاراکترهای مخصوص دیگر نظیر «(»، «|» و «&» نیز استفاده کرد.
در سناریو جدید اگر وباپلیکیشن آسیپپذیر برای احراز هویت کاربران از الدپ استفاده کند، میتوان بدون دانستن رمز عبور و انجام مراحل طبیعی احراز هویت به سیستم وارد شد. در چنین سیستمهایی پرسوجوی الدپ مشابه زیر خواهد بود:
searchlogin= "(&(uid="+user+")(userPassword={MD5}"+base64(pack("H*",md5(pass)))+"))";
در این سناریو با ارسال مقادیر زیر به عنوان نامکاربری و رمز عبور:
user=*) (uid=*))(| (uid=* pass=password
پرسوجو به صورت زیر در خواهد آمد:
searchlogin="(&(uid=*)(uid=*))(|(uid=*)(userPassword{MD5}X03MO1qnZdYdgyfeuILPmQ==))";
این پرسوجو همواره صحیح است بنابراین کاربر میتواند با استفاده از ورودیهای حسابشده بدون دانستن رمزعبور به سیستم وارد شود.
سایت ringzer0team یک سایت برای تمرین و آمادهسازی تیمها برای مسابقات فتحپرچم است. با توجه به اهمیت تزریق LDAP یکی از چالشهای این سایت نیز به بررسی همین موضوع پرداخته است. در این چالش همان طور که در شکل مشاهده میشود حملهکننده باید تلاش کند بدون دانستن رمز عبور صفحه لاگین را با موفقیت submit کند. پس از ورود موفقیت آمیز سایت پرچم را در اختیار حملهکننده قرار خواهد داد:
در این چالش میتوان با نامکاربری admin و رمزعبور «*» بدون دانستن رمز عبور در سایت لاگین کرد و پرچم را دریافت نمود.
حمله تزریق الدپ در سالهای اخیر بسیار فراگیر شده است؛ دلیل فراگیری این حملات عبارت است از:
در اولین قدم برای جلوگیری از این حمله باید از چارچوبهای نرمافزاری امن و استاندارد استفاده کرد. در قدم دوم باید حتما از اعتبارسنجی مناسب ورودیها اطمینان حاصل کرد. برای این کار میتوان از ورود کاراکترهایی نظیر «*» جلوگیری کرد.