本文适合刚刚学完 python,光听别人说强大,但是自己没有直观感受过的人。介绍两种防暴力破解的方法,以及用 py 的绕过方法。(暂不考虑 sql 注入,不谈机器学习。)
虽然繁琐的认证不一定意味着安全,但是方便省事的认证往往意味着不安全。
暴力破解漏洞是广泛存在的,危害较大的漏洞。虽然利用该漏洞需要付出的时间成本可能难以接受,但是如果结合社会工程学,完全可能将不能接受的时间降到可接受的范围,所以其危害不容小觑。
系统:
kali linux
软件版本:
php7 mysql5.6 python3
搭建步骤:
1、首先数据库导入 data.sql,这是所有的测试数据。
2、搭建被测试的网页用 Phpstudy 即可,把所有 php 文件放入网站根路径,确保能够正常访问。或者直接在 kali 里,比较方便,直接把这几个脚本放一块,然后在当前路径执行 php -S 127.0.0.1:80
,就完事了。Py 脚本可以随意,只要执行起来方便就行。
3、php 生成验证码需要安装 gd 扩展,python3 验证码识别,需要安装 tesseract-ocr。
4、Code.php 是生成二维码用的。
代码都做了注释,有兴趣可以看一看。
form.php
简简单单的一个带token的表单。
form.php
简简单单的又一个表单。
burteforce2.1.php
处理带 token 的登录请求的脚本
burteforce2.2.php
处理带验证码的登录请求的脚本
Code.php
生成二维码的脚本
burteforce2.1.py
暴力破解带 token 的认证
burteforce2.2.py
密码字典从 kali 里随便找一个。
测试步骤:
把文件放到网站跟路径,运行 py 脚本
一片喜闻乐见的登录失败。但是,仔细一看,其中有条结果的页面长度与其他不同
去正常登录尝试一下,admin 是 admin 的密码
测试步骤和上边没有差别,就是脚本名换了换。
防范暴力破解还有其他的办法,例如如果一个 IP 地址频繁失败登录就限制其访问,或者如果一个帐号频繁登录失败就锁定该帐号,除非再次激活,否则不能继续正常使用。
但是这两种办法都有弊端,前者可以用构建一个代理池的办法来绕过(本地不好演示),后者会影响用户的正常使用。所以说,采取何种办法来防御,需要权衡。
其实最好的办法是设置一个足够强的密码,一个系统无论打了多少补丁,按了多少个防火墙,它的密码如果是 1234, 那么一切都等于零。