امنیت, برنامه‌نویسی

اسکریپت ارسال ایمیل تقلبی

یک از زبان های برنامه نویسی مورد علاقه من PHP است که خب توی بحث تست نفوذ و امنیت مجازی هم خیلی کمکم می کنه. زمانی که از حمله های فیشینگ می خوندم تصمیم گرفتم چک کنم و ببینم که چطور می شه یک ایمیل فیشینگ فرستاد. این شد که در نهایت به این اسکریپت ارسال ایمیل تقلبی رسیدم.

نسخه اولیه اش رو می تونید در لینک زیر ببینید:

این نسخه کار آمد نبود و به راحتی به عنوان اسپم و یا فیشینگ شناخته می شد. بنابرای سعی کردم در مورد روش های تشخیص ایمیل های اسپم و فیشینگ مطالعه کنم و راهی برای فرار از اون روش ها در اسکریپت خودم بگنجونم.

تغییر دادن اسم فرستنده، تغییر دادن ایمیل فرستنده و جلوگیری از درج آدرس سرور در مشخصات فرستنده، گنجوندن مسیر ریپلای انتخابی و کلی مورد کوچیک دیگه.

Fake Email

در کنار تغییرات تکنیکال، سعی کردم چهره مناسبی هم به فرم بدم. استایل استفاده شده هم یه نمونه رایگان در اینترنت بود که با کمی تغییرات برای این فرم مناسب شد.

از آدرس زیر می تونید به مخزن گیتهاب این پروژه دسترسی داشته باشید.

اسکریپت رو با مجوز Creative Commons نسخه ۳ منتشر می کنم پس کپی کردن، تغییر و حتی  فروشش آزاده به شرطی که محدودیت های مجوز رو رعایت کنید.

این اسکریپت فقط جنبه آموزشی داره و من از اون علیه کسی استفاده نکردم و امیدوارم شما هم با هدف مثبت از اون استفاده کنید.

به روز رسانی: پس از کامنت مرتضی که در یک سرور، ایمیل ارسال نمی شد و پس از چک کردن موضوع متوجه شدم مشکلی در فانکشن mail در PHP وجود نداره. مشکل از ارسال متن ایمیل در Header بود. متن ایمیل رو به روش base64 رمز می کردم و به ایمیل اتچ می کردم که گویا این سرور نمی پذیرفت این مورد رو. بنابراین اسکریپت رو تغییر دادم که متن به صورت ساده ارسال بشه. می تونید از مخزن گیتهاب، نسخه جدید رو دریافت کنید.

Standard
امنیت, برنامه‌نویسی

حفره امنیتی در ای‌بی: اجرای کد از راه دور

در پست دیگه ای، به حمله تزریق کد پرداخته بودم. حالا یک کارشناس آلمانی تونسته حفره امنیتی در ای‌بی پیدا بکنه. دیوید ویرا کورتز سال پیش نیز یک ضعف امنیتی که منجر به تزریق SQL می شد در سایت eBay پیدا کرده بود.

EBay website

در ادامه مروری خواهیم کرد بر این نوشته این کارشناس.

یک درخواست قانونی شبیه این خواهد بود:

همونطور که از آدرس می شه حدس زد، با یک درخواست جستجو رو به روییم که “رشته متنی” مورد نظر از طریق متغیر q دریافت می شه. دیوید در قدم اول بررسی وب اپلیکیشن های PHP، مشکل type-cast رو چک می کنه. می دونیم که اگر متغیری از نوی string باشه ولی ورودی کاربر آرایه باشه، پی اچ پی مشکل ایجاد می کنه. برای کنترل این موضوع، آدرس زیر رو چک می کنیم:

می بینیم که سرور پاسخ مشابهی رو ارسال می کنه. بعدا به این مورد بر می گردیم.
می دونیم که پی‌اچ‌پی روش های متفاوتی برای کار با string ها داره. برای مثال اگر رشته متنی درون ” قرار بگیره (به جای ‘) در برخورد با کاراکترهای ویژه، امکان اجرای کد در شرایط خاصی به وجود میاد.

حالت هایی که امکان اجرا کد رو به وجود میاره:

  • قرار گرفتن ورودی کاربر در ” به جای ‘
  • استفاده از دستور eval برای ورودی کاربر
  • استفاده از دستور create_function برای ورودی کاربر
  • استفاده از دستور preg_replace برای ورودی کاربر (به همراه اصلاح کننده e/)
  • مقایسه رشته ای (با استفاده از <<< یا همون Heredoc) با ورودی کاربر

