CTF_Web:php伪随机数mt_rand函数漏洞

  • 0x00 问题描述
  • 0x01 mt_rand函数
  • 0x02 CTF例题
  • 0x03 php_mt_seed工具使用
  • 0x04 参考文章

0x00 问题描述

最近在题目练习的时候遇到了一个伪随机数的例子,刚好丰富一下php类型的考点梳理,主要涉及mt_rand()函数、php_mt_seed种子爆破工具的使用等内容。

0x01 mt_rand函数

mt_rand()函数

mt_rand() 函数使用 Mersenne Twister 算法生成随机整数。
使用语法:mt_rand(); or mt_rand(min,max);,生成一个区间内的随机数。
其参数min默认为最小值0max默认为可生成的随机数最大值2147483647,由mt_getrandmax()函数获得。

mt_srand()函数

mt_srand() 函数播种 Mersenne Twister 随机数生成器。
提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。当不使用随机数播种函数srand时,php也会自动为随机数播种,因此是否确定种子都不会影响正常运行。

在php中每一次调用mt_rand()函数,都会检查一下系统有没有播种。(播种为mt_srand()函数完成),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以同一个种子下,随机数的序列是相同的,这就是漏洞点,我们先看两个例子。

<?PHP
mt_srand(0);
echo mt_rand();
echo mt_rand();
echo mt_rand();
?>

在上面的代码中,我们把随机数播种为0,每次运行都会获得相同的序列,这就是伪随机:

963932192
1273124119
1535857466

当我们去掉mt_srand()函数时,再次重复运行实例,系统会自动为rand函数播种,但也是播种一次。因此多次重复运行的结果也相同,为:

992978829
928748101
1380702626

因此在知晓一串随机序列的条件下,基于序列相同的seed爆破就是可能实现的。

0x02 CTF例题

