我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
一、伪随机码漏洞与测试
1、伪随机码漏洞
(1)伪随机码的特性:
伪随机码结构可以预先确定,重复产生和复制,具有某种随机序列的随机特性的序列号。
(2)伪随机码的作用:
在WEB开发中伪随机码主要用于确定范围,例如6位数的范围是000000-999999,在这个范围内随机生成一个值。在php里就有这样的函数rand()函数
是产生随机数的一个随机函数,例如生成000000-999999内的随机数,可以这样设置rand(000000,999999)。
(3)伪随机码的应用:
在WEB安全里,用到这样的伪随机数的情形,一般都是手机获取验证码。如果这个验证码使用这种模式,我们就可以枚举所有数值进行对比,即可绕过验证。
2、伪随机码测试:6位手机验证码
(1)源码:range.php
<?php
include 'data/config.inc.php';
if($_GET['c']=='tel'){
$code = rand(000000,999999);
$tel = addslashes($_POST['tel']);
#$re = mysql_query("INSERT INTO `range` VALUES ('null', '{$email}', '{$code}')");
$result = mysql_query("select * from `moon_range` where tel = '{$tel}'");
$row =mysql_fetch_array($result);
if ($row['tel']==$tel){
$re = mysql_query("update `moon_range` set code = ${code} where id = {$row['id']}");
//每提交一次手机号后,就会更新一次随机的验证码到服务器的数据库中
//注意,有的时候更加的水,可能会在提交了手机号后,直接把验证码通过http响应头返回,可以通过开发者攻击检查哦!!!
if($re){
echo "验证码已发送";
}else{
echo "操作失败";
}
}
}
if($_GET['c']=='check'){
$code = intval($_POST['code']);
$c = mysql_query("select * from `moon_range` where code = '{$code}'");
//如果查询的在数据库中存储的随机验证码跟我们提交的验证码一致,则返回true
$row =mysql_fetch_array($c);
if($row){
echo "code 正确.";
}else{
echo "code 错误";
}
}
?>
<meta charset="UTF-8">
<h5>伪随机漏洞</h5>
<p>只能测试 13688888888</p>
<form method="post" action='?c=tel'>
请输入你的手机号码<input type='text' name='tel' value='13688888888'/>
<input type="submit" value="找回密码" name="re_password"/>
</form>
<form method="post" action='?c=check'>
验证码<input type='text' name='code'/>
<input type="submit" value="提交"/>
</form>
(2)靶机链接:
http://www.webtester.com/range.php
(3)用burpsuite穷举伪随机数:穷举手机验证码
第一步: 访问靶机链接,发现了如下所示的修改密码页面,注意此处只能使用13688888888这一个手机号来测试
如下图所示,我们访问靶机链接http://www.webtester.com/range.php
第二步: 我们点击找回密码,就会提交手机哈给range.php脚本,也就会在服务器的数据库中存储一个6位的随机码
如下图所示,我们点击了找回密码,会显示验证码已发送。根据之前的源码分析,由于点击找回密码,会提交手机号,从而就会把一个6位的伪随机码存储到数据库中。
如下图所示,我们在靶机的数据库中确实发现了一个6位的随机数960732,这里需要注意的是,我们通过之前的源码会发现,每点击一次找回密码,也就是提交一次手机号后,就会重置一次验证码!!!
第三步: 随便填入一个验证码后点击提交,抓包拦截,穷举6位手机验证码
如下图所示,我们开启了BP代理,然后输入了12346,点击提交:
如下所示,我们成功拦截到了提交的post数据包:
如下图所示,我们把拦截到的包发送到Intruder模块进行爆破6位验证码:
如下图所示,我们设置攻击者模式为Sniper,给验证码code设置为枚举变量:
如下图所示,我们设置payload为数字型,因为我们刚刚已经知道了数字是960732,为了节省时间,所以我们从960000开始爆破:
如下图所示,我们成功爆破出了6位手机验证码960732
(4)防御方法:
- 设置失败次数,超过次数后销毁数值。
- 设置提交的间隔时间。