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

تزریق دستور و کد

این پست در مورد یکی دیگه از اشتباهات برنامه نویسیه که می تونه نتایج مهلکی داشته باشه.

تزریق کد و تزریق دستور دو نمونه از روش های هک برنامه های تحت وبه که خیلی شبیه به هم اند و از چک نشدن ورودی ها استفاده می کنن. پیش از این در مورد چک نشدن صحیح ورودی ها گفتم. یه ضرب المثل در امنیت Web Application هست که می گه “اطلاعات ورودی کاربر غیرقابل اعتماده”.

بذارید یه سری نمونه از تزریق کد رو با هم ببینیم. فرض کنیم قراره در یک کد PHP با دریافت متغیر arg در url یه عملی روش انجام بدیم و یه خروجی برای کاربر داشته باشه.

همونطور که در کد بالا می بینید هیچگونه بررسی روی متغیر انجام نمی شه و مقدارش رو توی x می ریزه. نمونه ای از حمله می تونه شبیه زیر باشه

دستور سیستم در PHP یک کامند رو در سطح سیستم عامل اجرا می کنه. اینجا هکر می تونه با اجرای ls (با فرض لینوکسی بودن سرور) لیستی از فایل ها و فولدرهای فولدری که index.php قرار داره رو به دست بیاره.

بیاید دستورات PHP که می تونن در کنار “عدم بررسی ورودی” ترکیب خطرناکی رو به وجود بیارند با هم مرور کنیم.

اونهایی که کامندها رو اجرا می کنند:

و اونهایی که کدهای PHP رو اجرا می کنند:

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

یه نمونه واقعی می تونه کد زیر باشه. می بینید که این پروژه در گیتهاب همچین ضعفی رو داره

01what-is-pino

حالا روی لوکال هاست این پروژه رو بالا میاریم و نتیجه حمله رو چک می کنیم:

02-rce-pino

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

و در آخر هم برای اینکه بدونید یک هکر با استفاده ازاین اشتباه برنامه نویسی می تونه تا کجا پیش بره تصویر زیر رو ببینید که همین یکی دو روز اخیر گرفتم. می بینید که موفق شدم یک PHP Shell Script روی سرور آپلود کنم و از این به بعد به کل فایل های سرور دسترسی داشته باشم و کل دیتابیس رو به دست بیارم. می تونم با توجه به ویندوزی بودن سرور سعی کنم پسورد هش شده ادمین رو به دست بیارم و در صورت باز بودن پورت، باRemote Desktop Connection وارد سیستم بشم و راحت تر هر کاری رو بخوام روش انجام بدم.

rce

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

در منابعی که لینکشون رو می ذارم می تونید اطلاعات بیشتر و نمونه های مشابه رو ببینید.

منبع / منبع / منبع / منبع

Standard

6 thoughts on “تزریق دستور و کد

  1. آرمین says:

    سلام هوشمند جان
    یه سوال داشتم
    من توی یه پرژه از دستور:
    $data = preg_replace(“/[^A-Za-z0-9_.-]/”, “”, $data); #just return “A-Z”,”a-z”,”0-9″,”_-.”
    برای فیلتر کردن ورودی یوزرنیم استفاده کردم
    به نظر شما این میتونه خطرناک باشه؟
    ممنون

    • هوشمند says:

      یه موردی برای نام کاربری رعابت کن. ولیدیشن رو انجام بده و نتیجه رو به کاربر بگو (منظورم زمان ثبت نامه). چون ممکنه طرف یه اسمی رو انتخاب کنه و تو از دل اون رشته یه چیزی رو با pregmatch بیرو بکشی و ثبت کنی که طرف راضی نباشه
      برای اینکه درست بتونم نظر بدم این بلاک از برنامه ات رو برام ایمیل کن. همین وروردی و اینکه چکارش می کنی.

  2. آرمین says:

    بله میدونم
    توی صفحه ثبت نام و لاگین با کدهای جاواسکریپت تمام ورودی ها چک میشه اگر درست بود ارسال میشه
    فقط قصد من فیلتر کردن داده هایی است که اگر یکی اومد و یه جوری تونست کد جاوااسکریپت رو دور بزنه و چیزی ناخواسته ای رو ارسال کنه بشه جلوش رو گرفت.
    چون شما گفتین که preg_replace میتونه کد php رو اجرا کنه گفتم شاید خطرناک باشه.
    حالا security class رو که نوشتم رو برات میل میکنم یه نگاه بنداز ببین چطوره.
    البته این class فقط برای فیلتر ورودی های ناخواسته هست و تمام ورودی ها با جاوا اسکریپت ولیدیشن میشه.
    ممنون.

    • هوشمند says:

      خب این خوبه که ولیدیشن رو با جاوا اسکریپت انجام می دی ولی حواست باشه که جاوا اسکریپت رو فقط برای کم کردن بار سرور و راحت کردن کاربری استفاده کنی و روش حساب نکنی.
      من معمولا جاوا اسکریپت رو غیر فعال می کنم که دلیلش رو می تونی توی پست بعدی ببینی همونی که کد جاوا روی گوگل درایوه 🙂
      هکرها هم که با مرورگر هک نمی کنند که جاوا اسکریپت بخواد محدودیتی واسشون باشه

  3. آرمین says:

    البته برنامه جوریه که اگر جاوا اسکریپ غیر فعال باشه فرم سند نمیشه
    ولی خوب در هر صورت میشه پیچوندش.
    البته برای کاربرای عادی فکر نمیکنم مشکلی پیش بیاد حالا به نظر شما و ولیدیشن رو توی php هم انجام بدم؟
    راستی class security رو که براتون میل کردم رو دیدین؟ نظرتون چی بود؟
    بازم ممنون.

  4. Pingback: حفره امنیتی در ای‌بی: اجرای کد از راه دور | Scriptics

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.