বগুড়ার একটা কৃষি-যন্ত্রপাতির ডিলার — পাওয়ার টিলার, সেচ পাম্প, থ্রেশার বিক্রি করেন, ধরা যাক নাম “মেঘনা এগ্রো”। তাঁদের ওয়েবসাইট কোনো ফ্যান্সি জিনিস না: পণ্যের ক্যাটালগ, দাম, আর একটা ফোন নম্বর। কিন্তু ওই সাইট থেকে সপ্তাহে গড়ে ৪০টা ফোনকল আসত, আর তার একটা বড় অংশ আসত রংপুর-দিনাজপুরের কৃষক আর ছোট ডিলারদের কাছ থেকে যাঁরা গুগলে “পাওয়ার টিলার দাম বাংলাদেশ” লিখে খুঁজেছেন।
গত বছরের এপ্রিলে সাইটটা হঠাৎ বন্ধ হয়ে গেল। বন্ধ মানে ৪০৪ না — হোস্টিং কোম্পানি অ্যাকাউন্ট সাসপেন্ড করে দিয়েছে, কারণ ম্যালওয়্যার স্ক্যানে সাইট ধরা পড়েছে। ছয় দিন সাইট বন্ধ ছিল। মালিক ফোনে প্রথম যে কথাটা বললেন, “ভাই, আমরা তো কিছুই করিনি, সাইট তো ছয় মাস ধরে ছুঁয়েও দেখিনি।” সেটাই তো সমস্যা ছিল।
প্রথম যে অনুমানগুলো ভুল ছিল
সবাই ধরে নিয়েছিল কেউ অ্যাডমিন পাসওয়ার্ড অনুমান করে ঢুকেছে। তাই প্রথমে পাসওয়ার্ড বদলানো হলো, একটা সিকিউরিটি প্লাগিন বসানো হলো, লগইন URL লুকানো হলো। দুই দিন পরে সাইট আবার একই কায়দায় হ্যাক হলো — মোবাইল থেকে ঢুকলেই একটা জুয়ার সাইটে রিডাইরেক্ট, ডেস্কটপ থেকে ঢুকলে সব স্বাভাবিক। এই মোবাইল-অনলি রিডাইরেক্ট জিনিসটাই একটা বড় ইঙ্গিত: আক্রমণকারী চায় সাইটের মালিক যেন কিছু টের না পায়।
যখন পাসওয়ার্ড বদলেও হ্যাক ফিরে আসে, তখন বুঝতে হবে ঢোকার দরজাটা লগইন পেজ ছিলই না। দরজাটা ছিল ফাইল সিস্টেমে, আর সেটা খুলেছিল ইনস্টলেশনের সময়েই — বছর ছয়েক আগে।
cPanel-এ ঢুকে যা পাওয়া গেল
ফাইল ম্যানেজার খুলে এক মিনিটের মধ্যেই ছবিটা পরিষ্কার হলো। public_html-এর ভেতরে WordPress ছিল, ভালো কথা। কিন্তু সেই সঙ্গে ছিল আরও দুটো ফোল্ডার:
/old— ২০১৯ সালের একটা সাইট, মালিকের ভাগ্নে বানিয়েছিলেন। WordPress ৫.৪, কেউ কোনোদিন আপডেট করেনি।/new— ২০২৩ সালে এক ফ্রিল্যান্সার রিডিজাইন করতে গিয়ে টেস্ট ইনস্টল বসিয়েছিলেন, কাজ শেষ না করেই যোগাযোগ বন্ধ করে দেন।- মূল সাইট রুটে — ২০২১ সালের একটা লোকাল আইটি দোকানের বানানো সাইট, এটাই লাইভ।
তিনটা আলাদা WordPress ইনস্টলেশন, তিনটা ডেটাবেস, কিন্তু একটাই cPanel ইউজার। SSH দিয়ে এক লাইনেই ব্যাপারটা দেখা যায়: find /home/user -name wp-config.php — তিনটা রেজাল্ট। বেশিরভাগ ছোট ব্যবসার সার্ভারেই এই কমান্ডটা চালালে মালিকের অজানা অন্তত একটা ইনস্টল বেরিয়ে আসে।
আক্রমণটা আসলে কোন দরজা দিয়ে ঢুকেছিল
/old ফোল্ডারের ইনস্টলটায় ২০১৯ সালের একটা প্রিমিয়াম থিম ছিল, আর তার সঙ্গে বান্ডেল করা একটা পুরনো স্লাইডার প্লাগিন — যেটার একটা সুপরিচিত arbitrary file upload দুর্বলতা আছে, বহু বছর ধরেই আছে। বট প্রতিদিন ইন্টারনেট স্ক্যান করে ঠিক এই জিনিসটাই খোঁজে। কেউ “মেঘনা এগ্রো”-কে লক্ষ্য করে হামলা করেনি; একটা স্বয়ংক্রিয় স্ক্রিপ্ট দরজা খোলা পেয়ে ঢুকে পড়েছে।
এরপর যা হয়েছে সেটাই আসল শিক্ষা। বট /old/wp-content/uploads/-এ একটা PHP শেল আপলোড করেছে। এখন কথা হলো, ওই শেল তো পুরনো সাইটের ভেতরে — লাইভ সাইটের কী ক্ষতি? ক্ষতি এই যে তিনটা ইনস্টলই একই cPanel ইউজারের অধীনে ছিল। মানে PHP প্রসেসটা একই ইউজার হিসেবে চলে এবং একই ইউজারের সব ফাইলে লিখতে পারে। শেল থেকে দুটো কাজ হয়েছে: লাইভ থিমের header.php-তে একটা মোবাইল-ডিটেকশন রিডাইরেক্ট বসানো, আর wp-content/mu-plugins/-এ একটা ফাইল রাখা যেটা প্রতিবার নিজেকে ফিরিয়ে আনে। এজন্যই পাসওয়ার্ড বদলে কোনো লাভ হয়নি।
এক সাইট, এক অ্যাকাউন্ট — নিয়মটা কেন এত জরুরি
“আনলিমিটেড” হোস্টিং প্যাকেজ (তাঁদের ক্ষেত্রে বছরে ১,৯০০ টাকা) মানুষকে একটা ভুল অভ্যাস শেখায়: এক অ্যাকাউন্টে যত খুশি সাইট বসাও। কিন্তু এক cPanel ইউজারের ভেতরে বসানো সাইটগুলো একে অন্যের প্রতিবেশী নয়, একে অন্যের রুমমেট। একটার দুর্বলতা মানেই সবগুলোর দুর্বলতা। আপনার সবচেয়ে সুরক্ষিত সাইটও ততটাই নিরাপদ যতটা ওই একই অ্যাকাউন্টে পড়ে থাকা সবচেয়ে অবহেলিত ইনস্টলটা।
টেস্ট বা স্টেজিং সাইট লাইভ সাইটের সাবফোল্ডারে বসাবেন না। আলাদা অ্যাকাউন্ট নিন, নয়তো হোস্টের স্টেজিং ফিচার ব্যবহার করুন, আর কাজ শেষ হলে সেটা মুছে ফেলুন — “পরে কাজে লাগতে পারে” ভেবে রেখে দেওয়া ইনস্টলই ছয় মাস পরে আপনার দরজা খুলে দেয়।
পরিষ্কার করা নয়, নতুন করে ইনস্টল করা
অনেকে ম্যালওয়্যার ক্লিনার প্লাগিন চালিয়ে সংক্রমিত ফাইল মুছে খুশি হন। আমরা সেই পথে যাইনি, কারণ একবার শেল ঢুকলে আপনি কোনোদিন নিশ্চিত হতে পারবেন না ঠিক কতগুলো ব্যাকডোর বসেছে। সময় নষ্ট না করে একদম নতুন ইনস্টলেশন করা হলো, আর পুরনো সাইট থেকে শুধু যা আসলেই দরকার সেটুকু নেওয়া হলো:
- ডেটাবেস থেকে শুধু পোস্ট, পেজ, প্রোডাক্ট আর ফর্ম-এন্ট্রি টেবিলগুলো — সেগুলোও স্ক্যান করে,
wp_posts-এর ভেতর ঢোকানো স্ক্রিপ্ট ট্যাগ খুঁজে বের করে uploadsফোল্ডারের ছবি — তবে শুধু ছবি; ভেতরে কোনো.phpফাইল থাকলে সেটা যে ম্যালওয়্যার, তাতে কোনো সন্দেহ নেই- থিম আর প্লাগিন এক লাইনও পুরনোটা থেকে নেওয়া হয়নি — সব অফিসিয়াল রিপো থেকে নতুন করে নামানো
ফ্রেশ WordPress কোর নামিয়ে ইনস্টল করতে WP-CLI দিয়ে চার-পাঁচ মিনিট লেগেছে, হাতে ক্লিক করলে আধঘণ্টা। কমান্ডগুলো সোজা: wp core download --version=latest, তারপর wp config create (এখানেই আলাদা DB ইউজার আর নতুন সল্ট বসে), তারপর wp core install। এই তিন লাইনেই একটা পরিষ্কার WordPress ইনস্টলেশন দাঁড়িয়ে যায় — কোনো এক-ক্লিক ইনস্টলারের বান্ডেল করা বাড়তি প্লাগিন ছাড়া।
ইনস্টলের দিনেই যেগুলো ঠিক করা হয়েছিল
- প্রতিটা ডেটাবেসের জন্য আলাদা ইউজার, আর সেই ইউজারের কেবল ওই একটা ডেটাবেসে অনুমতি। পুরনো সেটআপে একটাই ইউজার দুটো ডেটাবেসে ছিল — কেন, তা কেউ ব্যাখ্যা করতে পারেনি।
- অ্যাডমিন ইউজারের নাম
adminনয়, আর ইমেইল ব্যবসার ডোমেইনের — ভাগ্নের জিমেইল নয়, যেটায় এখন আর কারও অ্যাক্সেস নেই। wp-config.php-এdefine('DISALLOW_FILE_EDIT', true);— ড্যাশবোর্ড থেকে থিম-ফাইল এডিট করার সুযোগ বন্ধ। হ্যাকার লগইন পেলে এই এডিটরই তার সবচেয়ে সহজ অস্ত্র।- কোর আর সিকিউরিটি আপডেট অটোমেটিক চালু, আর মেজর আপডেটের আগে স্টেজিংয়ে পরীক্ষা। “আপডেট দিলে সাইট ভেঙে যাবে” ভয়ে আপডেট বন্ধ রাখাই এখানে ছয় বছর ধরে চলছিল।
- ব্যাকআপ সার্ভারের বাইরে — প্রতিদিন একবার গুগল ড্রাইভে। একই সার্ভারে রাখা ব্যাকআপ সার্ভার সাসপেন্ড হলে আপনার কোনো কাজেই আসে না, যেটা এই ছয় দিনে হাড়ে হাড়ে টের পাওয়া গেছে।
- ফাইল পারমিশন: ফোল্ডার ৭৫৫, ফাইল ৬৪৪, আর
wp-config.php৬৪০। uploads ফোল্ডারে PHP এক্সিকিউশন বন্ধ করতে সেখানে একটা ছোট.htaccessনিয়ম বসানো হয়েছে — ঠিক যে কাজটা করলে ওই শেলটা কোনোদিন চলতেই পারত না।
খরচ আর ফলাফল
ছয় দিনের ডাউনটাইমে তাঁরা আনুমানিক ২৪০টা ফোনকল হারিয়েছেন, যেগুলোর মধ্যে সাধারণত ২৫-৩০টা বিক্রিতে রূপ নিত। মৌসুমের ঠিক মুখে — অর্থাৎ বছরের সবচেয়ে খারাপ ছয় দিন। এর তুলনায় খরচগুলো হাস্যকর রকমের ছোট: নতুন হোস্টিং প্যাকেজ বছরে ৬,৫০০ টাকা (এবার এক অ্যাকাউন্টে একটাই সাইট), ইনস্টলেশন আর মাইগ্রেশন এককালীন, আর ব্যাকআপে মাসে শূন্য টাকা।
সাইট নতুন করে দাঁড়ানোর পর PHP ৭.৪ থেকে ৮.২-এ যাওয়া হয়েছে, আর ছয় বছরের জমা আবর্জনা (তিনটা এসইও প্লাগিন একসাথে, দুটো ক্যাশ প্লাগিন পরস্পরের সঙ্গে লড়াই করছে) সরে যাওয়ায় মোবাইলে হোমপেজ লোড ৪.৮ সেকেন্ড থেকে ১.৬ সেকেন্ডে নেমেছে। ভালো WordPress ইনস্টলেশনের একটা বাড়তি পুরস্কার এটাই — নিরাপত্তা আর গতি আসলে একই মুদ্রার দুই পিঠ।
সবচেয়ে দামি বাক্যটা এই কেসে ছিল: “ওটা তো পুরনো সাইট, ওটা তো কেউ ব্যবহার করে না।” সার্ভারে পড়ে থাকা কোনো WordPress ইনস্টল কখনোই নিষ্ক্রিয় নয় — আপনি ব্যবহার না করলেও বট করে।
এই ঘটনার পর যা সবচেয়ে বেশি জিজ্ঞেস করা হয়েছে
আমার সার্ভারে ভুলে যাওয়া ইনস্টল আছে কি না, বুঝব কীভাবে? cPanel-এর ফাইল ম্যানেজারে গিয়ে দেখুন public_html-এর ভেতরে কোনো ফোল্ডারে wp-admin আছে কি না। SSH থাকলে find . -name wp-config.php চালান। আর MySQL ডেটাবেসের তালিকা দেখুন — যত ডেটাবেস, তত সম্ভাব্য ইনস্টল।
এক হোস্টিং অ্যাকাউন্টে দুটো সাইট রাখলেই কি হ্যাক হবে? নিশ্চিতভাবে নয়, তবে ঝুঁকিটা যোগ হয়, গুণ হয় না — একটা সাইটের দুর্বলতা অন্যটার ফাইল খুলে দেয়। দুটো সাইটই যদি আপনি নিয়মিত আপডেট করেন, ঝুঁকি কম। বাস্তবে দ্বিতীয় সাইটটা মানুষ ভুলে যায়, আর সেখানেই বিপদ।
এক-ক্লিক ইনস্টলার (Softaculous) ব্যবহার করা কি খারাপ? ইনস্টলার নিজে খারাপ না, দ্রুতও বটে। সমস্যা হলো ডিফল্টগুলো — অটো-আপডেট বন্ধ থাকা, দুর্বল অ্যাডমিন নাম, ব্যাকআপ না থাকা। ইনস্টলার ব্যবহার করলেও ইনস্টলের পরের দশ মিনিট আপনাকেই খরচ করতে হবে।
হ্যাক হওয়া সাইট প্লাগিন দিয়ে পরিষ্কার করলে হয় না? ছোট সংক্রমণে হয়। কিন্তু ব্যাকডোর বসে গেলে নিশ্চয়তা পাওয়ার একমাত্র উপায় হলো নতুন ইনস্টল, আর কেবল কনটেন্ট ফিরিয়ে আনা। এক দিনের ঝামেলা, কিন্তু ঘুম ফিরে আসে।
আপনার সাইটে যদি বছরখানেক হাত না পড়ে থাকে, একবার সার্ভারে উঁকি দিয়ে দেখুন কয়টা WordPress ইনস্টল আসলে পড়ে আছে। স্ট্যাক অ্যালিক্স ইনস্টলেশন অডিট, পরিষ্কার সেটআপ আর নিয়মিত রক্ষণাবেক্ষণ — তিনটাই করে দেয়, যাতে মৌসুমের মুখে সাইট বন্ধ হয়ে না যায়। দরকার হলে নক করবেন।

