IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用 -> 正文阅读

[PHP知识库]CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-13 22:06:44  更:2022-04-13 22:09:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 12:26:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码