暴力猜解
暴力猜解即是穷举法,穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法
防暴力猜解方法
密码的复杂性
:
毫无疑问,密码设置一定要复杂,这是最基本的,最低层的防线,密码设定一定要有策略:
①对于重要的应用,密码长度最低位6位数以上,尽量在8位数之12位数之间。
②绝不允许以自己的手机号码,邮箱等关键“特征”为密码。
③用户名与密码不能有任何联系,如用户名为“admin”,密码为 “admin7758521”。
④仅仅以上三点是不够的,比如说“12345678”、“222222222”、“11111111”这样的密码,长度够了,但是也极为危险,因为这些即为弱口令。这些密码一般都已经被收录到了攻击者的字典之中。所以就必须要增加密码的复杂性。比如以下方案:
·至少一个小写字母(a-z)
·至少一个大写字母(A-Z)
·至少一个数字(0-9)
·至少一个特殊字符(*&^%$#@!)
验证码措施
:
使用Gif动画验证码 主流验证码通过提供静态的图片,比较容易被ocr软件识别,有的网站提供GIF动态的验证码图片, 使得识别器不容易辨识哪一个图层是真正的验证码图片,可以提供清晰的图片的同时,可以更有效得防止识别器的识别。
因此,使用验证码是很好的防暴力破解的方法,只要做到以上两点,相信使用穷举法是很难破解出密码的
登陆日志
(限制登录次数)
使用登陆日志可以有效的方式暴力破解,登陆日志意为:当用户登录时,不是直接进行登陆,而是去登陆日志里面去查找,用户时候不是已经登陆错误了,还有登陆错误的次数,时间。如果连续是连续错误,将采取某种措施。
例如Oracle数据库就有一种机制,当密码输入错误三次之后,每次登陆时间间隔为10秒钟,这样就大大减少了被破解的风险,我们完全可以做到登陆第三次错误后延时10秒登陆,第四五延时15秒,这样也是一种有效的解决暴力破解的方案。
登录密码爆破属于撞库一类。通过弱口令字典暴力尝试登陆达到猜解用户密码的目的。
我们纵观全局,有登录,并且有验证码的地方,只有admin文件夹下的login.php,因此我们访问127.0.0.1/admin/login.php
进行查看。
我们可以看到,需要输入账号密码和验证码,但是我们思考,每次登录验证码都不一样。验证码我们无法猜测,那该如何进行爆破呢?
这时可以查看验证码的地址,然后对产生验证码的源码进行分析,也许可以绕过验证码进行爆破。
右键选择验证码图片,点击查看图像:
得到验证码的地址文件为:admin/captcha.php
。
因此我们现在查看captcha.php的内容:
<?php
session_start();
$rand = '';
for($i=0; $i<4; $i++){
$rand.= dechex(rand(1,15));
}
$_SESSION['captcha']=$rand;
$im = imagecreatetruecolor(100,30);
$bg=imagecolorallocate($im,0,0,0);
$te=imagecolorallocate($im,255,255,255);
imagestring($im,rand(5,6),rand(25,30),5,$rand,$te);
header("Content-type:image/jpeg");
imagejpeg($im);
?>
开启了session,随机生成了字符串,将随机生成的字符串复制到session[captcha]
里面,最后生成了一些扰乱码,加在随机生成的数字图片上。
那么生成了随机四位的验证码,如何处理呢?这时就应该查看login.php
,也就是我们刚才登陆的地方,查看其源代码:
if(@$_POST['captcha'] !== $_SESSION['captcha']){
header('Location: login.php');
exit;
}
$name = $_POST['user'];
$pass = $_POST['pass'];
$query = "SELECT * FROM admin WHERE admin_name = '$name' AND admin_pass = SHA('$pass')";
我们纵观全局,可以知道,它整体的逻辑是,判断session
与用户输入的验证码是否相同,如果相同就跳转到manage.php,如果不相同就回到login.php页面。
这时候就可以分析,这里并没有看到判断验证码是否存在的语句,只是在页面里判断了是否相等,并没有判断session是否存在,试想,如果我们不填写session,也不填写验证码,让他们都为空,null = null。这样是不是就可以绕过了?
那我们应该使用哪种方法呢?
这里使用抓包的方式,通过抓取数据包,将session和验证码删除,删除后,他们的值都为空。这样就可以绕过检测了。
下一步我们进行绕过检测。
修复代码示例
if (isset($_POST['submit']) && !empty($_POST['user']) && !empty($_POST['pass']) && !empty($_POST['captcha'])) {
include_once('../header.php');
if((@$_POST['captcha'] !== $_SESSION['captcha']) && !empty($_SESSION['captcha'])){
// $_SESSION['captcha'] = null
// $_POST['captcha'] = null
echo "captcha error";
header('Location: login.php');
exit;
}
else{
echo "captcha succeed";
}
判断captcha值是否为空,如果为空则终止循环,并报错,这样就修复了文中漏洞。