web常见漏洞——伪随机码漏洞攻击和防御

前言

伪随机码,是程序语言生成的一定范围的一串数字字符,它的范围是可控的,可以遍历的,很多程序员在开发过程中,如果使用了伪随机数,对提交没做限制,会造成漏洞。

  • 伪随机码 结构可以预先确定,重复产生和复制,具有某种随机序列的随机特性的序列号。

  • 在 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抓包:

    Alt text

  • 测试查看后台验证码:

    Alt text

  • 穷举攻击:

    Alt text

    • tips:正常穷举范围为000000-999999,为节约时间,设置范围为460000-470000

      Alt text Alt text

防御

  1. 使用安全性高的随机码,保证随机码是唯一的。

  2. 在随用伪随机码进行程序验证时,设置提交的次数,超过指定的次数进行销毁。

  3. 在一段时间内的次数进行限定,超过无效。

Reference

网络安全渗透测试—[常规漏洞挖掘与利用篇15]—[伪随机码漏洞与测试]