مهدی فولادگر
مهدی فولادگر
خواندن ۳ دقیقه·۶ سال پیش

تزریق LDAP

ال‌دپ‌ (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 کند. پس از ورود موفقیت آمیز سایت پرچم را در اختیار حمله‌کننده قرار خواهد داد:

صفحه چالش در سایت ringzer0team
صفحه چالش در سایت ringzer0team

در این چالش می‌توان با نام‌کاربری admin و رمزعبور «*» بدون دانستن رمز عبور در سایت لاگین کرد و پرچم را دریافت نمود.

به دست آوردن پرچم بدون داشتن نام‌کاربری و رمز عبور
به دست آوردن پرچم بدون داشتن نام‌کاربری و رمز عبور


مقابله به حمله تزریق ال‌دپ

حمله تزریق ال‌دپ در سال‌های اخیر بسیار فراگیر شده است؛ دلیل فراگیری این حملات عبارت است از:

  1. استفاده از رابط‌های نامناسب و ناامن برای تولید و استفاده از پرس‌وجوهای ال‌دپ
  2. استفاده فراگیر از ال‌دپ برای احراز هویت در اکثر سامانه‌های مدیریت متمرکز

در اولین قدم برای جلوگیری از این حمله باید از چارچوب‌های نرم‌افزاری امن و استاندارد استفاده کرد. در قدم دوم باید حتما از اعتبارسنجی مناسب ورودی‌ها اطمینان حاصل کرد. برای این کار می‌توان از ورود کاراکترهایی نظیر «*» جلوگیری کرد.

مراجع

  1. مستند OWASP؛ «OWASP Testing Guide v3»؛ صفحه ۲۴۱
  2. سایت ringzer0team
  3. سایت OWASP؛ مستند «LDAP Injection Prevention Cheat Sheet»؛ مطالعه بیشتر
امنیتldapinjection
مدیر نوآوری شرکت پیام‌پرداز، دانشجوی دکتری کامپیوتر - دانشگاه تهران
شاید از این پست‌ها خوشتان بیاید