این پست در مورد یکی دیگه از اشتباهات برنامه نویسیه که می تونه نتایج مهلکی داشته باشه.
تزریق کد و تزریق دستور دو نمونه از روش های هک برنامه های تحت وبه که خیلی شبیه به هم اند و از چک نشدن ورودی ها استفاده می کنن. پیش از این در مورد چک نشدن صحیح ورودی ها گفتم. یه ضرب المثل در امنیت Web Application هست که می گه “اطلاعات ورودی کاربر غیرقابل اعتماده”.
بذارید یه سری نمونه از تزریق کد رو با هم ببینیم. فرض کنیم قراره در یک کد PHP با دریافت متغیر arg در url یه عملی روش انجام بدیم و یه خروجی برای کاربر داشته باشه.
1 2 3 | $myvar = "varname"; $x = $_GET['arg']; eval("\$myvar = \$x;"); |
همونطور که در کد بالا می بینید هیچگونه بررسی روی متغیر انجام نمی شه و مقدارش رو توی x می ریزه. نمونه ای از حمله می تونه شبیه زیر باشه
1 | /index.php?arg=1; system('ls') |
دستور سیستم در PHP یک کامند رو در سطح سیستم عامل اجرا می کنه. اینجا هکر می تونه با اجرای ls (با فرض لینوکسی بودن سرور) لیستی از فایل ها و فولدرهای فولدری که index.php قرار داره رو به دست بیاره.
بیاید دستورات PHP که می تونن در کنار “عدم بررسی ورودی” ترکیب خطرناکی رو به وجود بیارند با هم مرور کنیم.
اونهایی که کامندها رو اجرا می کنند:
1 2 3 4 5 6 7 8 | exec - Returns last line of commands output passthru - Passes commands output directly to the browser system - Passes commands output directly to the browser and returns last line shell_exec - Returns commands output `` (backticks) - Same as shell_exec() popen - Opens read or write pipe to process of a command proc_open - Similar to popen() but greater degree of control pcntl_exec - Executes a program |
و اونهایی که کدهای PHP رو اجرا می کنند:
1 2 3 4 5 6 7 8 9 10 | eval() assert() - identical to eval() preg_replace('/.*/e',...) - /e does an eval() on the match create_function() include() include_once() require() require_once() $_GET['func_name']($_GET['argument']); $func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array()); |
اینکه کدهای بالا چطور می تونه در ترکیب با کدهای دیگه و یا در یک الگوریتم اشتباه تبدیل به یک نقطه ضعف بشه خودش یه مبحث جداگانه است ولی چیزی که مهمه اینه که زمان به کار بردن این دستورات حساسیت بیشتری به خرج بدیم.
یه نمونه واقعی می تونه کد زیر باشه. می بینید که این پروژه در گیتهاب همچین ضعفی رو داره
حالا روی لوکال هاست این پروژه رو بالا میاریم و نتیجه حمله رو چک می کنیم:
کافیه یه جستجو در گیتهاب بکنیم و ببینیم چند کد مشابه پیدا می کنیم.
و در آخر هم برای اینکه بدونید یک هکر با استفاده ازاین اشتباه برنامه نویسی می تونه تا کجا پیش بره تصویر زیر رو ببینید که همین یکی دو روز اخیر گرفتم. می بینید که موفق شدم یک PHP Shell Script روی سرور آپلود کنم و از این به بعد به کل فایل های سرور دسترسی داشته باشم و کل دیتابیس رو به دست بیارم. می تونم با توجه به ویندوزی بودن سرور سعی کنم پسورد هش شده ادمین رو به دست بیارم و در صورت باز بودن پورت، باRemote Desktop Connection وارد سیستم بشم و راحت تر هر کاری رو بخوام روش انجام بدم.
اطلاعاتی که می تونست منجر به شناسایی سایت بشه رو پاک کردم و کارهای بالارو هم انجام ندادم. در تماس با مدیر سایت مشکل رو بهش اطلاع دادم.
در منابعی که لینکشون رو می ذارم می تونید اطلاعات بیشتر و نمونه های مشابه رو ببینید.
سلام هوشمند جان
یه سوال داشتم
من توی یه پرژه از دستور:
$data = preg_replace(“/[^A-Za-z0-9_.-]/”, “”, $data); #just return “A-Z”,”a-z”,”0-9″,”_-.”
برای فیلتر کردن ورودی یوزرنیم استفاده کردم
به نظر شما این میتونه خطرناک باشه؟
ممنون
یه موردی برای نام کاربری رعابت کن. ولیدیشن رو انجام بده و نتیجه رو به کاربر بگو (منظورم زمان ثبت نامه). چون ممکنه طرف یه اسمی رو انتخاب کنه و تو از دل اون رشته یه چیزی رو با pregmatch بیرو بکشی و ثبت کنی که طرف راضی نباشه
برای اینکه درست بتونم نظر بدم این بلاک از برنامه ات رو برام ایمیل کن. همین وروردی و اینکه چکارش می کنی.
بله میدونم
توی صفحه ثبت نام و لاگین با کدهای جاواسکریپت تمام ورودی ها چک میشه اگر درست بود ارسال میشه
فقط قصد من فیلتر کردن داده هایی است که اگر یکی اومد و یه جوری تونست کد جاوااسکریپت رو دور بزنه و چیزی ناخواسته ای رو ارسال کنه بشه جلوش رو گرفت.
چون شما گفتین که preg_replace میتونه کد php رو اجرا کنه گفتم شاید خطرناک باشه.
حالا security class رو که نوشتم رو برات میل میکنم یه نگاه بنداز ببین چطوره.
البته این class فقط برای فیلتر ورودی های ناخواسته هست و تمام ورودی ها با جاوا اسکریپت ولیدیشن میشه.
ممنون.
خب این خوبه که ولیدیشن رو با جاوا اسکریپت انجام می دی ولی حواست باشه که جاوا اسکریپت رو فقط برای کم کردن بار سرور و راحت کردن کاربری استفاده کنی و روش حساب نکنی.
من معمولا جاوا اسکریپت رو غیر فعال می کنم که دلیلش رو می تونی توی پست بعدی ببینی همونی که کد جاوا روی گوگل درایوه 🙂
هکرها هم که با مرورگر هک نمی کنند که جاوا اسکریپت بخواد محدودیتی واسشون باشه
البته برنامه جوریه که اگر جاوا اسکریپ غیر فعال باشه فرم سند نمیشه
ولی خوب در هر صورت میشه پیچوندش.
البته برای کاربرای عادی فکر نمیکنم مشکلی پیش بیاد حالا به نظر شما و ولیدیشن رو توی php هم انجام بدم؟
راستی class security رو که براتون میل کردم رو دیدین؟ نظرتون چی بود؟
بازم ممنون.
Pingback: حفره امنیتی در ایبی: اجرای کد از راه دور | Scriptics