WordPress网站安全加固

WordPress网站的安全防护措施,包括用户信息保护、暴力破解防护、XML-RPC攻击防御、文件上传安全等。

WordPress安全防护

最近发现服务器CPU占用略微比平常高,今天登上服务器top一下,看到php-fpm不时的有负载,可是我的网站有没几个人看,看一下NGINX的访问日志,发现博客站点一直有POST 请求 到我的 /xmlrpc.php 页面,搜了一下,发现这个是对word-press的一种攻击方式,xmlrpc.php 原本是Wordpress 程序留给手机APP用的一个API页面。被攻击者用来爆破后台管理密码。本来觉得,问题不大,他也不知道我用户名,任他去搞就是了,加一个Fail2ban防爆破程序,守护一下得了。结果发现word-press竟然还有泄露用户名的风险,直接访问 http://你的域名/wp-json/wp/v2/users/ 就会得到一些用户名等敏感信息,这可不得了,暴力破解的可能性一下子大了好多,在这里在提醒一下,密码一定要设置的足够复杂。解决方案

1、WordPress在账号未登录时禁用wp-json/wp/v2/,防止泄露信息

在word_press安装目录下的/wp-includes/functions.php文件里添加以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

    // 在账号未登录时禁用wp-json/wp/v2/,防止泄露信息
    add_filter( 'rest_authentication_errors', function( $result ) {
        if ( ! empty( $result ) ) {
            return $result;
        }
        if ( ! is_user_logged_in() ) {
            return new WP_Error( 'Access denied', 'You have no permission to handle it.', array( 'status' => 401 ) );
        }
        return $result;
    });

这样在未登录时就不会泄露用户名信息了。

2、查看攻击信息

导出NGINX日志分析,一开始是固定几个ip:162.213.248.98;121.5.28.65;52.17.76.233。。。后来升级成了动态ip,从21年3月到现在21年9月11,总计66000条攻击记录,分别来自11000个不同的ip地址,普通的Fail2ban已经防不住了。

3、最后解决方案:禁用 xmlrpc.php

直接删除对应文件,或者NGINX禁止访问都可以。至于有人说的封ip,这个不太靠谱,攻击者有太多的ip了,根本防不住。

2021.09.27 更新

过了一段时间又发现,wp-login.php有频繁的请求,哎,又在这暴力破解密码呢。。。给他干掉这个请求

4、防止wp-login暴力破解

在word_press安装目录下的/wp-includes/functions.php文件里添加以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

    /**
     * 登录拦截器
     */

    add_action('login_enqueue_scripts','login_protection');

    function login_protection(){ 
        if(!isset($_GET['xxx']) '' $_GET['xxx'] != '1234567890') {
    		header('Location: /'); 
    	}
    }

这样子直接访问wp-login.php就会被重定向到网站的首页啦,这样就给我们的登录页加了一层保护。上述代码中的"xxx"和"1234567890"都可以自定义,可以设置的尽量复杂一些。我们自己登录的时候,访问 “域名/wp-login.php?xxx=1234567890’’ 就可以啦

5、上传路径禁止PHP执行

别人破解我的word-press密码,肯定不是为了上来帮我写文章啦,一般来讲都是要利用文件上传,上传一个PHP木马文件,然后执行木马文件,获取服务器部分权限,word-press已经阻止了直接上传PHP文件,但是攻击者可以上传带有PHP代码的图片,在通过一些web服务器的漏洞,将图片文件当成PHP文件来执行。可以禁止上传路径执行php文件来防止入侵。将下面代码加在nginx站点配置文件内,必须在匹配PHP解析的location语句的前面添加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

        # 禁止访问 /wp-content/ 目录的 php 格式文件 (包含子目录)
        location ~* ^/wp-content/.*\.(php'phps'txt'md'exe'log)$ {
            deny all;
        }

        # 允许内部分  wp-includes 目录的 .php 文件 
        location ~* ^/wp-includes/.*\.(php'phps)$ {
            internal;
        }

        # 禁止访问 wp-config.php 文件
        location = /wp-config.php {
            deny all;
        }
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计