وردپرس به عنوان محبوبترین CMS استفاده شده برای طراحی سایت، مشکلات امنیتی دارد که همه ما از آنها آگاه هستیم. این مورد در نسخههای قدیمیتر آن بیشتر به چشم میخورد و برای رفع آن بهتر است که همیشه وردپرس را به آخرین نسخه موجود به روز رسانی نماییم. این مشکلات گاهی حتی در نسخههای جدید وردپرس نیز به چشم میخورند. در این مقاله سعی خواهیم کرد تا راههای اصلی شناسایی نقاط آسیب پذیر وردپرس را توضیح دهیم.
خیلی از مدیران وب سایت با اسکریپت وردپرس، رمز عبور سادهای را برای کاربر ادمین وردپرس انتخاب میکنند. صفحه ورود به بخش ادمین معمولاً در مسیر /wp-login.php قرار دارد. ابزارهایی وجود دارند که میتوانند به صورت خودکار به کمک یک دیکشنری حاوی رمز عبور، یا همان حملات Bruteforce برای یافتن رمز عبور ادمین وردپرس تلاش نمایند.
بیایید نگاهی بیاندازیم به کادر جست و جو که در آن میتوانیم دنبال یه string بگردیم. در تصویر زیر میبینید که ما به دنبال searchstring گشتهایم و هیچ نتیجهای پیدا نکردهایم.
حالا ببینیم چه اتفاقی می افتد اگر ما به دنبال چیزی بگردیم که کاراکترهای غیر مجاز هم داشته باشد. کاراکترهایی مانند، چپ/راست، آپاسترف و غیره.
بگذارید یک <b> را جستجو کنیم و نتیجه را ببینیم.
وقتی به دو تصویر جست و جو نگاه میکنید در ابتدا تفاوتی مشاهده نمیکنید. اما اگر با دقت نگاه کنید متوجه میشوید که جمله “The search didn’t find any search page that matched the search query.” با خط بولد نوشته شده است. چرا این گونه است؟ دلیل آن است که ما به دنبال <b> گشتهایم که داخل یک پوشش قرار نگرفته و مستقیماً داخل کد html قرار دارد. دلیل این مورد نگذاشتن درست ورودی کاربر، داخل یک حصار، توسط برنامه نویس است. از آن جایی که ما کاراکتر مخصوص گذاشتهایم، ورودی کاربر مستقیماً داخل اچ تی ام ال قرار گرفته و به کاربر بازگردانده شده است.
کاراکتر <b> داخل زبان html به معنی bold شدن یک خط از ابتدا تا انتها، توسط مرورگر وب است. در ابتدا این به نظر یک مشکل امنیتی بزرگ، نمیآید. اما ما راهی یافتهایم که بتوانیم کد را مستقیم داخل کد HTML یک صفحه قرار دهیم. این یعنی ما میتوانیم یک کد جاوا اسکریپت بنویسیم و آن را جست و جو کنیم. کد ما احتمالاً با جست و جو، مستقیماً بر روی سیستم میزبان سایت، اجرا خواهد شد.
حالا مهاجم میتواند یک لینک مخصوص ایجاد کند که شامل کد جاوا اسکریپت مخرب باشد و آن را به سمت قربانی ارسال کند. وقتی کاربر برروی لینک کلیک میکند، کد جاوا اسکریپت مخرب اجرا شده و میتواند کوکیهای بخش ارتباطی کاربر را سرقت کند که میتواند به مهاجم امکان ورود با نام کاربر را داده و در ادامه، اکانت کاربر را در دست بگیرد.
این مورد همچنین در صورتی که وب سایت، دادهها را مستقیماً داخل کوئری SQL ذخیره میکند، میتواند مشکل امنیتی برای دیتابیس سرور ایجاد کند. اگر این اتفاق بیافتد، ما میتوانیم به کل دیتابیس مورد استفاده وب سایت دسترسی داشته باشیم.
همیشه سعی نمایید که دسترسی عمومی به ایندکسها را در هر جایی که ممکن است مسدود کنید. اگر وب سرور آپاچی یا سیستم دیگری که از فایل .htaccess استفاده میکند، استفاده میکنید، این کار آسان است. فایل .htaccess را داخل فولدر اصلی سایت خود بیابید. منظور فولدری است که فایل index.php شما آن جا قرار دارد. دستور Options –Indexes را داخل فایل وارد نموده و ذخیره نمایید.
در صورتی که وب سرور شما برای کار با فایلهای PHP در زمانی با مشکل مواجه بوده است، بسیار مهم است که فولدرهایی را که تنها سرور به آنها دسترسی دارد را مسدود نمایید. اگر کد PHP بر روی مرورگر کاربر شما به جای صفحه وب مشاهده گردد ، آنها ممکن است اطلاعات دیتابیس و یا اطلاعات دیگری درباره PHP/MySQL شما بیابند. فولدر wp-includes مهمترین فولدری است که میبایست مسدود شود. برای انجام این کار در فایل .htaccess دستور زیر را وارد نمایید.
RewriteRule ^(wp-includes)\/.*$ ./ [NC,R=301,L]
اگر زیرفولدری برای wp-include وجود دارد، کد زیر را برای هر کدام از آنها داخل فایل .htaccess وارد نمایید.
RewriteRule ^(wp-includes|subdirectory-name-here)\/.*$ ./ [NC,R=301,L]
پلاگین WP-DB Manager برای تهیه بک آپ از کل سایت وردپرس شما بسیار مناسب است. این پلاگین همچنین آسیب پذیریهای وردپرس را به شما اطلاع داده و بخشهای دیتابیس را که به صورت پابلیک قابل مشاهده است را مشخص میکند. همیشه از سایت خود بک آپ تهیه نمایید تا در صورت بروز بدترین حالت نیز بتوانید سایت را به آسانی ریستور نمایید.
ابتدا میبایست نگاهی به دیتابیسهایی مانند (GHDB(Google Hacking DataBase بیاندازیم و به دنبال واژه wordpress یا چیزی مشابه آن بگردیم. با این کار چند کوئری مانند تصویر زیر مشاهده خواهیم کرد.
شما سه ستون در تصویر بالا مشاهده میکنید. ستون اول ستون Data است که اطلاعات کوئری جست و جوهای ذخیره شده در در GHDB نمایش میدهد. بعد از آن ستون Title است که کوئریهایی را که ما در واقع میبایست داخل سرچ گوگل قرار داده تا به آسیب پذیری وردپرس برسیم را نشان میدهد. بعد از آن Summery یا خلاصه است که اطلاعات کافی برای جست و جوی ستون عنوان در اینترنت را به ما میدهد.
مثال اول به دنبال فایلهای حاوی اطلاعات میگردد و از یک کوئری جست و جو filetype:avastlic استفاده میکند. این مستقیماً به به وردپرس مربوط نیست اما کوئری از یک وبلاگ وردپرس گرفته شده است. یک ورودی کاملاً مرتبط با وردپرس در زیر نشان داده شده است که به دنبال فایلهایی میگردد که شامل رمز عبور هستند.
کوئری زیر به دنبال فایلهای با پسوند SQL که شامل کلمه wp-content/backup در آدرس باشند، میگردد.
filetype:sql inurl:wp-content/backup-*
حالا بگذارید توسط کوئری جست و جوی بالا در گوگل به دنبال فایلهای حاوی رمز عبور بگردیم. نتایج جست و جوی کوئری در زیر قابل مشاهده است.
گوگل ۷.۱۷۰ نتیجه پیدا کرده است که ما میتوانیم برای یافتن رمز عبور آنها را بررسی کنیم. اگر در نتایج آن دیتابیسهای SQL جست و جو نماییم، به احتمال زیاد، چند نام کاربری و رمز عبور خواهیم یافت.
وقتی برنامهای را به یک زبان برنامه نویسی مینویسیم، میبایست از خود بپرسیم، جه مشکلات امنیتی بیشتر در زمان استفاده از این زمان بروز میکند. بنابراین اگر ما از PHP استفاده میکنیم، احتمالاً موارد SQL injection و یا XSS flaw وجود خواهند داشت. اما اگر با زبان برنامه نویسی C/C++ کار میکنیم، احتمالاً با buffer overflows و format strings رو به رو خواهیم بود.
خوب حالا چه کاری برای مقابله با آن میتوانیم انجام دهیم؟ اول از همه میبایست اطلاعات کلی در مورد این مشکل امنیتی داشته باشیم. ( بدون در نظر گرفتن این که آیا ما کد آسیب پذیر نوشتهایم یا نه ). روش اصلی برای مقابله با حملات به این صورت است: هرگز به چیزی را که از سمت کاربر میآید اعتماد نکنید. حتی اگر دیتا ورودی در حالت عادی از سمت کاربر نمیآید ( مانند یک فرم نامرئی)، این احتمالاً وجود دارد که کاربری بتواند آن را تغییر دهد. این به ما یک راهنمای خوب در زمان توسعه دادن یک برنامه میدهد.
در ادامه میبایست از خودمان بپرسیم: کدام دادههای ورودی میتوانند از سمت کاربر بیایند؟ جواب این سوال آن قدر که به نظر میرسد، آسان نیست. بعضی وقتها در واقع جواب آن به خاطر فراموش شدن امکانت مخفی که فراموش شدهاند، بسیار سخت است.
مهمترین کاری که میتوان انجام داد، بررسی تمام مسیرهای ورودی برای کاراکترهای غیر مجاز است.
در پایان، مهم نیست که تمام ورودی را بررسی و حفاظت کنیم. چون احتمالاً به دلیل این که نمیدانیم تمام ورودیهای ممکن چه میتوانند باشند، نمیتوانیم به صورت قطعی این کار را انجام دهیم. برای همین در صورتی که بتوانیم همه مقدارهای ورودی که میدانیم میتوانند از سمت یک کاربر ارسال شوند، را بررسی نماییم، در واقع توانستهایم به صورت خوبی جلوی حملات احتمالی را بگیریم.
افزونههای وردپرس که به شما توصیه میکنیم نصب نمایید، در صورتی که به خوبی استفاده شوند، میتوانند یک سایت وردپرس را به خوبی مقاوم نمایند.
۱- Exploit Scanner
هر چند وقت یک بار، این افزونه را اجرا کنید تا فعالیتهای مخرب را مشخص کند. این افزونه مستقیماً مشکل را رفع نمیکند، اما یک راهنمای رفع مشکل کامل برای شما ارائه میکند. اگر هر زمانی به هک شدن سایت خود شک دارید، وقت اجرای این افزونه است.
۲- WP security Scan
همراه با Exploit scanner شما میتوانید، این افزونه را استفاده کنید. این افزونه نه تنها دنبال مشکلات امنیتی میگردد، بلکه راههای رفع آن را به صورت دقیق ارائه میکند.
۳- Limit Login Attempts
این افزونه را تنظیم نمایید تا جلوی حملات Bruteforce را بگیرید. با این پلاگین میتوانید، ماکزیمم تعداد تلاش برای ورود را مشخص نموده و همچنین زمانی که امکان ورود برای آن آی پی قفل میشود را تعیین نمایید.
۴- Block Bad Queries ( مسدود کردن کوئریهای بد )
Block Bad Queries افزونهای است که تلاش خواهد کرد، کوئریهای مخرب را مسدود کند. این افزونه در کوئریها به دنبال Stringهای بلند مشکوک میگردد.
۵- آنتی ویروس
یک محافظ ضد بدافزار میتواند بر روی کل سایت شما به کمک افزونه Antivirus قرار گیرد. این افزونه به دنبال ویروسها، کرمها، روت کیتها و انواع دیگر بدافزار میگردد. همیشه دقت نمایید که آن را به روز رسانی کنید.