<?php
include 'flag.php';
session_start();
$_SESSION['seed'] = rand(0,999999999);
function genStr($length, $sc = FALSE) {mt_srand($_SESSION['seed']);$rand_string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";$retStr = '';for ( $i = 0; $i < $length; $i++ ){$retStr .= substr($rand_string,mt_rand(0, strlen($rand_string) - 1), 1);}if ($sc === TRUE) {setcookie('key_is', $retStr);}return $retStr;
}
if (!isset($_SESSION['flag'])) {$key = genStr(16, TRUE);$_SESSION['flag'] = genStr(32);
}
if (strlen($_GET['key']) == 32) {if ($_GET['key'] === $_SESSION['flag']) {echo $FLAGG;  //这里输出flag}else{echo "咋回事,位数对了,key值不对啊,你别想忽悠我啊!\n";}
}else {echo "亲,我要32位的key,你的key不等于32位噢!\n";
}
if ($_GET['showcode'] == 1) {highlight_file(__FILE__);
}
?>

通过上面的代码可以发现,首先使用rand(0,999999999);函数确认种子,再通过生成的随机数序列在$rand_string中确认key值的内容。且keyflag的生成均使用了同一个mt_srand()播种。并将16位的key值通过cookie传递。
因此16位序列是我们所已知的,通过F12工具抓包查看key值:

key = GgEAeCi3GWROTQXg

至此题目源码分析完毕,只需使用 php_mt_seed工具得到seed值,再次生成对应的32位flag即可。

0x03 php_mt_seed工具使用

php_mt_seed是c语言编写的爆破随机数序列种子的工具。其项目官网为:https://www.openwall.com/php_mt_seed/
github地址为:https://github.com/openwall/php_mt_seed
点击下载后,在shell中运行make命令。
程序编译完成后,使用官方文档中的使用方法:

<?php$allowable_characters = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';$len = strlen($allowable_characters) - 1;$pass = $argv[1];for ($i = 0; $i < strlen($pass); $i++) {$number = strpos($allowable_characters, $pass[$i]);echo "$number $number 0 $len  ";}echo "\n";?>

将我们的序列转换为 php_mt_seed可以识别的格式。
然后使用

./php_mt_rand 42 42 0 61  6 6 0 61  40 40 0 61  36 36 0 61  4 4 0 61  38 38 0 61  8 8 0 61  29 29 0 61  42 42 0 61  58 58 0 61  53 53 0 61  50 50 0 61  55 55 0 61  52 52 0 61  59 59 0 61  6 6 0 61

命令获得种子。 seed=368872094

最后将种子代入生成key的函数中验证。

 <?php $seed = 368872094;mt_srand($seed);$rand_string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";$retStr = '';for ( $i = 0; $i < 32; $i++ ){$retStr .= substr($rand_string,mt_rand(0, strlen($rand_string) - 1), 1);}echo $retStr;?>
//GgEAeCi3GWROTQXgEhr2jfxIDSZequqG

结果为:

key = GgEAeCi3GWROTQXg
flag = GgEAeCi3GWROTQXgEhr2jfxIDSZequqG

与我们所分析的结果相同,成功获得flag。

0x04 参考文章

php随机函数mt_rand()产生的小问题大漏洞

CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用相关推荐

  1. 用2个随机值破解PHP的MT_RAND函数

    介绍 在对一个老旧网站进行渗透测试时,我们遇到了一段很久没看过的代码: <?php function resetPassword($email) {[...]$superSecretToken ...

  2. 函数计算工具链新成员 —— Fun Local 发布啦

    刚刚,我们发布了函数计算工具链的新成员,Fun Local.欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下. Fun 是什么 Fun 是 have Fun with Serverle ...

  3. 封装一个信号量集操作函数的工具

    信号量的概念参见这里. 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm;  /* Ownership an ...

  4. php mtrand 范围,PHP mt_rand()函数

    定义和用法 函数名称中的" mt"前缀代表Mersenne Twister.的mt_rand()函数返回使用梅森倍捻机随机数发生器的方法的整数.该函数是PHPrand()函数的直接 ...

  5. 生成伪随机数的函数int rand(void)和void srand(unsigned seed);

    标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void): 从srand (seed)中指定的seed开 ...

  6. Python函数图像工具--用于更便捷地得到各种数学函数的图像信息

    宣传一哈:Python函数图像工具来啦! Python函数图像工具--用于更便捷地得到各种数学函数的图像信息 Python函数图像工具--用于更便捷地得到各种数学函数的图像信息-Python文档类资源 ...

  7. 工具 | 常用函数拟合工具(matlab)

    工具 | 常用函数拟合工具 时不时会用到线性回归,或自定义函数的拟合,做个记录备份,方便之后快速查找使用.以下记录几种matlab常用拟合工具. 1. cftool 简介 : 大杀器cftool排第一 ...

  8. 函数查找工具 —— 使用介绍

            自 v1.5 版之后更名为"函数查找工具",原名称为"栈分析工具" / "栈数据分析工具" . 工具介绍 根据gcc/mdk ...

  9. Python标准库:functools管理函数的工具

    functools管理函数的工具 functools模块提供了一些工具来调整或扩展函数和其他callable对象,从而不必完全重写. 1.修饰符 functools模块提供的主要工具就是partial ...

最新文章

  1. CYJian的新春虐题赛
  2. Golang判断元素是否存在数组中
  3. MySQL中一个双引号错位引发的血案
  4. 数据库技术:数据存储和查询知识笔记
  5. 这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了
  6. 蔡司三坐标_蔡司三坐标测针的安装指南
  7. 工作150:1、根据后台传值动态显示开关状态及文字说明(0为文字,1为图标)
  8. 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的高校运动会管理系统
  10. python rpc_对python调用RPC接口的实例详解
  11. System Verilog 线程间的通信——事件,信箱与旗语
  12. 2008年度最佳开源CMS大奖赛开幕
  13. DNS劫持和HTTP劫持有何区别
  14. 22. Window print() 方法
  15. 常用设计模式Python实现
  16. POST参数转为DICT
  17. 融合云信平台对接_java代码
  18. QT+OpenCv4编译过程,解决mingw32-make -j报错。
  19. CTF竞赛实战 中国菜刀与一句话木马
  20. 世界卫生组织关于糖尿病、眼部疾病的相关数据整理

热门文章

  1. python lexical chain
  2. input文本域选中后会出现蓝边框去除
  3. 魔百和M301H_CW代工_MV300、MV300H、310芯片通刷强刷固件及教程
  4. K3后台修改销售模块(销售订单、发货通知单、销售出库单)客户名称语句
  5. 中国饮食酒吧行业市场供需与战略研究报告
  6. 营员招募|心怀世界的AI青年们,联合国需要你为可持续发展助力!
  7. 国内P2P网贷平台的运营模式
  8. 中台战略:中台建设与数字商业
  9. MATLAB GUI设计(线性卷积和循环卷积的比较--笔记)
  10. 企业ERP应用的配套管理制度建设