کدوم یک از موارد بالا در سایت eBay وجود داره؟ با توجه به اینکه تست به اصطلاح کور (blackbox) داره انجام می شه پس باید به حدس اکتفا کرد. حدس می زنیم اینجا از preg_replace برای فیلتر کردن ورودی ها استفاده شده و پس از اون از دستور eval.

چرا دیوید به این نتیجه رسیده؟

  • سایت ای‌بی از spellchecker (کنترل املا کلمات) استفاده می کنه. بسیاری از spellchecker ها از دستور eval استفاده می کنند.
  • یک سری فیلتر برای ورودی های کاربر استفاده می کنند. برای مثال وقتی کلمه secalert رو جستجو کنیم، بخش alert فیلتر شده و کلمه sec جستجو می شود. احتمالا alert رو جزو کلمات ممنوعه گذاشتن و برای جلوگیری از xss اون رو حذف کردن که البته کار اشتباهیه.

قبل از اینکه از دید یک هکر اقدام به اجرا کد کنیم، بهتره بدونیم که اگر رشته متنی درون ” قرار گرفته باشد، تجزیه شده و متغیر های درون آن شناسایی می شود.

به نظر ساده میاد. می تونیم با استفاده از ${ }  امتحان کنیم و ببینیم می تونیم دستور رو اجرا کنیم یا نه.

این کار جواب نداد و به نظر می رسه که رشته متنی رو در ” قرار نداده اند. چه کار می شه کرد؟

بذارید دوباره مروری بکنیم بر مشخصات PHP:
رشته های متنی در پی‌اچ‌پی آرایه ای از بایت ها است. بنابراین دسترسی و یا تغییر یک string با استفاده از براکت های آرایه، پارسر (تجزیه کننده) را فریب داده و منجر به اجرای کد دلبخواهی خواهد شد. مطابق اعلام سایت پی اچ پی، دسترسی و تغییر رشته متنی با استفاده از براکت، فقط در صورتیکه متن از نوع ISO-8859-1 باشد امن است.

خب حالا سعی می کنیم با ارسال آرایه به جای متن، مقادیر متفاوتی برای q به اسکریپت ارسال کنیم و نتیجه رو در صفحه ببینیم.

عمل کرد و نتیجه جستجو جواب هایی رو مطابق کلمه جستجو شده دوم یعنی sec پیدا کرد.

پیش از این حدس زدیم که از preg_replace برای فیلتر کردن کلمات ناخواسته استفاده شده و سپس روی متن به دست آمده از دستور eval استفاده می شود. چیزی که اینجا اتفاق می افته اینه که ورودی های کاربر باید از نوع string باشه و اگر از نوع دیگری بود، مثلا در اینجا آرایه، تبدیل نوع انجام شده (cast) و رشته متنی به دست آمده، با کلمات ممنوع مقایسه شده و فیلتر می گردد.

خب ببینیم چطور می تونیم استفاده کنیم از این حفره.

از مجموع بررسی های بالا استفاده می کنیم و متن جستجو رو در قالب آرایه می فرستیم و یکی از اندیس های آرایه رو  با استفاده از ${ } ارسال می کنیم تا به هدف برسیم.

و می بینیم که دستور با موفقیت انجام شد.

phpinfo

می تونیم دستورهای دیگه ای رو هم به همین طریق ارسال کنیم

phpcredit

 دیوید در این مرحله، ضعف امنیتی رو به eBay گذارش می کنه اما یک هکر می تونست با اجرای دستورات سیستمی به کل سرور دسترسی پیدا کنه. برای مثال با این دستور {${ls -al}}  می تونست لیتس از فایل ها و فولدرهای موجود در فولدر اسکریپت پی اچ پی رو ببینه.

چگونه می شه از اینجور حمله جلوگیری کرد؟

  • به هیچ عنوان از دستورات eval و create_function روی ورودی های کاربر استفاده نکنید.
  • به جای استفاده از ترکیب preg_match و اصلاح کننده e/ ، از preg_match_callback استفاده کنید.
  • اجازه استفاده از Escape sequences در ورودی های کاربر را ندهید.

منبع

Standard