iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用
  • 129
分享到

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

webweb安全php 2023-10-02 14:10:45 129人浏览 独家记忆
摘要

CTF_WEB:PHP伪随机数mt_rand函数漏洞 0x00 问题描述0x01 mt_rand函数0x02 CTF例题0x03 php_mt_seed

CTF_WEBPHP伪随机数mt_rand函数漏洞

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()函数完成),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以同一个种子下,随机数的序列是相同的,这就是漏洞点,我们先看两个例子。

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

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

96393219212731241191535857466

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

9929788299287481011380702626

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

0x02 CTF例题

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_seedC语言编写的爆破随机数序列种子的工具。其项目官网为:https://www.openwall.com/php_mt_seed/
GitHub地址为:https://github.com/openwall/php_mt_seed
在这里插入图片描述点击下载后,在shell中运行make命令。
在这里插入图片描述程序编译完成后,使用官方文档中的使用方法:

    $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的函数中验证。

      $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()产生的小问题大漏洞

来源地址:https://blog.csdn.net/qq_35493457/article/details/124080444

--结束END--

本文标题: CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

本文链接: https://www.lsjlt.com/news/422687.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用
    CTF_Web:php伪随机数mt_rand函数漏洞 0x00 问题描述0x01 mt_rand函数0x02 CTF例题0x03 php_mt_seed...
    99+
    2023-10-02
    web web安全 php
  • php函数mt_rand怎么使用
    本篇内容主要讲解“php函数mt_rand怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php函数mt_rand怎么使用”吧!mt_rand是php4.2.0开始有的函数,该函数用于生成...
    99+
    2023-06-22
  • C语言中如何用rand()和srand()函数产生伪随机数
    这篇文章主要介绍“C语言中如何用rand()和srand()函数产生伪随机数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中如何用rand()和srand()函数产生伪随机数”文章能帮助大家解...
    99+
    2023-06-16
  • PHP怎么使用加密伪随机数生成器
    这篇文章主要介绍了PHP怎么使用加密伪随机数生成器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP的加密伪随机数生成器的使用今天我们来介绍的是 PHP 中的加密伪随机数生...
    99+
    2023-06-15
  • Python伪随机数模块random怎么用
    这篇“Python伪随机数模块random怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python伪随机数模块ran...
    99+
    2023-06-29
  • C语言中怎么利用rand()和srand()函数产生伪随机数
    今天就跟大家聊聊有关C语言中怎么利用rand()和srand()函数产生伪随机数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。rand()会返回一随机数值,范围在0至RAND_MAX...
    99+
    2023-06-17
  • python随机函数random如何使用
    Python中的随机函数random可以通过导入random模块来使用。下面是几种常见的使用方法:1. 生成一个0到1之间的随机浮点...
    99+
    2023-10-10
    python
  • C#中的随机数函数Random()怎么使用
    这篇文章主要介绍了C#中的随机数函数Random()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的随机数函数Random()怎么使用文章都会有所收获,下面我们一起来看看吧。一、常用操作NextD...
    99+
    2023-06-30
  • python如何使用choice()函数生成随机数
    小编给大家分享一下python如何使用choice()函数生成随机数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!choice(sequence)从序列中获取一个...
    99+
    2023-06-03
  • JavaScript数组常用工具函数怎么使用
    这篇文章主要讲解了“JavaScript数组常用工具函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript数组常用工具函数怎么使用”吧!一. 实现Array.isAr...
    99+
    2023-07-02
  • vscode工具函数once如何使用
    这篇文章主要介绍“vscode工具函数once如何使用”,在日常操作中,相信很多人在vscode工具函数once如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vscode工具函数once如何使用”的疑...
    99+
    2023-07-05
  • C语言使用rand函数生成随机数
    目录rand()函数函数原型:初步使用生成0到99的随机数再次运行 发现问题查看rand()函数的官方文档srand()函数srand的官方介绍初步使用srand()再次运行发现问题...
    99+
    2024-04-02
  • vscode工具函数Symbol如何使用
    这篇文章主要介绍“vscode工具函数Symbol如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vscode工具函数Symbol如何使用”文章能帮助大家解决问题。什么是Symbol?符号(S...
    99+
    2023-07-05
  • vscode工具函数idGenerator怎么使用
    这篇文章主要介绍“vscode工具函数idGenerator怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vscode工具函数idGenerator怎么使用”文章能帮助大家解决问题。vsco...
    99+
    2023-07-05
  • 使用工具深入了解 golang 函数
    通过 go tool objdump 命令可深入了解 go 函数的汇编代码,从而洞察其内部工作原理。例如,查看 strconv.parseint 源代码,了解其如何将字符串转换为 int...
    99+
    2024-05-06
    函数 golang
  • Python中的随机函数random怎么使用
    Python的random模块提供了许多随机数生成函数,可以用来生成随机数、随机选择等操作。下面是一些常用的random函数的使用方...
    99+
    2023-08-16
    Python random
  • 如何使用工具分析 golang 函数
    回答:分析 go 函数需要使用 pprof 和 flamegraph 两个工具。步骤:使用 pprof 生成性能配置文件。可视化配置文件并识别热点函数。使用 flamegraph 生成火...
    99+
    2024-05-07
    golang 函数分析
  • PHP中随机函数rand()的使用方式
    这篇文章主要讲解了“PHP中随机函数rand()的使用方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中随机函数rand()的使用方式”吧!首先二话不说,创建一个PHP示例文件dem...
    99+
    2023-06-20
  • PHP7中的伪随机数产生器CSPRNG怎么用
    这篇文章主要介绍了PHP7中的伪随机数产生器CSPRNG怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。CSPRNG 即伪随机数产生器,作为一个工具,常用的算法有 MD5...
    99+
    2023-06-14
  • Python随机函数random随机获取数字、字符串、列表等使用详解
    在python中用于生成随机数的模块是random,在使用前需要import, 下面看下它的用法。 Python随机生成一个浮点数 random.random random.rand...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作