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

یافتن نام کاربری اعضای سایت دیگو

من حافظه ضعیفی دارم و معمولا به جای اینکه روی اون حساب کنم از lastpass استفاده می کنم. چند روز پیش به دلایلی به لستپس دسترسی نداشتم و مجبور شدم از گزینه forgot password سایت diigo استفاده کنم. بعد از وارد کردن ایمیل و سابمیت، سایت اعلام کرد که فلانی، لینک تغییر پسورد رو به ایمیلت فرستادم. اینجوری بود که فکری به سرم زد برای یافتن نام کاربری اعضای سایت دیگو.

اپلیکیشن ها و افزونه هایی مثل Awesome Screenshot، Quick Note، Read Later Fast، Diigolet و کلی سرویس دیگه از محصولات diigo است.

در تصویر زیر پاسخ سایت رو در شرایط متفاوت خواهید دید.

پیدا کردن نام کاربری و ارسال ایمیل

پیدا کردن نام کاربری و ارسال ایمیل

آدرس ایمیلی که در سایت وجود ندارد

آدرس ایمیلی که در سایت وجود ندارد

اگر source صفحه اعلام فراموشی رو نگاه کنیم با فرم زیر رو به رو می شیم.

می بینید که آدرس ایمیل در متغییری به اسم  username به آدرس زیر ارسال می شه.

من برای شبیه سازی این کار و در نهایت انجامش به صورت تکراری، از پایتون کمک گرفتم. برای ارسال اطلاعات متغیر های POST از دستور زیر کمک گرفتم.

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

با توجه به اینکه تگ strong تنها دوبار استفاده شده از اون برای جدا کردن بخشی از اطلاعات که بین تگ ها قراردارند استفاده کردم.

حالا یک function دارم که کار رو برای یک ایمیل انجام می ده. تقریبا دارم به آخر کد می رسم. حالا برای راحتی خودم، ایمیل هایی که می خوام چک کنم رو می ریزم توی یک فایل متنی. تنها شرطش اینه که هر خط شامل یک ایمیل باشه و اطلاعات و متن دیگه ای توش نباشه. (البته می تونم کمی روی کد کار کنم و از دل فایل خونده شده با هر شیوه نگارشی، ایمیل ها رو پیدا کنم.) ایمل ها رو یکی یکی از فایل می خونم و می دم به تابع و اطلاعات دریافتی رو در خروجی چاپ کرده و نیز به یک فایل اضافه می کنم.

برای تستش هم یه لیست ایمیل لازم دارم. کافیه دستم رو دراز کنم و از لیست ۱۵۰ میلیون ایمیل لو رفته ادوب استفاده کنم. ایمیل ها رو در لیستی به اسم maillist.txt کنار اسکریپت پایتون می ذارم.  در نهایت غیر از خروجی که در ترمینال نشون داده می شه، فایل out.txt نیز کنار اسکریپت ایجاد می شه و ایمیل  نام کاربری های یافته شده در اون ذخیره می شه.

آدرس پروژه در سایت github:

این مورد یک ضعف امنیتی در سایت دیگو محسوب نمی شه اما یک ضعف در حفظ اطلاعات کاربریه و می تونه منجر به انتشار اطلاعاتی بشه که در نهایت به ضرر کاربر تموم بشه. در نظر بگیرید شما با آدرس ایمیلتون در این سایت با نام کاربری ثبت نام کردید که نمی خواید کسی بدونه و دوست ندارید هرکسی این نام کاربری رو به شما ربط بده.

این مورد به اطلاع سایت diigo خواهد رسید.

به روز رسانی:
در تاریخ ۲۱ ژانویه ۲۰۱۴ به پشتیبانی سایت دیگو ایمیل زدم و موضوع رو اطلاع دادم
در تاریخ ۲۶ ژانویه پشتیبانی سایت دیگو جواب داد و گفت مشکل رو حل می کنن

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

تولید جدول برای تست

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

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

Python Testdata دقیقا برای اینکار ساخته شده. با این اسکریپت که به زبان پایتون نوشته شده می تونیم مجموعه ای از اطلاعات رو با فیلدهای خاص تولید بکنیم.

اطلاعات تولید شده فارغ از مشخصات یک دیتابیس خاص است و می تواند در دیتابیس های NoSQL نیز استفاده شود. البته امکان تولید اطلاعات متناسب با دیتابیس های مختلف نیز وجود دارد.

مثال زیر نحوه تولید جدولی با فیلدهای id، firstname، lastname، address، age و gender است. در پایان هم تعداد ردیف ها رو اعلام می کنیم که در اینجا ۱۰ است.

استاندارد
امنیت،برنامه‌نویسی

دور زدن کپچا

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

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

signup

دور زدن کپچا

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

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

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

پروسه ثبت نام دو مرحله داره:

  • بازکردن صفحه ثبت نام و دریافت فرم که شامل تصویر کپچا و کد جلوگیری از CSRF است
  • ارسال اطلاعات ثبت نام (نام کربری، پسورد و غیره) و نوشته تشخیص داده شده در تصویر

برای اینکه اسکریپت کار کنه باید ابتدا صفحه ثبت نام رو دانلود کنه، توکن (نشانه) کپچا و جلوگیری از CSRF رو پیدا کنه، تصویر کپچا رو دانلود کنه، بزرگش کنه و بده به Tesseract.

نمونه ای از پارامترهای دریافتی در صفحه ثبت نام رو در تصویر زیر می بینید:

parameters

کدی که برای مراحل بالا گفته شد با پایتون نسخه ۳.۳ نوشته شد:

در اجرای آزمایشی، کپچای زیر نشان داده شد:

captcha

و خروجی اسکریپت هم به صورت زیر شد:

outputمی بینیم که کد با موفقیت اجرا شد. حالا می تونیم با قرار دادن مراحل گفته شد در یک دور، به هر تعداد که بخواهیم کاربر در سایت ایجاد کنیم. این روش محدودیت هایی داره. برای مثال:

  • Tesseract در عمل تنها ۳۰ درصد موارد کپچا رو درست تشخیص می داده
  • سایت های دیگه ممکنه از کپچاهای پیچیده تری استفاده بکنند که درصد موفقیت رو پایین بیاره
  • محدودیت ثبت نام روزانه برای هر IP نیز می تونه وجود داشته باشه

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

استاندارد