Unhacking a WordPress site

This is an INCOMPLETE guide, but a good starting point! It doesn't cover removing malicious code inserted into the database, for instance.

WordPress gets hacked - a lot. And the correct solution is to restore your database and filesystem from backup. However, sometimes we deal with sites that weren't responsibly managed, and that's not an option. Here's a guide on what to do.

First - if it IS an option, delete your WordPress filesystem and restore from known good files. There's just too many ways to obfuscate a hack, so these approaches are necessarily incomplete.

Not every instance of these commands is malicious! However, a hacked site will often use these, so look at what comes after them. If it's a long base64 block, that's bad news.

Note that there are MANY ways to obscure the commands above. Here are some example strings you can also search for

"base" . "64_decode" 
eval/*

That last one's tricky. It found this command: eval/*boguscomment*/('malicious_command').

That evaluates to:

<?php eval(get_option("render")); ?>

This indicates that there's malicious code in your database, and this minimal change allows the code to render.

Here's the commands I used to remove that from my entire codebase:

find -name \*php -exec sed -i 's/<?php eval(get_option("\\x72\\x65\\x6e\\x64\\x65\\x72")); ?>//g' {} \;
find -name \*.html -exec sed -i 's/<?php eval(get_option("\\x72\\x65\\x6e\\x64\\x65\\x72")); ?>//g' {} \;

From when Highlander was hacked:

If the site is hacked (note that I wrote these fast and before my vacation... they should probably be updated and my guess is this process can be refined)

  1. Confirm that the site is hacked or being actively attacked
  2. If the site is compromised, ssh into the site
  3. Go to the web root directory and vim .htaccess
  4. uncomment line 94 and change it with your ip so it should like this.
    Require ip your.ip.goes.here  another.ip.goes.here
  5. Save the htaccess file and confirm that only the required ips can access the site.
  6. Login into the site; you should be able to find login information via bitwarden.
  7. Goto plugins
  8. activate Wordfence Security and run the malware scan
    1. this may take some time to complete.
    2. there will be some red herrings, such as un updated files.
  9. If you find something confirm that the it's a hacked file...
    1. When you ssh into the root directory, run git status to see if any files have been changed.
    2. If the same file pops up, the site might be compromised.
  10. If the site is indeed compromised. clean up up the bad files.
  11. Check the database for compromised data.
  12. First check if there were new users created:
      wp user list --role=administrator --format=table 
  13. If there bogus users, you'll need to delete them either through the wp cli or through web admin panel.
  14. Check for bogus post data
  15. If there is bogus data it's best to go into updraft plus and revert to the last clean back-up
  16. You may want to change passwords at this point for users.
  17. If that worked you can change the .htaccess file back by commenting out line 94
  18. Confirm that the site is working for all.
  19. Continue to monitor the site for a few days