关于wordpress后台admin密码防爆破的一些操作
密码破解,这包含了攻防两端考量以及操作,就像你有导弹,我就有反导弹系统,你有反导弹系统,我就有反反导弹系统。彼此追赶,互相博弈当中,都在提升自己的能力。当然了,我们反对研制武器用于战争,就像反对掌握技术用于破解一样。
昨天还在与一个朋友讨论关于验证码破解的问题,他兴奋的与我说,发现小米账号的验证码只有四位数,也就是说你随便输入一个手机号,比如雷军的手机号(当然需要你先知道雷军的手机号),然后直接去或许验证码进行登陆,四位数的数字组合就是 101010*10,也就是一万种可能而已,通过通过脚本把这一万种可能全部走一遍,理论上就应该可以登陆你的账号了的。
当然这种漏洞都是非常低级而且人家也不可能不做限制的。说起限制也是非常简单,可以对同一 ip 请求次数的阈值设置进行相关策略制定,可以对同一账号登陆总是失败(据此判断可能是在进行破解)的次数设置阈值然后设置多长时间内不许再登陆。这些都是值得了解的,而我之前对这方面了解着实不多。
比如如下表述就是引自一篇所谓破解的文章内容:
首先要说一下,一个正常点的网站,你用暴力破解登录的话,都是几乎无法实现的,举个例子。
举个暴力破解 QQ 的例子:
- \1. 你暴力破解 QQ 密码,输入错误几次之后验证码也出来了。验证码出来了就无法使用暴力破解了,
- \2. 验证码的问题比较好搞,找个识图的代码,识别图片中的二维码,即可。继续破解。
- \3. 是的 二维码可以搞定,但是你输入错误次数超过 30 次之后,该账号 24 小时内再提交密码都无效了。
举个我自己亲测暴力破解 wordpress 站点管理员密码的例子:
我穷举 wordpress 的账户密码,post 到 xxx.com/wp-login.php 上,结果:没几下我就发现网站打不开了。然后,用同事们的机器,也是打不开,我以为网站挂了,结果不是,我发现用 3G 网可以打开。看样 wordpress 直接屏蔽了我们的 ip 段,一个小时后又可以访问了。 所以我放弃了,对 wp-login.php 的破解。
从上边的话里,可以看出网络安全问题如果我们自己不关注,那么可有很多人都是密切关注着呢。
使用 wordpress 部署博客,平常就会遇到不少的攻击爆破等问题。
我就经常碰到,每当遇到之后我就心想,爆破吧,攻击吧,反正就是这么一个内容性的站点,并没有特别富裕价值的东西,或许攻击一会儿也就不再执着了罢。事实上之前也都是这样的,有一些破解大概就那么几次,十几次,最多几十次不得了了,然而面对那种无休无止,成百上千次的对后台密码进行破解的,就有些烦了。
终于,在我看到邮箱收到三四百封邮件之后,不能忍了。
一看到这种堆积式的错误登陆,不用多想,肯定是在被爆破了。
随便点击一个进去看看,尝试的用户名密码时间以及来源 ip 都非常清楚。
看一眼这个 ip。
总之很讨厌,这次我也不想忍受这种攻击了,准备着手来对这些爆破的同学采取一些小政策了。
首先当然是百度一波先看看有没有特别给力的插件之类的,转了一圈发现没有什么好用的,策略上大概也就那么几种:
- 1,通过检测对可疑 ip 进行封禁。
- 2,通过对一些后台以及登陆的 url 进行重定向。
- 3,插件控制。
因为插件基本上都是英文的,也就没有尝试这个。我通过一篇文章尝试了第二种的办法,https://www.waitalone.cn/wordpress-adminpage-deny-brute-force.html。
# 1,网上的一种办法。
办法就是在主题的 functions.php 中加入如下代码:
add_action('login_enqueue_scripts','cracker');
function cracker(){
if($_GET['access']!= '1111') header('Location:http://blog.eryajf.net/');
}
2
3
4
请自行更改 1111 为自己的密码,然后把后面的 eryajf.net 的 URL 更改为你的博客域名。
如此一来,当你访问后台 admin 的时候会跳转到首页,真正访问登陆页面的时候则需要访问 http://blog.eryajf.net/wp-login.php?access = 您的密码 (opens new window)
这样或许不无不可,但是经过我的体验感觉有时候会影响一些正常的访问,因此也放弃了这种办法,决定自己来搞一搞。
# 2,自己用的办法。
对于那些爆破我们的,就应该毫不留情直接关小黑屋里。
因此我在 nginx 下边做了拒绝访问
的策略,一旦你触及我的底线,不好意思,小黑屋有请。
我想大家应该都知道在配置 nginx 的虚拟主机的时候,一般把配置文件一个一个单独放在一个目录下,然后在 nginx 的默认配置文件
当中进行include
调用。
include vhost/*.conf;
注意这条调用指令写在server区域之外http区域之内
。
接着我就在vhost
目录下创建了一个hei.conf
的文件。
[root@long vhost]$cat hei.conf
deny 91.210.145.28 ;
deny 51.38.224.237 ;
2
3
书写格式也就这样,把做坏事儿的 ip 扔进配置文件里边,然后让 nginx 加载一下,对方再想来攻击你,那就还它一个 403 看看。
注意这个地方我在写规则的时候 ip 与后边的分号有一个空格的,这样并不影响使用,也是为了方便后边脚本的使用。
上边两个 ip 就是因为不老实然后就被关进小黑屋了的。
既然已经确立使用这种方案了,那么接下来就通过对日志的分支,利用脚本,把这些事情自动给他完成了。
脚本如下:
#!/bin/bash
set -e
Log=/var/log/nginx/error.log
File=/usr/local/nginx/conf/vhost/hei.conf
fip=`grep wp-login.php $Log | awk '/error/{ip[$36]++;}END{for (i in ip){if (ip[i]>20){print i}}}' | awk -F "," '{print $1}'`
for i in $fip
do
a=`awk -v i=$i '$2==i{print}' $File | wc -l`
if [ "$a" -ne 0 ]
then
echo "服务器安全" &> /dev/null
else
echo "deny $i ;" >> $File
/usr/local/nginx/sbin/nginx -s reload
fi
done
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
简单说明一下脚本
:
- 第六行:在错误日志当中取出登陆次数超过 20 次的失败者的 ip。
- 第十行:逐个判断此 ip 是否已经在小黑屋里关着。如果已经有了,那么服务器是安全的,如果没在,那么将之请进小黑屋当中,然后让 nginx 重新加载一下配置。
写完之后,如果在你的系统中已经有类似的 ip 了,可以执行一波进行测试,看看是否已将其送往小黑屋成功。 这个地方,如果日志逐渐变大,那么可以利用脚本进行一下切割,还是很有必要的。
随后把这个脚本放进定时任务当中,自己随便定义多久执行一次就好了。
*/5 * * * * /bin/bash /opt/hei.sh
最后,还是想说一下,所有进行暴力破解的,无不是从一些非常基础简单的密码开始的,如果我们被爆破没几下就守不住了,那只能说,该换密码了。事实上,我所使用的密码,是一个我自己也记不住的,一个由工具自动生成的密码,总之,密码复杂一点,总是没有错的。