前言
伪随机码,是程序语言生成的一定范围的一串数字字符,它的范围是可控的,可以遍历的,很多程序员在开发过程中,如果使用了伪随机数,对提交没做限制,会造成漏洞。
-
伪随机码 结构可以预先确定,重复产生和复制,具有某种随机序列的随机特性的序列号。
-
在 WEB 开发中,伪随机码主要用于确定范围。例如:6 位数的范围是 000000-999999, 这个范围内随机生成一个值。
-
在 php 里就有这样的函数 —— rand()函数是产生随机数的一个随机函数例。如生成 000000-999999 可以这样设置: rand(000000,999999)
<?php //伪随机数 echo rand(000000,999999) ?>
-
在 WEB 安全里用到这样的伪随机数——手机获取验证码。如果这个验证码使用这种模式,我们就可以枚举所有数值进行对比,即可绕过。
-
短信验证码漏洞靶场
以月师傅ubuntu靶场为例:
伪随机码漏洞源码分析
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']}");
if($re){
echo "验证码已发送";
}else{
echo "操作失败";
}
}
}
从源码中,看到 rand 的范围是数字类型 是可控的,可以通过遍历所有的结果进行验证,因为验证数字的过程没有任何限制,可以穷举所有的结果。
伪随机码漏洞攻击
- BP抓包:
- 测试查看后台验证码:
- 穷举攻击:
- tips:正常穷举范围为000000-999999,为节约时间,设置范围为460000-470000
- tips:正常穷举范围为000000-999999,为节约时间,设置范围为460000-470000
防御
-
使用安全性高的随机码,保证随机码是唯一的。
-
在随用伪随机码进行程序验证时,设置提交的次数,超过指定的次数进行销毁。
-
在一段时间内的次数进行限定,超过无效。